Arduino Zeitschaltung von werten.



  • Servus nochmal,
    ich werde es mal umschreiben. Das erste habe ich bereits gemacht und jeweils die -2 rausgeworfen.
    Mal sehen was da gleich passiert.

    So, nun sieht es so aus:

    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;
      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?

    Grüße
    Ben



  • Hallo @Leon0402

    @Leon0402 sagte in Arduino Zeitschaltung von werten.:

    Also sprich: Wenn entweder die Durschnittstemperatur kleiner als soll -2 oder (!) größer als +2 ist, dann ist die Heizung an. In allen anderen Fällen, also wenn die Tempatur irgendwo dazwischen liegt ist sie aus.
    Ich weiß nicht genau, ob das die Logik ist, die du haben willst, aber so stand es zumindest in deinem Code Ansonsten entsprechend anpassen

    Nee so wollte ich es nicht. (Haste dir ja sicher schon gedacht. Ziel war es, die Heizung an zu schallten, wenn die Temperatur unter soll geht und ausschallten wenn die Temperatur Solltemperatur +2 Grad hat.

    Bin wohl voll dran vorbei geschossen



  • Déjà vu.

    Welche Werte haben denn Heizungon und Heizungoff wenn davon

    @Ben sagte in Arduino Zeitschaltung von werten.:

      if (Durchschnitttemp < solltemptag)
          Heizungon = true;
      if (Durchschnitttemp > solltemptag+2)
          Heizungoff = true;
      if (Durchschnitttemp < solltemptag)
          Heizungoff = false;
      if (Durchschnitttemp > solltemptag+2)
          Heizungon =false; 
    

    nichts zutrifft?



  • Sorry ich verstehe dich jetzt echt nicht.
    die if werden doch konntrolliert ob sie true oder false sind oder?
    Warum soll es nicht zutreffen Durchschnitttemp z.B. 19°C ist kleiner als solltemperatur z.B. 22°C
    wenn das true ist, soll er mit Heizungon weiter arbeiten.
    wäre

     if (Heizungon)
      {
       digitalWrite(A10, HIGH);
       digitalWrite(A9, LOW);
      }
      if (Heizungoff)
      {
        digitalWrite(A10, LOW);
        digitalWrite(A9, HIGH);
      }}
    

    oder bin ich da jetzt false unterwegs?



  • @Ben sagte in Arduino Zeitschaltung von werten.:

    Hallo @Leon0402

    @Leon0402 sagte in Arduino Zeitschaltung von werten.:

    Also sprich: Wenn entweder die Durschnittstemperatur kleiner als soll -2 oder (!) größer als +2 ist, dann ist die Heizung an. In allen anderen Fällen, also wenn die Tempatur irgendwo dazwischen liegt ist sie aus.
    Ich weiß nicht genau, ob das die Logik ist, die du haben willst, aber so stand es zumindest in deinem Code Ansonsten entsprechend anpassen

    Nee so wollte ich es nicht. (Haste dir ja sicher schon gedacht. Ziel war es, die Heizung an zu schallten, wenn die Temperatur unter soll geht und ausschallten wenn die Temperatur Solltemperatur +2 Grad hat.

    Bin wohl voll dran vorbei geschossen

    Na dann macht das doch mal als Formel:

    if(hier deine Formel einfügen)
      // heizung an 
    else
     // heizung aus
    


  • Was ist wenn
    Durchschnitttemp < solltemptag nicht wahr ist,
    Durchschnitttemp > solltemptag+2 nicht wahr ist,
    Durchschnitttemp < solltemptag nicht wahr ist und auch
    Durchschnitttemp > solltemptag+2 nicht wahr ist?
    Welche Werte haben dann Heizungon und Heizungoff?



  • Hallo @Swordfish,
    jetzt ist der groschen gefallen, das heißt es muss noch eine if mit rein, Durschnitttemp==solltemptag oder bei einer Temperaturspanne = mit rein. Richtig?



  • @Ben sagte in Arduino Zeitschaltung von werten.:

    So, nun sieht es so aus:

    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
    
    [...]
    
      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
    

    Hallo @Ben,

    ich möchte dich mal fragen, ob dir deine eigenen Kommentare im Code eigentlich weiterhelfen. Im hier zitierten Teil würde ich höchstens den einen Kommentar in Zeile 3 lassen und alle anderen entfernen. Diese Kommentare beschreiben doch nur 1:1 die jeweilige Codezeile und sind damit überflüssig.

    Ich würde dir raten, ganz anders zu kommentieren.

    Das fängt an mit einer Beschreibung, was die Funktion tut, wenn sie keinen eindeutigen Namen hat. Was "Serial.println()" macht, ist klar. Aber was macht Tempsteuerung genau? Die Funktion returnt einen int. Was bedeutet der Return-Wert? So etwas solltest du kommentieren.

    Außerdem kannst du Kommentare da verwenden, wo z.B. der Code kompliziert ist. Oder wenn du einen Block hast, der eine bestimmte Sache tut, dann kannst du dem gesamten Block einen Kommentar spendieren - oder dann den Block in eine Funktion auslagern.

    Jedenfalls mein genereller Rat: kommentieren nicht die sowieso lesbaren und klaren Zeilen, sondern die, wo das nicht der Fall ist. Und kommentiere Funktionen und Klassen, sofern es sich nicht um triviale Dinge handelt oder durch den Funktionsnamen schon alles klar ist.

    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.



  • 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 und Durchschnitttemp > 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 und Heizungoff 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 hat Heizungon 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 sondern AUSGANG_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 und Durchschnitttemp > 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.


Anmelden zum Antworten