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
intSW95=7;
2
intSW130=6;
3
intLED093=5;
4
intLED9496=4;
5
intLED97130=3;
6
intHEAT=2;
7
intbuttonState1=0;
8
intbuttonState2=0;
9
intTMP36=A0;//Der Sensor soll am analogen Pin A0 angeschlossen werden. Wir nennen den Pin ab jetzt "TMP36"
10
intsensorwert;
11
inttemperatur=0;//Unter der Variablen "temperatur" wird später der Temperaturwert abgespeichert.
12
intt=500;//
13
14
voidsetup(){
15
pinMode(HEAT,OUTPUT);
16
pinMode(SW95,INPUT_PULLUP);
17
pinMode(SW130,INPUT_PULLUP);
18
Serial.begin(9600);
19
}
20
21
voidloop()
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
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.
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.
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.
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.
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.
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/
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.
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
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.
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
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 ....
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.
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.
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.
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.
EAF schrieb:> Alle mit Verstand, dort, bleiben auf Distanz,
Verstehe. Gerade mein zuletzt gepostetes Zitat eines
Users von dort hatte mich Anderes vermuten lassen ....
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.
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.
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?
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.
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.
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.