Newbie sucht Hilfe... DS3231 RTC mit MEZ/MESZ Umschaltung gesucht

Super, vielen Dank für die schnelle Hilfe!

/e: die ganze Zeit war ich am grübeln und jetzt nachdem du es gesagt hast, springt es mir im Code der Library direkt ins Auge.

Großes Dankeschön!

wird über die Lib ja eigentlich auch auf plausibilität gecheckt oder nicht?

Eher : "oder nicht" ;)

Fehlerbehandlung bei Arduino-Software geht traditionell nach der Methode: Wenn es nicht geht aber keiner guckt, ist es ja auch egal.

Sorry, aber ich muss den Thread nochmal kurz kapern.

Ich will nun noch mittels zweier Taster die Zeit, also eigentlich nur Stunde und Minute einstellen können.

Mein Code zum Taster abfragen im loop() sieht so aus:

zustandA = digitalRead(tasterAPin);
  
  if ((zustandA == HIGH) && ((millis() - lastUpdate) > upint))
  {
  lastUpdate = millis();
  TasterA();
  }
  else if ((zustandA == LOW) && ((millis() - lastUpdate) > upint))
  {
  lastUpdate = 0;
  }

TasterA() ist dann folgendes:

void TasterA()
{
RTCreadLocalTime(Zeit); // read localTime
int hour = Zeit.bHour;
int minute = Zeit.bMinute;

  if (hour == 23)
  {
  hour = 0;
  }
  else
  {
  hour=hour+0.5;
  }
 Zeit.bHour = hour;
 Zeit.bMinute = minute;
 
 
  RTCwrite(Zeit);
}

ich weiß dass ich auf hour und minute verzichten kann. Das war nur ein Test zur Lösung des Problems.

Und wenn man sich jetzt fragt warum ich auf hour +0,5 draufschlage, hat auch schon mein Problem entdeckt.

Möchte ich pro Tasterbetätigung die Stunde um +1 verstellen, werden immer +2 Stunden frauf geschlagen.

Der Teil der die Minute +1 setzen soll sieht im Prinzip genauso aus.
Dort ist das Problem, dass nicht nur die Minute korrekterweise um +1 verändert wird, sondern auch die Stunde um +1.

Hat jemand eine Erklärung für mich?

Moin,

ich erlaub mir mal eben diese Leiche aus dem Keller auszugraben, da mir der Code von jurs unheimlich in einer Zwangslage geholfen hat.

Ich bin in Sachen Arduino völliger Newbie und hab eigentlich ein kleines Projektchen angefangen, um meinen alten Tiny Tiger im Womo von seiner Funktion als Datenlogger zu erlösen.

Vor zwei Tagen fiel in meiner Heizung die Schaltuhr für Tag/Nachtschaltung aus, ne original neue hätte umme 100 Eu gekostet. Kurzes googeln hat mich zu diesem Thread geführt. Mag sein, dass es aktuellere Lösungen gibt, aber man verstehe bitte meinen Post als Dank @jurs.

Nun läuft meine Heizung wieder mit einer adhoc-Programmierung und einer Prototyp-Schaltung, weitere Feinheiten werden peu a peu dazukommen, auch ein gedrucktes Gehäuse.

Anbei das Bild meiner Schaltung. ZZt. kann die Schaltung die Steuerung Tag/Nachtprogramm, per Knopf kann ich die Zeitschaltung übersteuern und per Wifi kann ich ebenfalls eingreifen. Das Ganze hab ich auf nem ESP32 mit SD1306 OLED am Laufen.

Falls Interesse, poste ich gerne noch meine Schaltung, weitere Einzelheiten und die Codes.

Gruß Wiki

ZeitUhr.jpg

Hallo,

nettes Teil, der passende Thread dafür wäre dann dieser, wenn du es genauer vorstellen möchtest. http://forum.arduino.cc/index.php?topic=372623.0

Kannst auch in deinem #182 dann dorthin verlinken. Ist alles möglich. ;)

Hier die korrigierte Fassung ohne Warnungen (IDE 1.6.5).

dateTimeLibEasyDemo.ino (1.75 KB)

jursRTCtimeEasy.h (8.75 KB)

Doc_Arduino:
Hallo,

nettes Teil, der passende Thread dafür wäre dann dieser, wenn du es genauer vorstellen möchtest.
http://forum.arduino.cc/index.php?topic=372623.0

Kannst auch in deinem #182 dann dorthin verlinken. Ist alles möglich. :wink:

Moin,

Danke für die Blumen. In die Bilderstrecke gehört das Teil aber noch lange nicht, ist eine Q&D Notlösung. Ich musste vorrangig die Heizung ersteinmal zum Laufen bringen.

In Zukunft geht der Aufbau in den Ausschnitt für die alte Zeitschaltuhr in der Heizungssteuerung, dafür fehlen mir aber noch ein paar Bauteile, um das Gerät mit der eingebauten 230V Schnitstelle betreien zu können.

Was dringend fehlt ist die Möglichkeit, die Schaltzeiten über Tasten/Display/WebIface zu stellen, auch wird es Schaltzeiten abhängig vom Wochentag geben. Dafür kommt eine Menüstruktur rein, die Daten gehen dann ins EEPROM…es gibt noch viel zu tun. Das fällt mir jetzt etwas leichter, da der Hintern wieder warm ist.

Den angehängten Code bitte wirklich als Quick&Dirty sehen, ich bin erst seit ein paar Tagen mit Arduino beschäftigt, völliges Neuland.

Zeitschaltuhr_0.1.0.open.ino (11.7 KB)

agmue:
Hier die korrigierte Fassung ohne Warnungen (IDE 1.6.5).

Dank, ich hatte aber keine Probleme mit der wohl älteren Version von jurs. (IDE 1.8.3)

Gruß Wiki

Hallo,

du brauchst nur in der IDE: Datei > Voreinstellungen > Compiler Warnungen auf "ALLE" setzen Damit schreibt man saubereren Code. ;) Ich selbst nehme jede Warnung ernst. Könnte sich später vielleicht rächen wenn man nicht damit rechnet. Zeilennummern und Codefaltung sind auch nette Features.

Moin,

als Newbie in Sachen Arduino/C sind für mich solche Hinweise überaus hilfreich.

Danke schön.

Gruß Wiki

[edit] Boah, lohnt sich wirklich..... Übersicht besser, Warnungen werden eliminiert (wobei: mit dem vorgeschlagenen Code gibts immer noch Warnungen) [/edit]

Wiki_: (wobei: mit dem vorgeschlagenen Code gibts immer noch Warnungen)

Wenn Du verrätst wo, könnte ich möglicherweise helfen :)

Moin,

wat ne Resonanz. Ich fühl mich direkt wohl hier im Forum, ist nen warmer Empfang.

Also Warnung:

In file included from C:\Users\xxx\Documents\Arduino\Zeitschaltuhr_0.1.1\Zeitschaltuhr_0.1.1.ino:4:0:

sketch\jursRTCtimeEasy.h: In function 'int wdayM(sTime&)':

jursRTCtimeEasy.h:37: error: value computed is not used [-Werror=unused-value]

   (wdayS(time)+6) % 7;

                   ^

jursRTCtimeEasy.h:38: error: no return statement in function returning non-void [-Werror=return-type]

 }

 ^

sketch\jursRTCtimeEasy.h: In function 'boolean summertimeEurope(sTime)':

jursRTCtimeEasy.h:105: error: suggest parentheses around '&&' within '||' [-Werror=parentheses]

  if (time.bMonth==3 && (time.bHour + 24 * time.bDay)>=(1 + time.sTimezone + 24*(31 - (5 * time.iYear /4 + 4) % 7)) || time.bMonth==10 && (time.bHour + 24 * time.bDay)<(1 + time.sTimezone + 24*(31 - (5 * time.iYear /4 + 1) % 7))) 

                     ^

Dank schonmal für die Hilfe, Gruß Wiki

Hallo Jurs,

kannst mal deinen Sketch prüfen was da mit der wdayS Übergabe nicht klappt?

Wie rufe ich den Wochentag auf?

MfG Chris

Wie rufe ich den Wochentag auf?

Bin zwar nicht jurs aber so funktioniert es bei mir. Keine Garantie bin Ardu-Anfänger.

void output()
// Ausgabe formatieren und an LCD, Serielle und OUTPUT Pins senden
{
  const char* weekDayGerman[] = {"So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."}; // Texte für Tage
  const char* weekDay = weekDayGerman[wdayS(localTime)];       // Text zuweisen
  if (localTime.bSecond % 10 == 0) Serial.println(weekDay);    // weekDay alle 10 Sec. als Text  ausgeben
  lcd.setCursor(0, 0);
  lcd.print(weekDay);

Wiki_: Also Warnung:

Das sind genau die Stellen, die ich verbessert habe. Mit meiner Variante sollten die Warnungen weg sein.

Ich hatte seinerzeit jurs die Verbesserungen angeboten, er hat sie aber mit der Bemerkung, er hätte das nur für das Thema gemacht, abgelehnt. Er ist möglicherweise inzwischen in Rente :(

Smithi: const char* weekDay = weekDayGerman[wdayS(localTime)]; // Text zuweisen

Hmm, da warn se wieder meine Probleme... bekomme immer die Meldung

dateTimeLibEasyDemoSunrise_mit_I2c:68: error: 'weekday' was not declared in this scope lcd.print(weekday); ^ exit status 1 'localTime' was not declared in this scope

In "jursRTCtimeEasy.h" habe ich folgendes stehen

int wdayS(sTime &time)
{ // Calculate day of week, Sunday == 0. 
  int adjustment, mm, yy;
  adjustment = (14 - time.bMonth) / 12;
  mm = time.bMonth + 12 * adjustment - 2;
  yy = time.iYear - adjustment;
  return (time.bDay + (13 * mm - 1) / 5 + yy + yy / 4 - yy / 100 + yy / 400) % 7;
}

Wie rufe ich im eigentlichen sketch wdays auf?

Z.B.

lcd.print(wdayS);

funzt nicht bei mir >:(

ohne jetzt die Lib zu kennen, solltest Du time als Parameter mitgeben.

lcd.print(wdayS(time));
[code]
Wenn die Zeitvariable bei Dir time heißt. Es kann auch date sein.

Gruß Tommy

Wenn ich das Beispiel von jurs Beitrag #87 nehme,

da steht in jursRTCtimeEasy folgendes

int wdayS(sTime &time);
int wdayS(sTime &time)
{ // Calculate day of week, Sunday == 0. 
  int adjustment, mm, yy;
  adjustment = (14 - time.bMonth) / 12;
  mm = time.bMonth + 12 * adjustment - 2;
  yy = time.iYear - adjustment;
  return (time.bDay + (13 * mm - 1) / 5 + yy + yy / 4 - yy / 100 + yy / 400) % 7;
}

int wdayM(sTime &time);
int wdayM(sTime &time)
{ // Calculate day of week, Monday == 0. 
  (wdayS(time)+6) % 7;
}[/code

aber wdayS bzw wdayM lässt sich nicht aufrufen

weder so
[code]
lcd.print (wdayS); // noch mit 
lcd.print(wdayS(sTime &time);

Auch der u.g.Vorschlag von Smithy funktioniert leider nicht

  const char* weekDayGerman[] = {"So.", "Mo.", "Di.", "Mi.", "Do.", "Fr.", "Sa."}; // Texte für Tage
  const char* weekDay = weekDayGerman[wdayS(localTime)];       
// auch mit änderung in ->const char* weekDay = weekDayGerman[wdayS(sTime &time)];
  if (localTime.bSecond % 10 == 0) Serial.println(weekDay);    // weekDay alle 10 Sec. als Text  ausgeben
  lcd.setCursor(0, 0);
  lcd.print(weekDay);

agmue: Das sind genau die Stellen, die ich verbessert habe. Mit meiner Variante sollten die Warnungen weg sein.

Moin,

sorry, aber diesen Abbruch bekomme ich mit Deiner verbesserten Version genauso.

Da ich meine unterschiedlichen Versionen während der Entwicklung einzeln speichere und die included libraries aus dem Unterverzeichnis von der IDE immer mit in den neuen Ordner kopiert wird (in diesem Fall die 'jurs.h'), hab ich alle 'jurs.h' alter Art gelöscht, schliesslich blick ich noch nicht so recht durch, von welcher Stelle wann die IDE sich was heranzieht (hatte in meinen derzeitgen ersten Tagen so die eine oder andre Überraschung).

Die Warnmeldung bleibt.

Gruß Wiki