Arduino Zeitschaltung von werten.



  • 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 zwei if 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 und Heizungoff 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.

    @DirkB und @hustbaer.

    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.


Log in to reply