Arduino Timer für Standheizung

Hallo
Bin gerade dabei meine Webasto Standheizung mit dem Arduino und ein GSM/GPRS Modul zu steuern.
Funktioniert auch alles. Kann sie Ein und Ausschalten.
Mein Problem ist wenn ich die Standheizung mit einer SMS einschalte.
Geht sie an und soll nach 20 min ausgehen.
Habe es mit Delay probiert geht aber ich kann sie nicht mehr ausschalten.
Habe es mit Blinken ohne delay probiert, bei einer Schaltung mit einem Schalter und einer LED hat es super funktioniert, habe den selben code eingefügt und es ging dann nicht mehr.

Jetzt wollte ich es mit einer RTC Uhr machen.
Ich kann die Std und min auslesen.
Wenn ich aber 20 min drauf machen kommt zb. 14:50 +00:20 = 14:70 oder kann der Arduino mit Std und Min Rechnen.

Gruß Marco

Hallo,

Einschaltbefehl kommt per SMS rein, Arduino merkt sich die Zeit von millis und wartet bis es 20min später ist ...
Ich sehe da kein Problem.

Zeiten rechnen. Tja, die Kunst nennt sich programmieren. So blöd das klingt. Um den Minutenüberlauf und Stunden hochzählen mußt Du Dich selbst kümmern. Einfacher wird es wenn Du die Stunden und Minuten zu einer Ganzzahl verarbeitest und diese dann vergleichst.

Oder Du hast eine DS3231 als RTC und kannst 2 Alarmzeiten vorgeben. Auch hier mußte Dich mit der RTC beschäftigen.

Alles gibts leider nicht fertig zum wilden zusammen kopieren.

Hallo
Danke für die schnelle Antwort.
Das mit dem millis zählen habe ich mir ja auch schon überlegt aber wenn er nach 48 Tage wieder auf null geht. Und ich meine Heizung kurz vorher einschalte rennt sie dann 48 Tage durch.
Aber das mit der Uhrzeit umrechnen muss ich mal probieren.
Das könnte ich noch hinbekommen.
Gruß Marco

Das mit dem millis zählen habe ich mir ja auch schon überlegt aber wenn er nach 48 Tage wieder auf null geht. Und ich meine Heizung kurz vorher einschalte rennt sie dann 48 Tage durch.

Nein. Bei richtigem Vergleich ist ein Zeitintervall auch während eines Überlaufs korrekt. Die einzige Limitation ist, daß das Intervall nicht länger als ca 49,5 sein darf.

Artikel bezüglich rollover Arduino Playground - HomePage
Artikel bezüglich längerer Intervalle mit zusätzlichem Zähler https://www.faludi.com/2007/12/18/arduino-millis-rollover-handling/ Der Überlauf ist bei 2^32-1 was ca 49,5 Tage ist.

Bezüglich RTC
wenn du Stunden Minuten in Minuten umrechnest brauchst Du Dich um das richtige Rechnen mit Minuten nicht kümmern.
Beispiel: 14:50 +00:20 14*60+50 +20 = 840 + 20 = 860 Minuten Abschaltzeit.

Zeig uns den Sketch mit millis() der nicht funktioniert.

Grüße Uwe

Hallo,

bei den Zeiten umrechen mußt Du auch aufpassen. Denn was machste wenn es später wird als 23:59 Uhr?
Das mußt Du alles abfangen in Deinem Code.

Wegen millis und dem Überlauf. Ja der Zähler millis läuft über nach 48 Tage. Das heißt aber noch nicht das Dein Zähler damit auch falsch geht.

Das Grundgerüst sieht immer so oder so ähnlich aus. Jetzt machst das mal bitte alles ohne millis sondern mit einem 8 Bit eigenen Counter den zu hoch zählen läßt und guckst Dir im seriellen Monitor an was beim Überlauf mit der Rechnung passiert.

if (millis() - lastTime > on_time ) 
    {
      digitalWrite(pin_LED, LOW);         // LED ausschalten 
      lastTime = millis();  
    }

zum Bsp.

byte counter;
byte lastTime = 64;
byte Ergebnis;

void setup()  {
  Serial.begin(9600); 
}

void loop()  {
  
  Ergebnis = counter - lastTime;
  Serial.print(counter); Serial.print("\t"); Serial.println(Ergebnis); 
  counter++;
}

Mreichart:
Das mit dem millis zählen habe ich mir ja auch schon überlegt aber wenn er nach 48 Tage wieder auf null geht. Und ich meine Heizung kurz vorher einschalte rennt sie dann 48 Tage durch.

Im einfachsten Fall bastelst Du Dir aus dem millis() Zähler einen eigenen seconds() Zähler, der einerseits die Sekunden zählt und andererseits den Überlauf alle 49 Tage problemlos verkraftet. Genauer als auf die Sekunde genau muss die Standheizung wohl kaum geschaltet werden.

Und dann kannst Du eine Ausschaltzeit nach 20 Minuten einfach timen, indem Du 1200 Sekunden auf die Einschaltzeit draufzählst.

Der Überlauf beim Sekundenzähler würde dann nicht nach ca. 49 Tagen, sondern erst nach ca. 49000 Tagen erfolgen, was einem Zeitraum von über 130 Jahren entspricht. Dieser Überlauf wird Dich dann nicht mehr interessieren. Wahrscheinlich wird es in über 130 Jahren auch kein GSM-Netz mehr geben, mit dem Dein dann antikes GSM-Modul noch funktionieren wird.

Beispiel für so eine 'seconds()' Funktion, die gegen Überläufe resistent ist:

unsigned long seconds()
{
  static unsigned long mySeconds;
  static unsigned long lastMillis;
  while (millis()-lastMillis>=1000)
  {
    mySeconds++;
    lastMillis+=1000;
  }
  return mySeconds; 
}

Hab ich was übersehen?

Uwes Einwand:

Bei richtigem Vergleich ist ein Zeitintervall auch während eines Überlaufs korrekt. Die einzige Limitation ist, daß das Intervall nicht länger als ca 49,5 Tage sein darf.

ist immer noch die richtige Antwort.

@Marco:
Du kannst ohne weiteres irgendwann, auch eine Sekunde vor dem Überlauf, einen 20 Minuten-Zyklus starten.
(millis() - Starttime) liefert dir immer den richtigen Wert, den du auf 20601000L abprüfen kannst.
( Und die Standheizung wieder ausschalten kannst, wenn größer )

Das ist erheblich einfacher als mit einer RTC und eventuellem Tagesüberlauf um Mitternacht herumzuhantieren.

Wenn du es nicht glaubst, ( :wink: ) spiele statt mit unhandlichen unsigned long Zahlen spaßeshalber mit bytes (die haben nur 256 Werte, ohne Vorzeichen, im Bereich 0 .. 255):

byte Start = 250;
byte Now = 2;
byte Dauer = Now - Start; // ergibt 8  ( statt -248 )

Ich verstehe nicht, wozu man bei der Heizungssteuerung überhaupt die Uhrzeit braucht. Entweder gibt man direkt mit einer Einschalt-SMS an, wie lange die Heizung danach laufen soll - dann muss man nur die Loops zählen und mit einem vorher ausgetesteten Korrekturfaktor multiplizieren.

Oder man sendet mit einer SMS, die ein späteres Einschalten bewirken soll (z.B. du sendest um 17 Uhr, dass die Heizung um 20:30 für 30 min angehen soll), einfach die aktuelle Uhrzeit mit (falls das nicht von selber passiert, mache schon lange nichts mehr mit SMS, nur noch mit IP) ...

Hallo,

man nimmt eine externe RTC, weil die Uhr nachgebaut im µC nach einer Weile nach dem Mond geht.
Vozugseise nimmt man eine DS3231.

Doc_Arduino:
man nimmt eine externe RTC, weil die Uhr nachgebaut im µC nach einer Weile nach dem Mond geht.
Vozugseise nimmt man eine DS3231.

Wenn du erreichen willst, dass die Heizung täglich genau zu einer bestimmten Uhrzeit laufen soll, und das auch noch Monate später, ist eine "externe RTC, ... Vozugseise eine DS3231" schon richtig.

Um 20 Minuten zu zählen ( und evtl. noch eine Stunde Vorlauf bevor sie startet ) braucht man das nicht.

SMS Empfang und Auswertung ist schon schwierig genug :wink:

Hallo,

wenn er immer mit SMS einschaltet für eine bestimmte Zeit, dann reicht das. Zugegeben.
Ich hab jedoch mal weiter gedacht, weil ich auch eine Standheizung habe. Irgendwann kommt die Zeit, da will man nicht immer erst gucken und manuell einschalten. Dann möchte man feste Zeiten programmieren. Selbst wenn kein Schnee liegt können die Scheiben überfroren sein und selbst wenn es Eis frei ist möchte man ein warmes Auto und vorgewärmten Motor haben. Sonst braucht man auch keine Standheizung. Deshalb kommt man immer wieder zu einer RTC. Meine persönliche Meinung. Wie immer. :wink: