Sec seit 1970 aus DS3231 RTC mit DS3231RTC auslesen

Hallo,
nutze die DS3231 RTC und diese Library
https://github.com/JChristensen/DS3232RTC/blob/master/DS3232RTC.h

Mit welcher Funtiopn bekomme ich die Sekunden seit 1970 von der RTC?
Ich vermute es ist now(), aber in der time.cpp

heisst es in Zeile 251:
// calculate number of seconds passed since last call to now()

Kann es leider momentan noch nicht testen.
Vielen Dank!

Hallo,
ich kenne deine Lib nicht, bei meiner geht es mit now.unixtime.

Oder aber garnicht mit eingebaut, wofür auch zwingend? Warum berechnest du das nicht einfach selber?
Die Schaltjahre sind fix. Entweder in einem 2 dimensionalen Array legen oder aber bestimmen.

Wenn aktJahr > 1972 =>((aktJahr-1972) / 4)+1)
Ansonsten 0

In der Time Lib ist time_t immer die Sekunden seit 1970

Hallo zusammen

Ich habe diesen Cod zum Zeiteinstellen benutzt

    #include <Wire.h>
    const int DS3231 = 0x68; // Address of DS1307 see data sheets
    const char* days[] =
    {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    const char* months[] =
    {"January", "February", "March", "April", "May", "June", "July", "August","September", "October", "November", "December"};
     
    // Initializes all values: 
    byte second = 0;
    byte minute = 0;
    byte hour = 0;
    byte weekday = 0;
    byte monthday = 0;
    byte month = 0;
    byte year = 0;

    void setup() {
      Wire.begin();
      Serial.begin(9600);
      delay(2000); // This delay allows the MCU to read the current date and time.
     
      Serial.print("The current date and time is: ");
      printTime();
      Serial.println("Please change to newline ending the settings on the lower right of the Serial Monitor");
      Serial.println("Would you like to set the date and time now? Y/N");
     
      while (!Serial.available()) delay(10);
      if (Serial.read() == 'y' || Serial.read() == 'Y')
     
      // This set of functions allows the user to change the date and time
      {
        Serial.read();
        setTime();
        Serial.print("The current date and time is now: ");
        printTime();
      }
     
     
      Serial.println("Thank you.");
    }

    // Continuous function for converting bytes to decimals and vice versa
    void loop() {
    }
    byte decToBcd(byte val) {
      return ((val/10*16) + (val%10));
    }
    byte bcdToDec(byte val) {
      return ((val/16*10) + (val%16));
    }


    // This set of codes is allows input of data
    void setTime() {
      Serial.print("Please enter the current year, 00-99. - ");
      year = readByte();
      Serial.println(year);
      Serial.print("Please enter the current month, 1-12. - ");
      month = readByte();
      Serial.println(months[month-1]);
      Serial.print("Please enter the current day of the month, 1-31. - ");
      monthday = readByte();
      Serial.println(monthday);
      Serial.println("Please enter the current day of the week, 1-7.");
      Serial.print("1 Sun | 2 Mon | 3 Tues | 4 Weds | 5 Thu | 6 Fri | 7 Sat - ");
      weekday = readByte();
      Serial.println(days[weekday-1]);
      Serial.print("Please enter the current hour in 24hr format, 0-23. - ");
      hour = readByte();
      Serial.println(hour);
      Serial.print("Please enter the current minute, 0-59. - ");
      minute = readByte();
      Serial.println(minute);
      second = 0;
      Serial.println("The data has been entered.");
     
      // The following codes transmits the data to the RTC
      Wire.beginTransmission(DS3231);
      Wire.write(byte(0));
      Wire.write(decToBcd(second));
      Wire.write(decToBcd(minute));
      Wire.write(decToBcd(hour));
      Wire.write(decToBcd(weekday));
      Wire.write(decToBcd(monthday));
      Wire.write(decToBcd(month));
      Wire.write(decToBcd(year));
      Wire.write(byte(0));
      Wire.endTransmission();
      // Ends transmission of data
    }


    byte readByte() {
      while (!Serial.available()) delay(10);
      byte reading = 0;
      byte incomingByte = Serial.read();
      while (incomingByte != '\n') {
        if (incomingByte >= '0' && incomingByte <= '9')
          reading = reading * 10 + (incomingByte - '0');
        else;
        incomingByte = Serial.read();
      }
      Serial.flush();
      return reading;
    }


    void printTime() {
      char buffer[3];
      const char* AMPM = 0;
      readTime();
      Serial.print(days[weekday-1]);
      Serial.print(" ");
      Serial.print(months[month-1]);
      Serial.print(" ");
      Serial.print(monthday);
      Serial.print(", 20");
      Serial.print(year);
      Serial.print(" ");
      if (hour > 12) {
        hour -= 12;
        AMPM = " PM";
      }
      else AMPM = " AM";
      Serial.print(hour);
      Serial.print(":");
      sprintf(buffer, "%02d", minute);
      Serial.print(buffer);
      Serial.println(AMPM);
    }


    void readTime() {
      Wire.beginTransmission(DS3231);
      Wire.write(byte(0));
      Wire.endTransmission();
      Wire.requestFrom(DS3231, 7);
      second = bcdToDec(Wire.read());
      minute = bcdToDec(Wire.read());
      hour = bcdToDec(Wire.read());
      weekday = bcdToDec(Wire.read());
      monthday = bcdToDec(Wire.read());
      month = bcdToDec(Wire.read());
      year = bcdToDec(Wire.read());
    }

kannst du auf Serialmonitor Datum und Uhrzeit einstellen.

Serialmonitor auf Neue Zeile stellen.

Gruß Martin

sschultewolter:
Warum berechnest du das nicht einfach selber?

Weil es ja schon da ist :wink: So geht es mit der von mir verwendeten Lib:

//get total sec (tsec) since 1970 from rtc  
      time_t tsec;
      tsec = RTC.get();
      Serial.print(F("tsec: "));
      Serial.print(tsec);
      Serial.println();
      //***

Serenifly:
In der Time Lib ist time_t immer die Sekunden seit 1970

Danke, das scheint hier auch so zu funktionieren.

sschultewolter:
Wenn aktJahr > 1972 =>((aktJahr-1972) / 4)+1)
Ansonsten 0

Schöne, kurze Formel, Danke, auch wenn ich sie jetzt gar nicht nutze.

sima6201:
Ich habe diesen Cod zum Zeiteinstellen benutzt

Danke, aber einstellen geht auch schon sehr schön. Wollte nur die voranschreitenden unsigned long Sekunden haben um damit meinen Task-Scheduler zu "füttern".


An der Stelle möchte ich noch kurz erwähnen, dass ich gerne Tasks nicht nur im Sek, sondern auch im ms Bereich Steuern möchte. Hierfür Synchronisieren ich alle paar Sekunden mit dem Sekunden-getriggerten Rechtecksignal der RTC (prinzipiell):

//synchrone ms erhalten
unsigned int get_ms(){
  return ((millis() - _ms_last_rtc) % 1000);    // return syncron ms (0-999)
}

//ms von zeit zu zeit mit Arduino Interrupt synchronisieren 

//ISR zum Sekunden-getriggertes Rechtecksignal der RTC
void ISR_RTC(){
 
               _ms_last_rtc = millis();    // save now, for _ms sync with RTC
 
}

Ist am Ende nicht ganz einfach da immer 2 Variablem im Task Scheduler abgefragt werden müssen und weil mein Arduino je Sek ca. 1-2ms zu langsam ist, heißt es kommt fast nie die ms=998 und 999 vor.

Vielleicht hat da ja jemand einen Tip/ Idee wie man es machen könnte oder jemand schon eleganter/besser gemacht hat.
Vielen Dank!