RTC: Uhrzeit und DOW einstellen geht, aber das Datum nicht

Hallo,
ich möchte mir fürs Moped einen Drehzahlmesser mit Tankanzeige, Uhrzeit und Leerlaufanzeige basteln.
Ich hatte seinerzeit dazu auch schonmal eine Frage im Forum gestellt, was sich aber erledigt hat.

Die Hardware steht soweit (bin da schons seit ca. einem Jahr am Basteln) und es funktioniert auch erstmal soweit ganz gut.
Jetzt wollte ich eine Sommer- und Winterzeiterkennung der RTC einfügen und habe da auch zügig etwas Nützliches entdeckt und auch direkt abgeändert, so wie ich mir das halt vorstelle. Zum Testen der Funktion komme ich allerdings nicht (bzw. es wird wegen des gespeicherten Datums dauernd die Sommerzeit angezeigt), weil ich das Problem habe, dass zwar die Uhrzeit seit bestimmt einem halben Jahr problemlos ohne Schwankungen läuft, sich aber das Datum für die Erkennung der Sommer-/Winterzeit nicht umstellen lässt. Es steht immer auf dem “03.08.2000”, egal was ich mache. Den Wochentag (“DOW”) und die Uhrzeit umstellen funktioniert, aber das Datum will sich einfach nicht ändern lassen.

An dieser Stelle sollte eigentlich der Code kommen, aber diese blöde 9000 Zeichen Begrenzung macht mir einen Strich durch die Rechnung >:( Ich hab mal sämtliche Kommentare gelöscht und nur einen Teil davon gepostet:

#include <DS3231.h>
DS3231  rtc(SDA, SCL);
#include <SPI.h>
#include <Wire.h>
#include <EEPROM.h>                                                                   
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4                                                                  
Adafruit_SSD1306 display(OLED_RESET);

// Pinbelegungen 
int impulsPin           = 2;                                                          
int helligkeit          = 3;                                                          
int shiftPin            = 4;                                                          
int storePin            = 5;                                                          
int dataPin             = 6;                                                          
int zehn                = 7;                                                          
int hundert             = 8;                                                          
int tausend             = 9;                                                          
int fotodiode           = A2;                                                         
int Fuellstand          = A0;                                                         
int Leerlaufanzeige     = 10;                                                         

// Variablen 
Time t;
volatile int drehimpuls = 0;                                                          
int drehzahl            = 0;                                                          
int LEDintensitaet      = 0;                                                          
int LEDintensitaet_alt  = 0;                                                          
int sensorWert          = 0;                                                          
int Fuellstandswerte[5] = {0,1,2,3,4};                                                
int tankWert            = 0;                                                          
byte tankWert_alt       = 0;                                                          
int checkintervall      = 3000;                                                       
int messintervall       = 1500;                                                       
int stunden;
int minuten;
int minuten_alt;
int Jahr;
int Monat;
int Tag;
byte Wochentag;
byte Sommerzeit         = 0;
                   
int Leerlaufhelligkeit;                                                               
unsigned long zeit;                                                                   
unsigned long drehzeit;                                                               

byte zahl[10] =   {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111}; 

void setup()                                                                          
{ pinMode (storePin, OUTPUT);                             
  pinMode (shiftPin, OUTPUT);
  pinMode (dataPin, OUTPUT);
  pinMode (helligkeit, INPUT_PULLUP);
  pinMode (fotodiode, INPUT);
  pinMode (impulsPin, INPUT_PULLUP);
  pinMode (tausend, OUTPUT);
  pinMode (hundert, OUTPUT);
  pinMode (zehn, OUTPUT);
  pinMode (Leerlaufanzeige, OUTPUT);
  pinMode(Fuellstand, INPUT_PULLUP);
  attachInterrupt(0, zuendfunke, RISING);                                             
  zeit = drehzeit = millis();                                                         
  rtc.begin();
  rtc.setDOW(SUNDAY);                                                                 
  rtc.setTime(11, 37, 0);                                                             
  rtc.setDate(2, 17, 2019);                                                           
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);                                          
  sensorWert = analogRead(fotodiode)/4;                                               
  switch (sensorWert)                                                                 
  { case   0 ...  90: LEDintensitaet = 215; break;                                    
    case  91 ... 270: LEDintensitaet = 0; break;                                      
  }
  tankWert_alt = EEPROM.read(0);                                                      
  uhrzeit();
  if ((Monat>3 && Monat<10)||(Monat==3 && (stunden + 24 * Tag)>=(1 + stunden + 24*(31 - (5 * Jahr /4 + 4) % 7)) || Monat==10 && (stunden + 24 * Tag)<(1 + stunden + 24*(31 - (5 * Jahr /4 + 1) % 7))))
    {Sommerzeit = 1;}
  else 
    Sommerzeit = 0;
  uhrzeit(); 
  Tankmenge();
  OLED();
  minuten_alt = minuten;
  LEDintensitaet_alt = LEDintensitaet;
}

                                                                                      
void zuendfunke()                                                                     
{ drehimpuls++;
}

void uhrzeit()
{ t=rtc.getTime(); 
  stunden = t.hour + Sommerzeit;
  minuten = t.min;
  Jahr    = t.year;
  Monat   = t.mon;
  Tag     = t.date;
Wochentag = t.dow;
}

void OLED()
{ 
  if (LEDintensitaet == 0)
  {display.invertDisplay(true);}
  else display.invertDisplay(false);
display.setTextSize(3);       


  display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1);        
  display.setCursor(20,10);      
  if (Tag < 10)
  {display.print("0");display.print(Tag);}
  else display.print(Tag);
  display.print(".");
  if (Monat < 10)
  {display.print("0"); display.print(Monat);}
  else display.print(Monat);
  display.print(".");
  display.print(Jahr);
  display.print("  ");
  if (stunden < 10)
  {display.print("0");display.print(stunden);}
  else display.print(stunden);
  display.print(":");
  if (minuten < 10)
  {display.print("0"); display.println(minuten);}
  else display.println(minuten);
display.print(Wochentag);

  display.drawRect(0,0,128,8,WHITE);                                                  
  display.fillRect(3,2,2+24*tankWert_alt,4,WHITE);                                   
  display.display(); 
  minuten_alt = minuten;
}

Viele Grüße,
Faddi

Hi

Ich nehme an, daß Dein Datum in setup() schlicht falsch ist und ignoriert wird. Weiter ist Es wenig zielführend, bei JEDEM Aufruf das Datum zu stellen.

Nimm ein Beispiel der RTC, setze damit das Datum und den Wochentag. Dann Deinen Sketch wieder drauf, wo Du das Setzen in setup() ersatzlos streichst - so schlecht ist die RTC nicht, daß Du das Datum nachstellen müsstest.

Wenn Du diese Funktionalität haben möchtest, mache ein eigenes Menü o.Ä. dafür - wirst Du aber NIE benutzen.

MfG

Hi,

danke für deine Antwort.
Das mit dem Beispiel-Sketch probiere ich mal, gute Idee!

→ Mist, funktioniert auch nicht!
Hab erst den Beispiel-Code:

#include <DS3231.h>

// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);

void setup()
{
  // Setup Serial connection
  Serial.begin(115200);
  // Uncomment the next line if you are using an Arduino Leonardo
  //while (!Serial) {}
  
  // Initialize the rtc object
  rtc.begin();
  
  // The following lines can be uncommented to set the date and time
  //rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(12, 0, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(1, 1, 2014);   // Set the date to January 1st, 2014
}

void loop()
{
  // Send Day-of-Week
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");
  
  // Send date
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");

  // Send time
  Serial.println(rtc.getTimeStr());
  
  // Wait one second before repeating :)
  delay (1000);
}

und danach wieder meinen Code aufgepsielt, natürlich mit dem auskommentiertem Setzen des Datums und Uhrzeit.

Viele Grüße,
Faddi

Da es mehrere unterschiedliche DS3231-Libs gibt, musst Du uns schon einen Link zur verwendeten Lib geben.

Gruß Tommy

Hi,

ich hab das schon so ewig eingebunden, ich musste gerade mal suchen. Ich hab die library von hier:

http://www.rinkydinkelectronics.com/library.php?id=73

Setze dein Datum doch mal zweistellig.

Hi,

meinste die Jahreszahl? Das hatte ich auch schon probiert. Auch in anderer Reihenfolge

Hi

Mal ganz blöd gefragt - bei dem Beispiel-Code, hast Du dort die Teile ent-remt, Die das Datum setzen sollen? In dem gezeigtem Sketch sind beide Zeilen per // zu Kommentaren gemacht - DAS ändert dann natürlich auch weder Datum noch Zeit.

Eigentlich ungewöhnlich, daß die Beispiele einer Lib nicht laufen.

MfG

Einen 17. Monat gibt es nicht.

// Dein Code
rtc.setDate(2, 17, 2019);
// aus der DS3231.h --> Year >= 2000
void    setDate(uint8_t date, uint8_t mon, uint16_t year);

Gruß Tommy

Hi,

die Kommentierung hatte ich nicht drin. Ich hatte im Nachhinein das Codebeispiel nochmal geöffnet (vorher nicht gespeichert), um den Code hier zu posten.

ABER: Wie eigentlich (in meinen Fällen zumindest) sitzt das Problem davor :roll_eyes:

Ich habe das Problem entdeckt und gelöst. Die Formatierung des Datums war nicht MM TT JJJJ, sondern TT MM JJJJ. Da ich das seit gestern probierte und es keine 16 Monate gibt, wurde das Datum einfach nicht übernommen. Gerade eben habe ich einfach mal den 1, 2, 2019 getestet und bekam statt dem gedachten Datum 2.1.2019 doch den 1.2.2019 heraus.

Der Fall hat sich somit erledigt. Vielen Dank für die Antworten!

Viele Grüße, Faddi

PS: Man, man, man ... hätte ich auch eher drauf kommen können :astonished:

PPS: Da war Tommy noch etwas schneller als ich

Ein Blick in die Headerdateien der Libs löst viele Probleme.

Gruß Tommy

Ich dachte, ich hätte das gestern auch schonmal so herum ausprobiert, deswegen habe ich das gar nicht weiter aufm Schirm gehabt ... naja ... :roll_eyes:

Hi

Schön, daß das Problem gefunden und gelöst werden konnte. Da sehe ich aber eine Mitschuld in den Beispielen der Lib. Klar kann man sich die Innereien der Lib auch anschauen - vll. sollta Man Das sogar - aber wenn im Beispiel eben nicht Monat=Tag=1 ist, dann wird aus dem Beispiel und dem dahinter stehendem Kommentar DIREKT klar, welche Zahl was zu bedeuten hat. Als Datum wären auch als Tag Werte über 12 möglich, um das Beispiel eindeutig zu machen. Gleiches für die Uhrzeit, daß mit 0,0,0 wohl Mitternacht gemeint sein dürfte, ist mir klar, aber welche Null welcher Part dabei ist, eher nicht.

MfG

Faddi:
Hi,

ich hab das schon so ewig eingebunden, ich musste gerade mal suchen. Ich hab die library von hier:

DS3231 - Rinky-Dink Electronics

Auf der verlinkten Seite steht eine Warnung bezüglich der Wire-Bibliothek, die Du ernst nehmen solltest. Eine alternative RTC-Bibliothek mit Nutzung der üblichen Wire-Bibliothek erscheint mir ratsam. Oder Du machst es ohne RTC-Bibliothek wie hier beschrieben: Tutorial – Using DS1307 and DS3231 Real-time Clock Modules with Arduino