Arduino Zeitschaltung von werten.
-
Guten Abend @wob,
ja ich gebe gerne viele Kommentare, liegt wohl daran, das ich schon sehr lange an dem Programm bastel mit einigen Pausen dazwischen. Wenn ich dann wieder anfange, hilft es mir schon, wenn ich meine Kommentare lese (klar alles was doppelt untereinander ist könnte weg). Ich habe einfach noch zu wenig Ahnung von der Sache und zu große Pausen.
Für jemanden der es gelernt hat ist es sicher nicht nötig.@wob sagte in Arduino Zeitschaltung von werten.:
Hier zum Beispiel:
int einstellungtemptag = analogRead(15); //lesen des Potis mit der Solltemperatur für Tag
finde ich den Kommentar sinnvoll. Andererseits: was ist die 15? Könntest du nicht aus der 15 eine benannte Konstante machen? Sowas wie const int POTI_TEMP_SOLL = 15;? Und dann wird der Kommentar auch vielleicht überflüssig. Generell: aussagekräftiger Code ist besser als Kommentare.
15 ist der Ausgang am Arduino, der ist so beschriftet, daher habe ich es einfach so gemacht. Das habe ich nur für Versuchszwecke mit rein gemacht, da das Ziel ist alles mit einem Nextion zu steuern (das wird sicherlich nochmal so spannend wie das Projekt bis hier hin).
-
Ist dir auch aufgefallen, daß
Durchschnitttemp < solltemptag
zweimal dasteht undDurchschnitttemp > solltemptag+2
auch zweimal dasteht?-->
if (Durchschnitttemp < solltemptag) { Heizungon = true; Heizungoff = false; } if (Durchschnitttemp > solltemptag + 2) { Heizungon = false; Heizungoff = true; }
Spätestens jetzt sollte Dir klar sein daß eine der beiden Variablen
Heizungon
undHeizungoff
unnötig ist weil eine genau die logische Negation der anderen ist:if (Durchschnitttemp < solltemptag) { Heizungon = true; } if (Durchschnitttemp > solltemptag + 2) { Heizungon = false; }
Aber immer noch die selbe Frage: Was ist mit
Heizungon
wenn beide Bedinungen nicht zutreffen? Welchen Wert hatHeizungon
dann? Zur Erinnerung: Du hast geschrieben@Ben sagte in Arduino Zeitschaltung von werten.:
bool Heizungon;
Was anderes:
if (Durchschnitttemp < solltemptag) { // Heizung einschalten digitalWrite(A10, HIGH); digitalWrite(A9, LOW); } else if (Durchschnitttemp > solltemptag + 2) { // Heizung ausschalten digitalWrite(A10, LOW); digitalWrite(A9, HIGH); } else { ; // garnix, lass die Heizung in dem Zustand in dem sie ist. }
verstehst Du das?
-
@Ben sagte in Arduino Zeitschaltung von werten.:
15 ist der Ausgang am Arduino, der ist so beschriftet, daher habe ich es einfach so gemacht. Das habe ich nur für Versuchszwecke mit rein gemacht, da das Ziel ist alles mit einem Nextion zu steuern (das wird sicherlich nochmal so spannend wie das Projekt bis hier hin).
Dann nenn das Ding doch bitte nicht
15
sondernAUSGANG_XY_DER_FUER_FOOBAR_ZUSTAENDIG_IST
. Wie auch schon @wob sagte. Dann ist es selbsterklärend und braucht keinen Kommentar. Und sollte sich der Wert einmal ändern so muss er nur an einer Stelle geändert werden und nicht an X Stellen. Magic number (programming) - Unnamed numerical constants.
-
Hallo @Swordfish
@Swordfish sagte in Arduino Zeitschaltung von werten.:
Ist dir auch aufgefallen, daß
Durchschnitttemp < solltemptag
zweimal dasteht undDurchschnitttemp > solltemptag+2
auch zweimal dasteht?Ja, das habe ich bewusst gemacht, einmal für Heizungon und einmal für Heizungoff. Falsch?
@Swordfish sagte in Arduino Zeitschaltung von werten.:
Spätestens jetzt sollte Dir klar sein daß eine der beiden Variablen Heizungon und Heizungoff unnötig ist weil eine genau die logische Negation der anderen ist:
Das war mir nicht klar, was passiert mit dem Wert wenn er nicht zutrifft. Vielen Dank dafür.
@Swordfish sagte in Arduino Zeitschaltung von werten.:
Aber immer noch die selbe Frage: Was ist mit Heizungon wenn beide Bedinungen nicht zutreffen? Welchen Wert hat Heizungon dann? Zur Erinnerung: Du hast geschrieben
Ich denke jetzt mal schriftlich: Ich muss in einem Wert ein = (Temperatur passt mit Soll und Ist zusammen) mit rein bringen, damit es keinen Wert ohne Befehl gibt.
@Swordfish sagte in Arduino Zeitschaltung von werten.:
Was anderes: verstehst du das?
Ich versuche es zu erklären:
if ( ist das so wie gewünscht, mache dass was darunter steht. Wenn nicht gehe weiter zu
else if und konntrolliere das ob es stimmt, wenn ja mache dass was darunter steht, wenn nicht weiter zu
else und mache das was da steht.Hoffe es ist verständlich.
-
@Ben sagte in Arduino Zeitschaltung von werten.:
Falsch?
Unnötig.
Zu dem anderen Zeugs:
int foo; int bar = 42; if (bar == 13) foo = 2; printf("%d\n", foo);
Was gibt dieser Code aus? Welchen Wert hat
foo
?
@Ben sagte in Arduino Zeitschaltung von werten.:
@Swordfish sagte in Arduino Zeitschaltung von werten.:
Was anderes: verstehst du das?
Ich versuche es zu erklären:
if ( ist das so wie gewünscht, mache dass was darunter steht. Wenn nicht gehe weiter zu else if und konntrolliere das ob es stimmt, wenn ja mache dass was darunter steht, wenn nicht weiter zu else und mache das was da steht.
Hoffe es ist verständlich.
Ja. Aber verstehst Du es im Bezug auf Deine Heizung? Es sind halt ~10 Zeilen statt Deiner 30.
-
@Swordfish sagte in Arduino Zeitschaltung von werten.:
Ja. Aber verstehst Du es im Bezug auf Deine Heizung? Es sind halt ~10 Zeilen statt Deiner 30.
Denke schon, bei mir sieht es jetzt so aus:
bool Heizungon; { if (Durchschnitttemp <=solltemptag) Heizungon = true; if (Durchschnitttemp > solltemptag+2) Heizungon =false; if (Heizungon) { digitalWrite(A10, HIGH); digitalWrite(A9, LOW); } if (!Heizungon) { digitalWrite(A10, LOW); digitalWrite(A9, HIGH); }}
Ich denke dass ich um zu viele Ecken gedacht habe, benötige ja nur eine Einschalltschwelle und eine zum Ausschallten.
@Swordfish sagte in Arduino Zeitschaltung von werten.:
int foo;
int bar = 42;
if (bar == 13)
foo = 2;
printf("%d\n", foo);Ich weis das bei int eine globale Variable ist, deren Name foo in diesem Fall ohne Wert
int bar = 42 name bar mit dem wert 42
wenn bar gleich 13
dann ist foo 2
mit der letzten Zeile kann ich leider nichts anfangen, außer schreibe
-
@Ben sagte in Arduino Zeitschaltung von werten.:
Denke schon, bei mir sieht es jetzt so aus:
bool Heizungon; { // hier if (Durchschnitttemp <=solltemptag) Heizungon = true; if (Durchschnitttemp > solltemptag+2) Heizungon =false; if (Heizungon) { digitalWrite(A10, HIGH); digitalWrite(A9, LOW); } if (!Heizungon) { digitalWrite(A10, LOW); digitalWrite(A9, HIGH); } } // hier
Wofür sind diese Klammern bei hier?
-
Die schließt den Bereich "Tempsteuerung" ab.
int Tempsteuerung() { // Temperatursensoren lesen int Temperatur1 = Sensor1.readTemperature();//Temperatur Sensor1 auslesen int Temperatur2 = Sensor2.readTemperature();//Temperatur sensor2 auslesen int Durchschnitttemp = ( Temperatur1 + Temperatur2 ) / 2; // Durchscnittstemperatur berechnen // Solltemperatur ueber Potentiometer einstellen fuer Tag int einstellungtemptag = analogRead(15); //lesen des Potis mit der Solltemperatur für Tag int solltemptag = map(einstellungtemptag, 0, 1022, 10, 30); // festlegung des Regelbereiches der Temperatur Tag // Solltemperatur ueber Potentiometer einstellen fuer Nacht int einstellungtempnacht = analogRead(14); //lesen des Potis mit der Solltemperatur für Nacht int solltempnacht = map(einstellungtempnacht, 0, 1022, 10, 25); // festlegen des Reglerbereiches der Temperatur Nacht Serial.println(); // Zeilenumbruch Serial.print("Solltemperatur Tag: "); Serial.print(solltemptag); //diesen Wert möchte ich einstellen können und er soll sich zu einer bestimmten (einstellbaren Zeit) auf "solltempnacht" umstellen z.B. 20:00Uhr. Serial.println(" Grad Celsius"); //Einheit nach dem Wert Serial.print("Solltemperatur Nacht: "); Serial.print(solltempnacht); //diesen Wert möchte ich einstellen können und er soll sich zu einer bestimmten (einstellbaren Zeit) auf "solltemptag" umstellen z.B. 07:00Ihr. Serial.println(" Grad Celsius"); Serial.println(); // Zeilenumbruch Serial.print("Temperatur 1: "); //Text Sensor1 Serial.print(Temperatur1); //Sensor1 Wert Temperatur Serial.println(" Grad Celsius"); //Einheit nach dem Wert Serial.print("Temperatur 2: "); //Text für Sensor2 Serial.print(Temperatur2); //Sensor2 Wert Temperatur Serial.println(" Grad Celsius"); //Einheit nach dem Wert Serial.println(); // Zeilenumbruch Serial.print("Durchschnittstemperatur: "); //Text Durchschnittstemperatur Serial.print(Durchschnitttemp); // Schreiben des Wertes Serial.println(" Grad Celsius"); //Einheit nach dem Wert Serial.println(); // Zeilenumbruch if (Durchschnitttemp == solltemptag) leuchte(0); //startet Ausführung 0 aus dem Array else if (Durchschnitttemp == solltemptag - 1) leuchte(-1); //startet Ausführung 1 aus dem Array else if (Durchschnitttemp == solltemptag + 1) leuchte(1); //startet Ausführung 2 aus dem Array else if (Durchschnitttemp == solltemptag - 2) leuchte(-2); //startet Ausführung 3 aus dem Array else if (Durchschnitttemp == solltemptag + 2) leuchte(2); //startet Ausführung 4 aus dem Array else if (Durchschnitttemp <= solltemptag - 3) leuchte(-3); //startet Ausführung 5 aus dem Array else if (Durchschnitttemp >= solltemptag + 3) leuchte(3); //startet Ausführung 6 aus dem Array bool Heizungon; { if (Durchschnitttemp <=solltemptag) Heizungon = true; if (Durchschnitttemp > solltemptag+2) Heizungon =false; if (Heizungon) { digitalWrite(A10, HIGH); digitalWrite(A9, LOW); } if (!Heizungon) { digitalWrite(A10, LOW); digitalWrite(A9, HIGH); }} }
wenn ich es ohne mache, meckert das Arduinorogramm
-
Lies meinen letzten Beitrag nochmal.
-
Alles neu,
viel zu viele Klammern gesetzt.bool Heizungon; if (Durchschnitttemp <=solltemptag) Heizungon = true; if (Durchschnitttemp > solltemptag+2) Heizungon =false; if (Heizungon) digitalWrite(A10, HIGH); digitalWrite(A9, LOW); if (!Heizungon) digitalWrite(A10, LOW); digitalWrite(A9, HIGH);
so
-
In dem Code in diesem Post ist in Zeile 44 eine öffnende geschwungene Klammer
{
und in Zeile 59 die dazugehörige schließende geschwungene Klammer. Was bewirken diese Klammern und warum sind sie da?
-
@Ben sagte in Arduino Zeitschaltung von werten.:
if (Heizungon) digitalWrite(A10, HIGH); digitalWrite(A9, LOW); if (!Heizungon) digitalWrite(A10, LOW); digitalWrite(A9, HIGH);
Aha. und warum sind da jetzt die Klammern weg? Bitte besorg' Dir ein Lehrbuch. Danke.
-
ich bin voll für heute glaube ich. Die Klammer müssen wieder rein, sonst ist kein "Abscnitt (Anweisung)" gebildet was dann passieren soll
-
@Ben sagte in Arduino Zeitschaltung von werten.:
bool Heizungon; bool Heizungoff; { if (Durchschnitttemp < solltemptag) Heizungon = true; if (Durchschnitttemp > solltemptag+2) Heizungoff = true; if (Durchschnitttemp < solltemptag) Heizungoff = false; if (Durchschnitttemp > solltemptag+2) Heizungon =false; if (Heizungon) { digitalWrite(A10, HIGH); digitalWrite(A9, LOW); } if (Heizungoff) { digitalWrite(A10, LOW); digitalWrite(A9, HIGH); }}
Besser so?
Lass mich das mal ein wenig umformen...
Du hast hier jeweils zweiif
Abfragen mit der selben Bedingung. Die können wir zusammenfassen. Gleichbedeutend wäre also:> if (Durchschnitttemp < solltemptag) { > Heizungon = true; > Heizungoff = false; > } > if (Durchschnitttemp > solltemptag+2) { > Heizungoff = true; > Heizungon =false; > }
Das passt auch mehr oder weniger. Das Problem dabei ist nur dass wenn beide Bedingungen nicht zutreffen der Zustand von
Heizungon
undHeizungoff
undefiniert ist.Korrekt wäre:
bool Heizungon; bool Heizungoff; if (Durchschnitttemp < solltemptag) { /* Temperatur unter dem erlaubten Bereich: Heizung einschalten */ Heizungon = true; Heizungoff = false; } else if (Durchschnitttemp > solltemptag+2) { /* Temperatur über dem erlaubten Bereich: Heizung ausschalten */ Heizungon = false; Heizungoff = true; } else { /* Temperatur ist im erlaubten Bereich: keine Änderung */ Heizungon = false; Heizungoff = false; }
(EDIT: Kommentare korrigiert)
Oder auch etwas einfacher:
bool Heizungon = false; bool Heizungoff = false; if (Durchschnitttemp < solltemptag) { /* Temperatur ist zu niedrig: Heizung einschalten */ Heizungon = true; } if (Durchschnitttemp > solltemptag+2) { /* Temperatur ist deutlich zu hoch: Heizung ausschalten */ Heizungoff = true; }
Oder noch einfacher:
bool Heizungon = Durchschnitttemp < solltemptag; bool Heizungoff = Durchschnitttemp > solltemptag+2;
-
@hustbaer sagte in Arduino Zeitschaltung von werten.:
Oder noch einfacher:
bool Heizungon = Durchschnitttemp < solltemptag;
bool Heizungoff = Durchschnitttemp > solltemptag+2;Es wurde doch schon geklärt, dass die Heizung nur zwei Zustände haben kann an oder aus
Demnach reicht eine boolsche Variable dafür aus.
Beide Zustände gleichzeitig geht nur bei Schrödinger.
Aber das passiert bei den Bedingungen, wenn z.B Durchschnitttemp == solltemptag+1 ist.Bei der Hysterese muss auch der Istzustand gemerkt und berücksichtigt werden.
-
Erstmal einen schönen guten Morgen
@Swordfish vielen Dank nochmal an deine Ausdauer von gestern. Ich war am Abend echt voll und platt.
Habe ich das jetzt (endlich) richtig verstanden:
Wenn eine if zutreffend war, endert sich so lange nichts an meinen LEDs, bis ich alle anderen Möglichkeiten als Alternative
angegeben habe und eine davon zutreffend Ist/war und die Schalltung ändert.Das würde für mich als Anfänger heißen:
if
else if
else
wäre für mich am einfachsten verständlich (so wie @hustbaer es oben geschrieben hat).
das alles in Kurzform zu bekommen, versuche ich mal den Tag über.Nochmal ein großes Lob an euch alle, ihr habt echt Ausdauer mit so einem Döskopp wie mich.
Grüße
Ben
-
@DirkB
Bitte lies das nochmal, inklusive Kommentare, und versuche es zu verstehen.bool Heizungon; bool Heizungoff; if (Durchschnitttemp < solltemptag) { /* Temperatur über dem erlaubten Bereich: Heizung ausschalten */ Heizungon = true; Heizungoff = false; } else if (Durchschnitttemp > solltemptag+2) { /* Temperatur unter dem erlaubten Bereich: Heizung ausschalten */ Heizungon = false; Heizungoff = true; } else { /* Temperatur ist im erlaubten Bereich: keine Änderung */ Heizungon = false; Heizungoff = false; }
(Hinweis: ja, ich weiss, ich hab die beiden Kommentare im 1. und 2. Block vertauscht und auch 2x "ausschalten" geschrieben statt 1x "ausschalten" und 1x "einschalten". War keine Absicht. Aber ich will jetzt auch nicht schummeln und so tun als wäre es mir nicht passiert.)
Wenn du dann immer noch der Meinung bist du müsstest mir was über Schrödinger oder Regelung mit Hysterese erklären, dann bitte.
-
@Ben sagte in Arduino Zeitschaltung von werten.:
Habe ich das jetzt (endlich) richtig verstanden:
Wenn eine if zutreffend war, endert sich so lange nichts an meinen LEDs, bis ich alle anderen Möglichkeiten als Alternative
angegeben habe und eine davon zutreffend Ist/war und die Schalltung ändert.Ich verstehe leider nicht genau was du damit meinst. Vielleicht ist das was du dir dabei gedacht hast als du es geschrieben hast richtig, vielleicht aber auch nicht.
Ich glaube jetzt wäre ein guter Zeitpunkt für dich dir mal die grundlegensten Grundlagen der imperativen Programmierung anzugucken. Also wie imperative Programme abgearbeitet werden, wie Variablen in imperativen Programmen funktionieren und wie "if"s funktionieren. So lange du das nicht verstanden hast, wirst du wenig Erfolg damit haben imperative Programme zu lesen oder zu schreiben. Natürlich geht es mit Trial-and-Error und genügend Geduld immer irgendwie - zumindest so lange die Ziele einfach genug sind. Aber es ist super mühsam, unzuverlässig und du lernst dabei nicht wirklich programmieren.
-
Nennt mich einen Pessimisten, aber so ziemlich das Erste, das ich planen würde, wäre ein gutes und zuverlässiges Alarmsystem.
Und in dem Fall würde ich ein Bitfeld nehmen,Keine_Aenderung
,Anschalten
,Auschalten
und außerdem zusätzlich alarmieren (verbunden mit an- und auschalten unabhängig vom intern gespeicherten Istwert). Aber das ist im Grunde ein unwichtiges Detail.