Forum: Mikrocontroller und Digitale Elektronik Arduino UNO Output LED flackert


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Jikksaw (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag ich bin neu hier.
Da ich bei einem Projekt nicht weiterkomme muss ich hier nachfragen.
Meine Espressomaschine bekommt eine PID Regelung mit 
Temperaturüberwachung über drei LED`S o.ä.

Zwei Schalter: SW95 für bis 95°C und SW130 bis 130°C (Dampf), Schalter 
SW95 wird einzeln gedrückt und heizt auf, Schalter SW95 und SW130 müssen 
beide aktiviert werden um auf 130°C aufzuheizen (Das Ursprungsbild der 
Maschine soll erhalten bleiben, daher die Schaltsequenz)

Jetzt Flackert leider die "HEAT" LED, also die Heizspirale, beim 
einschalten von SW95 lediglich. Sie soll aber leuchten und konstant 3 V 
liefern.

Ich finde im Code leider keinen Fehler mehr obwohl bestimmt einer 
versteckt ist.
Vielen Dank im Voraus
1
int SW95 = 7;
2
int SW130 = 6;
3
int LED093 = 5;
4
int LED9496 = 4;
5
int LED97130 = 3;
6
int HEAT =  2;
7
int buttonState1 = 0;
8
int buttonState2 = 0;
9
int TMP36 = A0; //Der Sensor soll am analogen Pin A0 angeschlossen werden. Wir nennen den Pin ab jetzt "TMP36"
10
int sensorwert;
11
int temperatur = 0; //Unter der Variablen "temperatur" wird später der Temperaturwert abgespeichert.
12
int t=500; //
13
14
void setup() {
15
  pinMode(HEAT, OUTPUT);
16
  pinMode(SW95, INPUT_PULLUP);
17
  pinMode(SW130, INPUT_PULLUP);
18
  Serial.begin(9600);
19
}
20
21
void loop()
22
  {
23
    sensorwert=analogRead(TMP36); //Auslesen des Sensorwertes.
24
  temperatur= map(sensorwert, 0, 410, -50, 150); //Umwandeln des Sensorwertes mit Hilfe des "map" Befehls.
25
  delay(t); // Nach jeder Messung ist je eine kleine Pause mit der Dauer „t“ in Millisekunden.
26
  Serial.print(temperatur); //Nun wird der Wert „temperatur“ über die serielle Kommunikation an den PC gesendet. Durch öffnen des seriellen Monitors in der Arduino-Software kann die Temperatur abgelesen werden.
27
  Serial.println(" Grad Celsius"); // Im seriellen Monitor wird hinter der Temperatur die Einheit eingeblendet.
28
  
29
    buttonState1 = digitalRead(SW95); //Heizstab wird bis 96°C ein-/ oder ausgeschaltet
30
    buttonState2 = digitalRead(SW130); //Heizstab wird bis 130°C ein-/ oder ausgeschaltet
31
  if
32
    (buttonState1 == LOW&&temperatur<=96)//Heizstab heizt bis "temperatur<=96", >96=OFF
33
    {
34
    digitalWrite(HEAT, HIGH);
35
    } 
36
    else
37
    {
38
    digitalWrite(HEAT, LOW);
39
    }
40
    if
41
    (buttonState1 == LOW&&buttonState2 ==LOW&&temperatur<=123)//Heizstab heizt bis "temperatur<=96", >96=OFF
42
    {
43
    digitalWrite(HEAT, HIGH);
44
    } 
45
    else
46
    {
47
    digitalWrite(HEAT, LOW);
48
    }
49
    if
50
    (temperatur<=50) // Grüne LED093 leuchtet von 0-93°C
51
    {
52
  digitalWrite(LED093, HIGH);
53
    }
54
    else
55
    {
56
    digitalWrite(LED093, LOW);
57
    }
58
    if
59
    (temperatur>=50&&temperatur<=96)// Gelbe LED9496 leuchtet von 94-96°C
60
    {
61
  digitalWrite(LED9496, HIGH);
62
    }
63
    else
64
    {
65
    digitalWrite(LED9496, LOW);
66
    }
67
    if
68
    (temperatur>=110&&temperatur<=124)// Rote LED97130 leuchtet von 97-130°C
69
    {
70
  digitalWrite(LED97130, HIGH);
71
    }
72
    else
73
    {
74
    digitalWrite(LED97130, LOW);
75
    }
76
}

von J. S. (jojos)


Lesenswert?

Jikksaw schrieb:
> Guten Tag ich bin neu hier.

Dann bitte erstmal lesen was über der Texteingabe steht, wie C-Code 
formatiert wird bzw längerer Code gepostet werden soll.
So ist es zu mühselig das Gewusel zu lesen.

von Jikksaw (Gast)


Lesenswert?

Hallo, danke für den Hinweis. Jetzt ist es "schön" VG

von Forist (Gast)


Lesenswert?

Jikksaw schrieb:
> Jetzt ist es "schön"

Was ist an kunterbunten Einrückungen "schön"?
Und der Lesbarkeit ist es auch nicht zuträglich ...

von EAF (Gast)


Lesenswert?

Jikksaw schrieb:
> Ich finde im Code leider keinen Fehler mehr obwohl bestimmt einer
> versteckt ist.

Leider kann ich dein Programm nicht lesen/verstehen.

Mir sind das zu viele if mit zu vielen Bedingungen.
Ich rate dir zu endlichen Automaten.
Und zu mehr Modularität.
Das schafft Übersicht.

von breitspurverweigerer (Gast)


Lesenswert?

Jikksaw schrieb:
> Jetzt ist es "schön"

Nein. So ein Code ("längerer") gehört als Anhang gepostet.

von Helmut H. (helmuth)


Lesenswert?

Jikksaw schrieb:
> Jetzt Flackert leider die "HEAT" LED

Laut Schaltplan ist HEAT an RX , das ist normalerweise der Input für die 
serielle Schnittstelle. Im Programm ist es PIN 2, das ist laut 
Schaltplan LED9396.

von DomeG (Gast)


Lesenswert?

Unabhängig vom Code: verwendest du keine Vorwiderstände für die LEDs?

von noiasca (Gast)


Lesenswert?

es fehlen eine Reihe von

pinMode(HEAT, OUTPUT);

für deine LEDs.

von Hubert G. (hubertg)


Lesenswert?

Wenn beide Schalter gelegt sind sind auch beide if-Abfragen aktiv.

von Jikksaw (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, das ist korrekt. In der Praxis verwende ich natürlich 
Vorwiderstände. In der Praxis ist es genau so aufgebaut wie im Anhang. 
Habe den Anhang nochmal aktualisiert. Danke für die Antworten....und ja 
der Code ist sehr sehr unvorteilhaft geschrieben mit den ganzen IF`s 
aber ich bin NOCH nicht so bewandert.

von Helmut H. (helmuth)


Lesenswert?

Jikksaw schrieb:
> aber ich bin NOCH nicht so bewandert.

Hubert G. schrieb:
> Wenn beide Schalter gelegt sind sind auch beide if-Abfragen aktiv.
1
if  (buttonState1 == LOW && temperatur <= 96)   {
2
    digitalWrite(HEAT, HIGH);
3
}  else  {
4
    digitalWrite(HEAT, LOW);
5
}
6
7
if  (buttonState1 == LOW && buttonState2 == LOW && temperatur <= 123)   {
8
    digitalWrite(HEAT, HIGH);
9
}  else  {
10
    digitalWrite(HEAT, LOW);
11
}

Angenommen buttonState1 ist LOW und buttonState2 ist HIGH und temperatur 
ist 50.
Dann schaltet HEAT beim ersten if auf HIGH und gleich danach beim 
zweiten if wieder LOW.

EAF schrieb:
> Ich rate dir zu endlichen Automaten.

: Bearbeitet durch User
von breitspurverweigerer (Gast)


Lesenswert?

Jikksaw schrieb:
> In der Praxis ist es genau so aufgebaut wie im Anhang.

Dann ist es falsch, du brauchst für alle LEDs Vorwiderstände.

von Jikksaw (Gast)


Lesenswert?

Guten Abend,
ich habe den Sketch nochmal Überarbeitet, verkürzt und auch einen 
anderen Fühler eingebaut. Ampel Temperaturüberwachung im Loop 
funktioniert. Temperatur wird ausgelesen und kann für weitere Funktionen 
verwendet werden. Alle LED`S haben Vorwiderstände.

Es besteht leider noch immer das Problem dass wenn:
1. SW95 EIN > HEAT LED keine 3 Volt (Flimmern)
2. SW95 + SW130 EIN > HEAT LED hat 3 Volt (kein Flimmern)

Im 1. Fall flimmert die LED Heat im Loop Takt des "delay (1000)"

Im zweiten IF "digitalWrite(buttonState1, LOW);" sollte dieser Behel 
eigentlich den SW95 deaktivieren damit die beiden sich nicht in die 
quere kommen. Ich kann es leider nicht komplementieren

Danke im Voraus
1
// this example is public domain. enjoy! https://learn.adafruit.com/thermocouple/
2
3
#include "max6675.h"
4
int buttonState1;
5
int buttonState2;
6
int HEAT =  13;
7
int rot = 3;
8
int gelb = 4;
9
int gruen = 5;
10
int SW130 = 6;
11
int SW95 = 7;
12
int thermoDO = 8; //Kabel grün
13
int thermoCS = 9; //Kabel blau
14
int thermoCLK = 10; //Kabel gelb
15
int temperatur;
16
17
18
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
19
20
void setup() {
21
  pinMode(HEAT, OUTPUT);
22
  pinMode(gruen, OUTPUT);
23
  pinMode(gelb, OUTPUT);
24
  pinMode(rot, OUTPUT);
25
  pinMode((thermoCLK, thermoCS, thermoDO), INPUT);
26
  pinMode(SW95, INPUT_PULLUP);
27
  pinMode(SW130, INPUT_PULLUP);
28
  Serial.begin(9600);
29
  Serial.println("MAX6675 test");  
30
  delay (1000);
31
}
32
33
void loop() {
34
  
35
  Serial.print(thermocouple.readCelsius());
36
  Serial.println(" °C");
37
  delay (1000);  
38
  temperatur= thermocouple.readCelsius(); 
39
  buttonState1=digitalRead(SW95); // Espressobezug;
40
  buttonState2=digitalRead(SW130); // Dampfbezug;
41
  digitalWrite(gruen, HIGH == temperatur<=22);
42
  digitalWrite(gelb, HIGH == temperatur>=23&&temperatur<=25); // Brühtemperatur;
43
  digitalWrite(rot, HIGH == temperatur>=26); // Dampftemperatur;
44
  
45
    if (buttonState1 == LOW&&temperatur<=25)
46
    {
47
    digitalWrite(HEAT, HIGH);
48
    } 
49
    else
50
    {
51
    digitalWrite(HEAT, LOW);
52
    }
53
    if (buttonState2 == LOW&&temperatur<=30)
54
    {
55
    digitalWrite(buttonState1, LOW);
56
    digitalWrite(HEAT, HIGH);
57
    } 
58
    else
59
    {
60
    digitalWrite(HEAT, LOW);
61
    }
62
    }

von EAF (Gast)


Lesenswert?

Jikksaw schrieb:
> pinMode((thermoCLK, thermoCS, thermoDO), INPUT);

Eigentlich eine gute Idee, aber funktionieren tut das so nicht.
Aktiviere mal die Warnungen, dann haut dir der Compiler das um die 
Ohren.

von Jikksaw (Gast)


Angehängte Dateien:

Lesenswert?

Danke, sowas hört man gerne!
Aber leider wird keine Fehlermeldung angezeigt. Ich kann den Sketch ja 
auch ohne weiteres auf den Arduino UNO laden und den Temperaturfühler 
"stimulieren" :D. Die Ampel und das ein- und ausschalten der HEAT LED 
funktionieren in Abhängigkeit der Temperaturen.
Aber wie beschrieben hat die HEAT LED und somit irgendwann das SSR (1. 
SW95 EIN > HEAT LED keine 3 Volt (Flimmern)) nicht konstant 3 Volt. 
Sondern Flimmert im Takt des delay. Wenn ich das delay verkürze leuchtet 
Sie; aber nicht mit 3 Volt konstant sondern eben im 5ms Takt etc

von uff basse (Gast)


Lesenswert?

Jikksaw schrieb:
> pinMode((thermoCLK, thermoCS, thermoDO), INPUT);

Das sollen garantiert nicht alles Inputs sein!
Es müssen drei einzelne pinMode sein da die Pins auf
unterschiedlichen Ports liegen können und unterschiedliche
Datenrichtung haben sollen.

von Jikksaw (Gast)


Lesenswert?

Für diesen Typ Fühler (MAX6675), der die Temperaturdaten digital sendet, 
sind tatsächlich drei Eingänge vorgesehen (siehe Variablen oben).
Abgeleitet habe ich es durch in Zeile 18 MAX6675 thermocouple(thermoCLK, 
thermoCS, thermoDO); den ich aus dem Internet habe.

Ich vermute eher der Fehler liegt im Loopteil

von uff basse (Gast)


Lesenswert?

Jikksaw schrieb:
> Für diesen Typ Fühler (MAX6675), der die Temperaturdaten digital sendet,
> sind tatsächlich drei Eingänge vorgesehen (siehe Variablen oben).

Jikksaw schrieb:
> Guten Tag ich bin neu hier.

Aha, also nicht nur neu hier, sondern auch beratungsresistent.

Jikksaw schrieb:
> Abgeleitet habe ich es durch in Zeile 18 MAX6675 thermocouple(thermoCLK,
> thermoCS, thermoDO); den ich aus dem Internet habe.

Na dann, werde glücklich mit deiner Kreation.
Zunächst legst du ein Objekt thermocouple an, und danach ver-
gewaltigst du seine Verbindungen auf Inputs. Na toll ....

von EAF (Gast)


Lesenswert?

Jikksaw schrieb:
> Aber leider wird keine Fehlermeldung angezeigt.
1
E:\Programme\arduino\portable\sketchbook\sketch_dec12d\sketch_dec12d.ino: In function 'void setup()':
2
E:\Programme\arduino\portable\sketchbook\sketch_dec12d\sketch_dec12d.ino:20:12: warning: left operand of comma operator has no effect [-Wunused-value]
3
   20 |   pinMode((thermoCLK, thermoCS, thermoDO), INPUT);
4
      |            ^~~~~~~~~
5
E:\Programme\arduino\portable\sketchbook\sketch_dec12d\sketch_dec12d.ino:20:33: warning: right operand of comma operator has no effect [-Wunused-value]
6
   20 |   pinMode((thermoCLK, thermoCS, thermoDO), INPUT);
7
      |                                 ^~~~~~~~
8
E:\Programme\arduino\portable\sketchbook\sketch_dec12d\sketch_dec12d.ino: In function 'void loop()':
9
E:\Programme\arduino\portable\sketchbook\sketch_dec12d\sketch_dec12d.ino:35:41: warning: suggest parentheses around comparison in operand of '==' [-Wparentheses]
10
   35 |   digitalWrite(gruen, HIGH == temperatur<=22);
11
      |                               ~~~~~~~~~~^~~~
12
E:\Programme\arduino\portable\sketchbook\sketch_dec12d\sketch_dec12d.ino:36:40: warning: suggest parentheses around comparison in operand of '==' [-Wparentheses]
13
   36 |   digitalWrite(gelb, HIGH == temperatur>=23&&temperatur<=25); // Brühtemperatur;
14
      |                              ~~~~~~~~~~^~~~
15
E:\Programme\arduino\portable\sketchbook\sketch_dec12d\sketch_dec12d.ino:37:39: warning: suggest parentheses around comparison in operand of '==' [-Wparentheses]
16
   37 |   digitalWrite(rot, HIGH == temperatur>=26); // Dampftemperatur;
17
      |                             ~~~~~~~~~~^~~~

von M. K. (sylaina)


Lesenswert?

Jikksaw schrieb:
> digitalWrite(buttonState1, LOW);

Na wenn das mal wirklich richtig ist, ich habe da Zweifel ;)

von uff basse (Gast)


Lesenswert?

Jikksaw schrieb:
> Aber leider wird keine Fehlermeldung angezeigt.

Wieder ein Hinweis auf Beratungsresistenz.´

EAF schrieb:
> Aktiviere mal die Warnungen, dann haut dir der Compiler das um die
> Ohren.

von Jikksaw (Gast)


Lesenswert?


von uff basse (Gast)


Lesenswert?

Der Hinweis auf Beratungsresistenz war dann wohl zuviel des
Guten für den User Jikksaw (jikksaw). Denn der hat sich bereits
in Wohlgefallen aufgelöst. Auch die guten Ratschläge bzw.
Hinweise waren wohl zuviel für ihn.

von Moko (Gast)


Lesenswert?


von MaWin (Gast)


Lesenswert?

Jikksaw schrieb:
> Meine Espressomaschine bekommt eine PID Regelung

Wo ist da eine PID-Regelung?

von uff basse (Gast)


Lesenswert?

Moko schrieb:
> Nein, es geht nebenan weiter.

Da wird's noch lustiger. Die Tips qualifiziert.

>>Dein Flackern wird u.a. durch dein delay() hervor gerufen.
>>Das solltest du entfernen und evtl. durch eine Funktion mit
>>millis() aufbauen.
>>Sieh dir dazu das Beispiel BlinkWithoutDelay in der IDE an.

von EAF (Gast)


Lesenswert?

uff basse schrieb:
> Da wird's noch lustiger.

Glaube ich nicht.

Alle mit Verstand, dort, bleiben auf Distanz, die haben durchaus 
erkannt, welches Geistes Kind der Kunde ist.

von uff basse (Gast)


Lesenswert?

EAF schrieb:
> Alle mit Verstand, dort, bleiben auf Distanz,

Verstehe. Gerade mein zuletzt gepostetes Zitat eines
Users von dort hatte mich Anderes vermuten lassen ....

Beitrag #7285254 wurde von einem Moderator gelöscht.
von Stefan F. (Gast)


Lesenswert?

EAF schrieb:
> HIGH == temperatur>=23&&temperatur<=25

Auch wenn diese Ausdrücke im Moment das erwartete Ergebnis bringen, kann 
ich nur dringendst davon abraten, denn sie provozieren unerwartete 
Ergebnisse bei künftigen Programmänderungen.

Wenn man die Rangfolge der Operatoren berücksichtigt, kommt dabei 
nämlich folgendes heraus:

> (HIGH == (temperatur>=23)) && (temperatur<=25)

Du willst den Pin auf HIGH setzen, wenn die Temperatur im Bereich 
23...25 Grad liegt. Also müssten die Klammern korrekterweise so gesetzt 
werden:

> HIGH == ((temperatur>=23) && (temperatur<=25))

Als nächstes kommt der Vergleich mit HIGH. Es macht keinen Sinn, das 
Ergebnis des Temepratur-Checks mit HIGH zu vergleichen. Der Check 
liefert entweder ein TRUE oder FALSE zurück. TRUE ist bereits HIGH, und 
FALSE ist LOW.

Generell gilt die Empfehlung, alle Compiler-Warnungen zu aktivieren und 
in Ordnung zu bringen, bevor man versucht, Fehler im eigenen Code zu 
erkennen. Denn genau dazu dienen die Warnungen: Mögliche Fehler oder 
irreführende Konstrukte zu erkennen.

von uff basse (Gast)


Lesenswert?

Stefan F. schrieb:
> Auch wenn diese Ausdrücke .....
> ...............

Die hier Beteilgten wissen das, nur der TO nicht, aber der
interessiert sich dafür nicht mehr denn er hat sich bereits
in Wohlgefallen aufgelöst (---> User not found).

Aber Hauptsache ist dass du wieder überall deinen Senf
dazugeben kannst.

von EAF (Gast)


Lesenswert?

Stefan F. schrieb:
> EAF schrieb:
>> HIGH == temperatur>=23&&temperatur<=25
>
> Auch wenn diese Ausdrücke im Moment das erwartete Ergebnis bringen, kann
> ich nur dringendst davon abraten, denn sie provozieren unerwartete
> Ergebnisse bei künftigen Programmänderungen.

Warum kritisierst du mich dafür?
Spielst du wieder den Terrorvogel?

von Stefan F. (Gast)


Lesenswert?

EAF schrieb:
> Warum kritisierst du mich dafür?

Die Message war an den TO gerichtet. Ich kritisiere seinen Code.

von EAF (Gast)


Lesenswert?

Stefan F. schrieb:
> Die Message war an den TO gerichtet.

Wenn du mich zitierst, dann ist die Nachricht auch an mich gerichtet!

Solltest du den Zusammenhang nicht verstehen, bist du dumm.
Da ich nicht davon ausgehe, dass du dumm bist, muss ich das als Absicht 
anerkennen.
Und dann bist du ein Terrorvogel.

von uff basse (Gast)


Lesenswert?

Stefan F. schrieb:
> Die Message war an den TO gerichtet.

Der TO hat sich in Luft aufgelöst, ist nicht mehr da! Ich
habe es bereits zweimal erwähnt. Senf-Plapperer.

von Stefan F. (Gast)


Lesenswert?

EAF schrieb:
> Wenn du mich zitierst, dann ist die Nachricht auch an mich gerichtet!

Wow, bist du egozentrisch. Ich habe Quelltext vom TO (bzw. Teile der 
Warnmeldungen deines Compilers) zitiert, nicht dich.

Wie ist das, wenn man überall böse Absichten wittert und die dann auf 
sich selbst bezieht? Wird man dabei nicht verrückt? Deine Wortwahl (von 
wegen Terror) ist es jedenfalls.

von EAF (Gast)


Lesenswert?

Stefan F. schrieb:
> nicht dich.

Lüge!
Du hast mich zitiert!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.