Arduino UNO Output LED flackert

Gast #7283228
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
}
Angehängte Dateien:
Gast #7283277
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.
Gast #7283312
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.
Angehängte Dateien:
#7283335
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.
Gast #7284492
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
    }
Gast #7284582
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
Angehängte Dateien:
Gast #7284621
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
Gast #7284638
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 ....
Gast #7284646
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
      |                             ~~~~~~~~~~^~~~
Gast #7284779
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.
Gast #7285066
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.
Beitrag #7285254 wurde von einem Moderator gelöscht.
Gast #7285281
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.
Gast #7285302
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.
Gast #7285304
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?
Gast #7285322
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.
Gast #7285344
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren