Lüfter bei bestimmter Temperatur abschalten

  • Dreh den Ausdruck compareTemp = istTemp; um und denk mal nach, was da passiert.

    Du überschreibst den gemessenen Wert mit einer Variablen die den Wert Null enthält. Der Sinn ist aber, den gemessenen Wert in einer zweiten Variablen zu speichern, damit er beim nächsten Durchlauf der Schleife mit dem aktuell gemessenen Wert verglichen werden kann.


    Gruß Kai

  • Da kann Ich Dir den Kurs: Der einfache Einstieg in Arduino & Co von René empfehlen. Da steht sehr viel drin was Du wissen musst, wenn du selbständig programmieren willst. In der ZIP-Datei, die Du herunter laden kannst, ist ein PDF Dokument enthalten, in der jeder Schritt von Lektion 1 bis 34 beschrieben ist. Unter anderem auch der Unterschied von "=" und "!=". Ein Ausrufezeichen in C und den meisten anderen Programmiersprachen bedeutet "NICHT". Ein != demnach "NICHT GLEICH".


    Der Vergleich im Kopf der IF Schleife ist ja OK. Der Vergleich compareTemp != istTemp; IN der IF Schleife (Zeile 3.) ist falsch. Lass das Ausrufezeichen weg.


    Gruß Kai

  • So, ich habe eine Variable "static double istTemp = 0)" hinzugefügt. Auch habe ich die if Bedingung erweitert:

    Nur weiß ich jetzt nicht genau, was ich gleich oder ungleich setzten muss, um eine Ausgabe auf den LCD zu bekommen.


    Gruß

    Harry

  • Auf „die Schnelle“ ist nicht selten „suboptimal“ 😉.


    Wenn du es ein wenig schöner haben willst, definiere noch eine Variable um einen Temperaturwert abzuspeichern und erweitere die IF Bedingung, welche den LCD Ausgabeblock umschließt um eine weitere Bedingung, die du mit Oder “||“ verknüpfst. Mit encPos und encOldPos hast Du ja schon eine Vorlage.


    Gruß Kai

  • Hallo Kai,

    danke für deine Hilfe. Auf die Schnelle habe ich keine Lösung um den Code optimal zu verändern. Das ist ja, jetzt wohl, zum größten Teil dein Code:thumbup:.


    Das Problem habe ich natürlich auf meine Weise gelöst und einfach die Position und die Ausgabe der Ist-Temperatur geändert. Ist aber nicht optimal, da beim Drehen des Reglers für kurze Zeit die Ist-Anzeige verschwindet.

    Code
    1. double checkTemperature(double tempOff) {
    2. static relaisState switchRelais = OFF;
    3. double tempMeasured = ktc.readCelsius();
    4. lcd.setCursor ( 0, 3 );
    5. lcd.print(ktc.readCelsius()); lcd.print ("\xDF\x43"); // Explanation: \xDF is hex for ° (degree)
  • Was noch zu ändern wäre ist, static unsigned long time = millis() + wait; in static unsigned long time =0; umzuschreiben.


    Das Problem dürfte darin liegen, dass die LCD Anzeige nur aktualisiert wird, wenn der Drehregler bewegt wurde. Du wirst den Code wohl dahingehend ändern müssen, dass auch bei einer geänderten Ist-Temperatur ein Update der LCD Anzeige erfolgt:). Da kannst Du dich ja mal dran versuchen....


    Gruß Kai

  • Hallo Kai,

    die Ist-Temperatur wir im Display mit 0.00°C oder manchmal mit der Raumtemperatur angezeigt. Erwärme ich den Sensor bleibt im Display die Anzeige konstant. Im seriellen Monitor funktioniert die Anzeige.

    Hier der aktuelle loop ...

  • Wird die Temperatur auf dem Display generell nicht angezeigt oder nur dann nicht, wenn du nicht an dem Drehgeber drehst?


    Kopier doch mal den Code deiner Loop Funktion hier rein... Aber bitte benutze das Code Tag "</>" oben (drittes Zeichen von rechts) aus den Menüleiste, damit man den Code besser lesen kann. So unformatiert wie du den hier reinkopierst ist es sehr unschön zu lesen.


    Gruß Kai

  • Jetzt habe ich noch ein "Serial.println(compareTemp);" hinzugefügt. Über den seriellen Monitor wird

    die Ist-Temperatur ausgegeben und alles funktioniert, wie ich mir gewünscht habe.

    Nur auf dem Display mit "lcd.print(compareTemp); lcd.print ("\xDF\x43");" gibt es keine Anzeige. ???

  • Hallo Kai,

    fast ist es geschafft. Leider kann ich all die Befehle nicht ganz nachvollziehen. Macht aber auch nichts.

    Ziel war es den Lüfter bis zum Einstellbereich 80-140°C laufen zu lassen und dann, wenn die entsprechend eingestellte Temperatur erreicht ist, sollte er ausgehen. Okay, habe ich in deinem Sketch mit dem Drehen der

    größer/kleiner Zeichen geändert.

    if (tempMeasured > tempOff && switchRelais != OFF) {

    digitalWrite(relaisPin, LOW);

    switchRelais = OFF;

    #ifdef DEBUG

    Serial.println("Relais auf LOW");

    #endif

    } else if (tempMeasured <= tempOff && switchRelais == OFF) {

    digitalWrite(relaisPin, HIGH);

    switchRelais = ON;

    Wahrscheinlich nicht die top Lösung, aber funktioniert.

    Leider zeigt das Display immer noch nicht die Ist-Temperatur. Wenn ich compareTemp mit tempMeasured austausche, kommt wieder die unten beschrieben Fehlermeldung. Auch den Displaybefehl nach dem tempMeasured einzubauen funktioniert nicht.

    Du hast sicher dafür noch eine Lösung für mich parat.

    Grüße

    Harry

  • tempMeasured ist die gemessene Temperatur. Die Variable ist aber nur in der Funktion checkTemperature() bekannt, darum kannst du die natürlich in loop() nicht verwenden. Wenn Du die Temperatur in deinem Display ausgeben willst, musst du in der loop() Funktion eine double Variable definieren z.B. static double compairTemp=0; und checkTemperature(switchOffTemp); in compairTemp = checkTemperature(switchOffTemp); ändern.

    Außerdem noch den entsprechenden lcd.print() Befehl einfügen.


    Ich hatte ein anderes Display und beim Umstellen auf Deine Variante ist mir da was durchgegangen.


    Ich habe den Code zumindest dahingehend ausprobiert, dass je nach vorgegebener Temperatur und der Stellung eines Drehreglers „Relais auf LOW oder „Relais auf HIGH“ auf der seriellen Konsole angezeigt wird. Zumindest diese Umschaltung hat korrekt funktioniert. Ob die Ansteuerung der Relais so jetzt passt kann ich nicht sagen, weil ich keine habe.


    Der „counter“ zeigt lediglich an, wie oft die checkTemperature(); Funktion aufgerufen wird. Wenn die gemessene Temperatur unter der Grenztemperatur ("switchOffTemp") liegt (was bei Zimmertemperatur der Fall ist, es sei denn, es sind bei Dir über 80°C ;)), geht der Lüfter aus (Relais auf LOW). Wird eine Temperatur > der eingestellten "switchOffTemp" gemessen, sollte der Lüfter angehen (Relais auf HIGH).


    Gruß Kai


    PS: Ich habe das was ich oben geschrieben habe gerade im unten geposteten Code ergänzt.

  • Jetzt habe ich das "define DEBUG" aktiviert und die Soll-Temp (ist wahrscheinlich "switchOffTemp") im

    LCD Display eingetragen (Funktioniert und lässt den Bereich 80-140 zu)

    Für was ist den der counter? Der Sketch startet jetzt bei 80 °C, der Lüfter läuft an und geht sofort wieder aus.

    Der counter zählt immer weiter ...

    Und dann noch: Was ist den meine Ist-Temp (tempMeasured ??). Wenn ich tempMeasured in dem lcd.print einbaue kommt die Fehlermeldung: 'tempMeasured' was not declared in this scope.


    Probleme über Probleme ...

  • Super, danke für deine Mühe, Kai!


    Der Sketch lässt sich ohne Probleme / Fehler hochladen. Allerdings passiert leider nichts,

    der Lüfter läuft nicht und man kann keine Temperatur einstellen. Das Display zeigt die Texte an (s.

    Anhang).

    Der Inhalt dieses Sketchs übersteigt jetzt auch meine weiteren Möglichkeiten. Vielleicht ist es auch nur

    noch eine Kleinigkeit. Für deine weitere Unterstützung wäre ich dir sehr dankbar.


    IMG_6658.jpg

  • Da ich mangels entsprechendem Sensor und Zeit nicht alles testen kann, habe ich den Code mal als "Trockenübung" zusammengestellt. Ob er wirklich funktioniert weiß ich nicht. Das musst Du ausprobieren.


    Was habe ich mir dabei gedacht?


    Ich habe die Temperaturmessung und die Abfrage des Drehimpulsgebers in eine Funktion ausgelagert. Das macht das Ganze etwas modularer und lesbarer.

    Ich habe eine Konstante "wait" eingeführt. Mit Hilfe dieser Konstanten und der millis() Funktion sorge ich dafür, dass die Temperaturmessung nur alle zwei Sekunden erfolgt. Das entlastet den Controller und sorgt dafür, dass der Sensor mit dem Liefern der Werte überhaupt nachkommen kann. Wenn du kürzere oder längere Intervalle haben willst, muss Du die Konstante anpassen. Die Einheit ist Millisekunden (darum 2000).


    Im setup() Bereich wird ein bisschen initialisiert und das erste mal die Funktion für die Temperaturmessung mit dem Minimalwert der Temperaturgrenze aufgerufen. In dieser Funktion wird auch die Relais-Steurung gemacht. Die IF-Abfragen und die Flagvariable "switchRelais" sollen dafür sorgen, dass die Relais nicht permanent geschaltet werden, sondern nur wenn es wirklich notwendig ist. Ist die gemessene Temperatur niedriger als "ROTARYMIN" wird das Relais auf "LOW" gesetzt, ansonsten auf "HIGH".


    Der Rest ist nur noch LCD Ausgabe.


    Wenn Du eine Debugausgabe auf der seriellen Konsole haben möchtest, musst Du die Zeile "//#define DEBUG" auskommentieren (die zwei Schrägstriche entfernen).


    Vielleicht klappt es ja....


    Wenn es grundsätzlich funktioniert, wäre es sicher sinnvoll noch eine Hysterese zwischen Ein- und Ausschalttemperatur einzubauen und die Drehimpulsgeber-Abfrage wieder auf die ursprüngliche Version mit Interrupt umzustellen.


    Gruß Kai