Wie Sketch von RtcDS1307 auf DS3231 ändern?

Hallo an alle,
Ich würde gerne diesen Code mit einem DS3231 betreiben. Ja Ich weiß es geht auch mit dem RtcDS1307 aber ich will den Code in ein anderes Sketch einbauen und dieser benutzt den DS3231
Wäre nett wenn mir jemand unter die Arme greift. Bin kein Programmierer :wink:

Hier der Code:

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <RtcDS1307.h>
#include <RTClib.h>

RTC_DS1307 RTC;

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 5, /* data=*/ 4);   // ESP32 Thing, HW I2C with pin remapping

void setup () {
  u8g2.begin();
//  Serial.begin (115200);
  Wire.begin();
}

void loop () {
  DateTime now = RTC.now();
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.setFont(u8g2_font_crox2hb_tr);  // choose a suitable font
  u8g2.setCursor(24,10);
  if (now.day() < 10) { u8g2.print("0");}
  u8g2.print(now.day(), DEC);
  u8g2.print('.');
  if (now.month() < 10) { u8g2.print("0");}
  u8g2.print(now.month(), DEC);
  u8g2.print('.');
  u8g2.print(now.year(), DEC);
  
  u8g2.setFont(u8g2_font_helvR24_tn);
  u8g2.setCursor(2,43);
  if (now.hour() < 10) { u8g2.print("0");}
  u8g2.print(now.hour(), DEC);
  u8g2.print(':');
  if (now.minute() < 10) { u8g2.print("0");}
  u8g2.print(now.minute(), DEC);
  u8g2.print(':');
  if (now.second() < 10) { u8g2.print("0");}
  u8g2.print(now.second(), DEC);

  u8g2.sendBuffer();          // transfer internal memory to the display
  delay (1000);
}

Die Uhren Funktionen der beiden RTC sind gleich von den Registern her. Einen Unterschied gibt es noch das man nach dem stellen die 32er RTC starten muss die 1307 nicht. Wenn der 1307 den Startbefehl bekommt passiert nix also "ungefährlich". Das sind meine Erfahrungen bei einem Umstieg von der ungenauen 1307 auf die 3213. Solltest du die Alarm Funktionen der 32er RTC nutzen in dem andren Sketch ist der Umbau größer. Gruß DerDani

robiv8: Ich würde gerne diesen Code mit einem DS3231 betreiben.

Es ist aber auch davon abhängig, welche Library du für die DS3231 einsetzt. Da es sehr viele unterschiede gibt, ist es nicht sicher das es sofort funktioniert. Anhand der Beispiel in der Library kannst du es sehr schnell herausfinden.

Es ist aber auch davon abhängig, welche Library du für die DS3231 einsetzt.
Da es sehr viele unterschiede gibt, ist es nicht sicher das es sofort funktioniert.
Anhand der Beispiel in der Library kannst du es sehr schnell herausfinden.

Die Uhren Funktionen der beiden RTC sind gleich von den Registern her.

Wenn die DS3231 schon läuft, kannst du vermutlich deinen vorhandenen Sketch mit

#include <RtcDS1307.h>
#include <RTClib.h>
RTC_DS1307 RTC;

weiter nutzen. ( Keine Ahnung, welche Libraries das tatsächlich sind. )

RTC.Now() sollte die Uhrzeit auch aus einer DS3231 lesen können, wenns weiter nichts ist :wink:

Danke für die Infos
Ich habe diesen Sketch und will da eigentlich nur mein Oled Display einbauen die mir die Zeit anzeigt. Std:Min:Sek
Sonst nix. Und diese soll es sich vom RTC bzw. DS3231 holen das sich Updated wenn es mit dem Wlan verbunden ist.
Was ja auch der eigentliche Sketch macht :slight_smile:
Hier rein:

#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h> // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);
#define countof(a) (sizeof(a) / sizeof(a[0]))


#define countof(a) (sizeof(a) / sizeof(a[0]))

const char ssid[] = "DaisyNetGastzugang";  //  your network SSID (name)
const char pass[] = "1504Split1504";       // your network password

// NTP Servers:
//static const char ntpServerName[] = "ptbtime1.ptb.de";
static const char ntpServerName[] = "de.pool.ntp.org";
//IPAddress timeServer(192, 53, 103, 108);  //ptbtime1.ptb.de //(192, 43, 244, 18);
//static const char ntpServerName[] = "time.nist.gov";

const int timeZone = 2;     // Central European Time
//const int timeZone = -5;  // Eastern Standard Time (USA)

WiFiUDP Udp;
unsigned int localPort = 8888;  // local port to listen for UDP packets

time_t getNtpTime();
void digitalClockDisplay();
void printDigits(int digits);
void sendNTPpacket(IPAddress &address);

void setup()
{
  Serial.begin(115200);
  while (!Serial) ; // Needed for Leonardo only
  delay(250);
  Rtc.Begin();
  Serial.println("TimeNTP Example");
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" ");
  Serial.print("IP number assigned by DHCP is ");
  Serial.println(WiFi.localIP());
  Serial.println("Starting UDP");
  Udp.begin(localPort);
  Serial.print("Local port: ");
  Serial.println(Udp.localPort());
  Serial.println("waiting for sync");
  setSyncProvider(getNtpTime);
  //setSyncInterval(300);
  if(timeStatus() != timeNotSet){
    digitalClockDisplay();
    Serial.println("here is another way to set rtc");
      time_t t = now();
      char d_mon_yr[12];
      snprintf_P(d_mon_yr, countof(d_mon_yr), PSTR("%s %02u %04u"), monthShortStr(month(t)), day(t), year(t));
      Serial.println(d_mon_yr);
      char tim_set[9];
      snprintf_P(tim_set, countof(tim_set), PSTR("%02u:%02u:%02u"), hour(t), minute(t), second(t));
      Serial.println(tim_set);
      Serial.println("Now its time to set up rtc");
      RtcDateTime compiled = RtcDateTime(d_mon_yr, tim_set);
       printDateTime(compiled);
       Serial.println("");

        if (!Rtc.IsDateTimeValid()) 
    {
        // Common Cuases:
        //    1) first time you ran and the device wasn't running yet
        //    2) the battery on the device is low or even missing

        Serial.println("RTC lost confidence in the DateTime!");

        // following line sets the RTC to the date & time this sketch was compiled
        // it will also reset the valid flag internally unless the Rtc device is
        // having an issue

       
    }
     Rtc.SetDateTime(compiled);
     RtcDateTime now = Rtc.GetDateTime();
    if (now < compiled) 
    {
        Serial.println("RTC is older than compile time!  (Updating DateTime)");
        Rtc.SetDateTime(compiled);
    }
    else if (now > compiled) 
    {
        Serial.println("RTC is newer than compile time. (this is expected)");
    }
    else if (now == compiled) 
    {
        Serial.println("RTC is the same as compile time! (not expected but all is fine)");
    }

    // never assume the Rtc was last configured by you, so
    // just clear them to your needed state
    Rtc.Enable32kHzPin(false);
    Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone); 
}

}

//time_t prevDisplay = 0; // when the digital clock was displayed

void loop()
{
  if (!Rtc.IsDateTimeValid()) 
    {
        // Common Cuases:
        //    1) the battery on the device is low or even missing and the power line was disconnected
        Serial.println("RTC lost confidence in the DateTime!");
    }
    
    Serial.println("ready to get date time");

    RtcDateTime now = Rtc.GetDateTime();
    printDateTime(now);
    Serial.println();
    delay(5000);
  
}

void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(".");
  Serial.print(month());
  Serial.print(".");
  Serial.print(year());
  Serial.println();
 
}

void printDigits(int digits)
{
  // utility for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

/*-------- NTP code ----------*/

const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

time_t getNtpTime()
{
  IPAddress ntpServerIP; // NTP server's ip address

  while (Udp.parsePacket() > 0) ; // discard any previously received packets
  Serial.println("Transmit NTP Request");
  // get a random server from the pool
  WiFi.hostByName(ntpServerName, ntpServerIP);
  Serial.print(ntpServerName);
  Serial.print(": ");
  Serial.println(ntpServerIP);
  sendNTPpacket(ntpServerIP);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) {
      Serial.println("Receive NTP Response");
      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
      unsigned long secsSince1900;
      // convert four bytes starting at location 40 to a long integer
      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }
  Serial.println("No NTP Response :-(");
  return 0; // return 0 if unable to get the time
}

// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12] = 49;
  packetBuffer[13] = 0x4E;
  packetBuffer[14] = 49;
  packetBuffer[15] = 52;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

void printDateTime(const RtcDateTime& dt)
{
    char datestring[20];

    snprintf_P(datestring, 
            countof(datestring),
            PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
            dt.Month(),
            dt.Day(),
            dt.Year(),
            dt.Hour(),
            dt.Minute(),
            dt.Second() );
    Serial.print(datestring);
}

soll das:

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <RtcDS1307.h>
#include <RTClib.h>
#define RtcDS1307_ADDRESSE 0x68

RTC_DS1307 RTC;

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 5, /* data=*/ 4);

void setup () {
  u8g2.begin();
  Wire.begin();
}

void loop () {
  DateTime now = RTC.now();
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.setFont(u8g2_font_crox2hb_tr);  // choose a suitable font
  u8g2.setCursor(24,10);
  if (now.day() < 10) { u8g2.print("0");}
  u8g2.print(now.day(), DEC);
  u8g2.print('.');
  if (now.month() < 10) { u8g2.print("0");}
  u8g2.print(now.month(), DEC);
  u8g2.print('.');
  u8g2.print(now.year(), DEC);
  u8g2.setFont(u8g2_font_helvR24_tn);
  u8g2.setCursor(2,43);
  if (now.hour() < 10) { u8g2.print("0");}
  u8g2.print(now.hour(), DEC);
  u8g2.print(':');
  if (now.minute() < 10) { u8g2.print("0");}
  u8g2.print(now.minute(), DEC);
  u8g2.print(':');
  if (now.second() < 10) { u8g2.print("0");}
  u8g2.print(now.second(), DEC);

  u8g2.sendBuffer();          // transfer internal memory to the display
  delay (1000);
}

Ich weiß nur nicht wie bzw. wo ich Anfangen soll?

robiv8:
Ich weiß nur nicht wie bzw. wo ich Anfangen soll?

Da du die Zeit jetzt schon auf dem Seriellen Monitor anzeigst, musst du doch die Anzeige nur auf da OLED umleiten. Somit brauchst du das OLED nur in den neuen Sketch integrieren.

Ich verstehe natürlich dein Problem, kopierte Sketche sind immer schwer zu verarbeiten, wenn man diese nicht versteht. Aber dann solltest du das einfach lernen.

robiv8:
Ich weiß nur nicht wie bzw. wo ich Anfangen soll?

Möglicherweise so (getestet mit Mega2560):

#include <SPI.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 5, /* data=*/ 4);   // ESP32 Thing, HW I2C with pin remapping

void setup () {
  u8g2.begin();
  Wire.begin();
  Rtc.Begin();
}

void loop () {
  RtcDateTime now = Rtc.GetDateTime();
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.setFont(u8g2_font_crox2hb_tr);  // choose a suitable font
  u8g2.setCursor(24, 10);
  if (now.Day() < 10) {
    u8g2.print("0");
  }
  u8g2.print(now.Day(), DEC);
  u8g2.print('.');
  if (now.Month() < 10) {
    u8g2.print("0");
  }
  u8g2.print(now.Month(), DEC);
  u8g2.print('.');
  u8g2.print(now.Year(), DEC);

  u8g2.setFont(u8g2_font_helvR24_tn);
  u8g2.setCursor(2, 43);
  if (now.Hour() < 10) {
    u8g2.print("0");
  }
  u8g2.print(now.Hour(), DEC);
  u8g2.print(':');
  if (now.Minute() < 10) {
    u8g2.print("0");
  }
  u8g2.print(now.Minute(), DEC);
  u8g2.print(':');
  if (now.Second() < 10) {
    u8g2.print("0");
  }
  u8g2.print(now.Second(), DEC);

  u8g2.sendBuffer();          // transfer internal memory to the display
  delay (1000);
}

Der Sketch verwendet 10.778 Bytes (4%) des Programmspeicherplatzes. Das Maximum sind 253.952 Bytes.
Globale Variablen verwenden 1.490 Bytes (18%) des dynamischen Speichers, 6.702 Bytes für lokale Variablen verbleiben. Das Maximum sind 8.192 Bytes.

Danke vielmals für die Tips, Ich werde das mal am Wochenende versuchen und Berichte dann.

robiv8:
… die Zeit anzeigt. Std:Min:Sek Sonst nix.

Dann kannst Du Speicher sparen:

#include <SPI.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);

//U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 5, /* data=*/ 4);   // ESP32 Thing, HW I2C with pin remapping
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0);

void setup () {
  u8g2.begin();
  Rtc.Begin();
}

void loop () {
  u8g2.firstPage();
  do {
    RtcDateTime now = Rtc.GetDateTime();
    u8g2.setFont(u8g2_font_crox2hb_tn);  // choose a suitable font
    u8g2.setCursor(24, 10);
    ausgabe(now.Day());
    u8g2.print('.');
    ausgabe(now.Month());
    u8g2.print('.');
    u8g2.print(now.Year(), DEC);

    u8g2.setFont(u8g2_font_helvR24_tn);
    u8g2.setCursor(2, 43);
    ausgabe(now.Hour());
    u8g2.print(':');
    ausgabe(now.Minute());
    u8g2.print(':');
    ausgabe(now.Second());
  } while ( u8g2.nextPage() );

  delay (1000);
}

void ausgabe(uint8_t zahl){
   if (zahl < 10) {
      u8g2.print('0');
    }
    u8g2.print(zahl, DEC);
}

Der Sketch verwendet 9.630 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 253.952 Bytes.
Globale Variablen verwenden 592 Bytes (7%) des dynamischen Speichers, 7.600 Bytes für lokale Variablen verbleiben. Das Maximum sind 8.192 Bytes.

Ich Danke euch Vielmals! :slight_smile:
Ich habs hinbekommen.
Dank des Winks mit dem Zaunpfahl von "HotSystem" und nicht zuletzt der Helfende Code von "agmue"

Danke Danke Danke
Einfach ein Klasse Forum hier 8)

Ich teste jetzt noch ein wenig rum und poste dann den fertigen Code hier rein falls es jemand nachbauen möchte.

robiv8: Ich Danke euch Vielmals! :) Ich habs hinbekommen. Dank des Winks mit dem Zaunpfahl von "HotSystem" und nicht zuletzt der Helfende Code von "agmue"

Danke Danke Danke Einfach ein Klasse Forum hier 8)

Ich teste jetzt noch ein wenig rum und poste dann den fertigen Code hier rein falls es jemand nachbauen möchte. .....

Das interessiert sicher einige Mitleser hier und vielen Dank für die Rückmeldung.

Funktioniert soweit ganz gut, hab nur noch 1 Problem.
Wenn das Wlan nicht an ist sucht es sich einen Ast ab und die Zeit wird auch nicht angezeigt.
Es soll aber die Zeit vom DS3231 Anzeigen auch wenn mal kein Wlan vorhanden ist.
Hintergrund ist der das ich mir diese Uhr ins Ferienhaus mitnehmen will aber es dort kein Wlan gibt.
Zum Syncen alle paar Monate kann ich dann mein Handy benutzen.

Gibt es da eine möglichkeit?

Hier der Jetzige Code:

#include <SPI.h>
#include <U8g2lib.h>
#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h> // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);
#define countof(a) (sizeof(a) / sizeof(a[0]))

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 5, /* data=*/ 4);   //
//U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0);

const char ssid[] = "meinWlan";  //  your network SSID (name)
const char pass[] = "meinPasswort";       // your network password

// NTP Servers:
//static const char ntpServerName[] = "ptbtime1.ptb.de";
static const char ntpServerName[] = "de.pool.ntp.org";
//IPAddress timeServer(192, 53, 103, 108);  //ptbtime1.ptb.de //(192, 43, 244, 18);


const int timeZone = 2;     // Central European Time
//const int timeZone = -5;  // Eastern Standard Time (USA)

WiFiUDP Udp;
unsigned int localPort = 8888;  // local port to listen for UDP packets

time_t getNtpTime();
void digitalClockDisplay();
void printDigits(int digits);
void sendNTPpacket(IPAddress &address);

void setup()
{
  u8g2.begin();
  Wire.begin();
  Serial.begin(115200);
  //while (!Serial) ; // Needed for Leonardo only
  delay(250);
  Rtc.Begin();
  Serial.println("TimeNTP Example");
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, pass);
  
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.print(".");
  }
  
  Serial.println(" ");
  Serial.print("IP number assigned by DHCP is ");
  Serial.println(WiFi.localIP());
  Serial.println("Starting UDP");
  Udp.begin(localPort);
  Serial.print("Local port: ");
  Serial.println(Udp.localPort());
  Serial.println("waiting for sync");
  setSyncProvider(getNtpTime);
  //setSyncInterval(300);
  if(timeStatus() != timeNotSet){
    digitalClockDisplay();
    Serial.println("here is another way to set rtc");
      time_t t = now();
      char d_mon_yr[12];
      snprintf_P(d_mon_yr, countof(d_mon_yr), PSTR("%s %02u %04u"), monthShortStr(month(t)), day(t), year(t));
      Serial.println(d_mon_yr);
      char tim_set[9];
      snprintf_P(tim_set, countof(tim_set), PSTR("%02u:%02u:%02u"), hour(t), minute(t), second(t));
      Serial.println(tim_set);
      Serial.println("Now its time to set up rtc");
      RtcDateTime compiled = RtcDateTime(d_mon_yr, tim_set);
       printDateTime(compiled);
       Serial.println("");

        if (!Rtc.IsDateTimeValid()) 
    {
        // Common Cuases:
        //    1) first time you ran and the device wasn't running yet
        //    2) the battery on the device is low or even missing

        Serial.println("RTC lost confidence in the DateTime!");

        // following line sets the RTC to the date & time this sketch was compiled
        // it will also reset the valid flag internally unless the Rtc device is
        // having an issue
       
    }
     Rtc.SetDateTime(compiled);
     RtcDateTime now = Rtc.GetDateTime();
    if (now < compiled) 
    {
        Serial.println("RTC is older than compile time!  (Updating DateTime)");
        Rtc.SetDateTime(compiled);
    }
    else if (now > compiled) 
    {
        Serial.println("RTC is newer than compile time. (this is expected)");
    }
    else if (now == compiled) 
    {
        Serial.println("RTC is the same as compile time! (not expected but all is fine)");
    }

    // never assume the Rtc was last configured by you, so
    // just clear them to your needed state
    Rtc.Enable32kHzPin(false);
    Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone); 
}
}

time_t prevDisplay = 0; // when the digital clock was displayed

void loop()
{
  if (!Rtc.IsDateTimeValid()) 
    {
        // Common Cuases:
        //    1) the battery on the device is low or even missing and the power line was disconnected
        Serial.println("RTC lost confidence in the DateTime!");
    }
    
    Serial.println("ready to get date time");

    RtcDateTime now = Rtc.GetDateTime();
    printDateTime(now);
    Serial.println();
    //delay(10000);
    
  // ######################################## OLED u8g2 ############################################
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.setFont(u8g2_font_crox2hb_tr);  // choose a suitable font
  u8g2.setCursor(24, 10);
  if (now.Day() < 10) {
    u8g2.print("0");
  }
  u8g2.print(now.Day(), DEC);
  u8g2.print('.');
  if (now.Month() < 10) {
    u8g2.print("0");
  }
  u8g2.print(now.Month(), DEC);
  u8g2.print('.');
  u8g2.print(now.Year(), DEC);

  u8g2.setFont(u8g2_font_helvR24_tn);
  u8g2.setCursor(2, 43);
  if (now.Hour() < 10) {
    u8g2.print("0");
  }
  u8g2.print(now.Hour(), DEC);
  u8g2.print(':');
  if (now.Minute() < 10) {
    u8g2.print("0");
  }
  u8g2.print(now.Minute(), DEC);
  u8g2.print(':');
  if (now.Second() < 10) {
    u8g2.print("0");
  }
  u8g2.print(now.Second(), DEC);

  u8g2.sendBuffer();          // transfer internal memory to the display
  delay (1000);
}
  // ######################################## OLED u8g2 ############################################
void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(".");
  Serial.print(month());
  Serial.print(".");
  Serial.print(year());
  Serial.println();

}

void printDigits(int digits)
{
  // utility for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

/*-------- NTP code ----------*/

const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

time_t getNtpTime()
{
  IPAddress ntpServerIP; // NTP server's ip address

  while (Udp.parsePacket() > 0) ; // discard any previously received packets
  Serial.println("Transmit NTP Request");
  // get a random server from the pool
  WiFi.hostByName(ntpServerName, ntpServerIP);
  Serial.print(ntpServerName);
  Serial.print(": ");
  Serial.println(ntpServerIP);
  sendNTPpacket(ntpServerIP);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) {
      Serial.println("Receive NTP Response");
      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
      unsigned long secsSince1900;
      // convert four bytes starting at location 40 to a long integer
      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }
  Serial.println("No NTP Response :-(");
  return 0; // return 0 if unable to get the time
}

// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12] = 49;
  packetBuffer[13] = 0x4E;
  packetBuffer[14] = 49;
  packetBuffer[15] = 52;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

void printDateTime(const RtcDateTime& dt)
{
    char datestring[20];

    snprintf_P(datestring, 
            countof(datestring),
            PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
            dt.Month(),
            dt.Day(),
            dt.Year(),
            dt.Hour(),
            dt.Minute(),
            dt.Second() );
    Serial.print(datestring);
}

robiv8: Funktioniert soweit ganz gut, hab nur noch 1 Problem. Wenn das Wlan nicht an ist sucht es sich einen Ast ab und die Zeit wird auch nicht angezeigt. Es soll aber die Zeit vom DS3231 Anzeigen auch wenn mal kein Wlan vorhanden ist. Hintergrund ist der das ich mir diese Uhr ins Ferienhaus mitnehmen will aber es dort kein Wlan gibt. Zum Syncen alle paar Monate kann ich dann mein Handy benutzen.

Gibt es da eine möglichkeit?

  unsigned long timeout = millis();
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
    if (WiFi.status() == WL_NO_SSID_AVAIL && millis() - timeout > 6000) { 
      break;
    }
  }

Gruß Fips

Mir fehlen die Worte :o Das wars! Funzt

Connecting to DaisyNetGastzugang ......... IP number assigned by DHCP is 0.0.0.0 Starting UDP Local port: 8888 waiting for sync Transmit NTP Request de.pool.ntp.org: 0.0.0.0 No NTP Response :-( ready to get date time 04/08/2018 11:54:06

DANKE

Danke Fips

Falls mal jemand einem Laien erklären könnte was diese Zeilen machen bzw. bedeuten! Rein Neugiertechnisch Falls es zu Kompliziert ist oder schlecht bzw. aufwendig zu Erklären wäre es auch nicht schlimm :slight_smile:

Vorschau von was und wann? Und heißt 0 nicht = Nein?

time_t prevDisplay = 0; // when the digital clock was displayed

gib 0 zurück falls Zeit nicht erreichbar?

 }
  Serial.println("No NTP Response :-(");
  return 0; // return 0 if unable to get the time
}

Danke

Hallo,

ich hätte da mal eine Frage zu dem Sketch.

Warum wird die Verbindung zum WiFi nur im Setup geprüft? Was passiert wenn das WLAN unterbrochen wird ohne das der Sketch neu gestartet wird?
Sollte die Prüfung nicht alle x millis stattfinden und dann ggf. die Uhr gestellt werden?

Bedenkt bei euren Antworten bitte, ich bin neu und habe so gut wie keine Ahnung.

Ach, noch eine Frage, welches Board wird hier verwendet, dieses z. B.?

Danke und Gruß

MiReu

MiReu: Sollte die Prüfung nicht alle x millis stattfinden und dann ggf. die Uhr gestellt werden?

Nein, da normalerweise kein WLAN vorhanden ist:

robiv8: Es soll aber die Zeit vom DS3231 Anzeigen auch wenn mal kein Wlan vorhanden ist. Hintergrund ist der das ich mir diese Uhr ins Ferienhaus mitnehmen will aber es dort kein Wlan gibt. Zum Syncen alle paar Monate kann ich dann mein Handy benutzen.

Zum "Syncen" wird dann Reset gedrückt.

Wenn dies mein Projekt wäre, würde ich den zusammengeklaubten, funktionierenden Sketch gut speichern und dann ein Redesign beginnen.

Ich habe aber lernen müssen, daß in diesem Forum nur ein irgendwie funktionierender Sketch meist das angestrebte Ziel ist. Naja, ist dann eben so.

MiReu: Hallo,

ich hätte da mal eine Frage zu dem Sketch.

Warum wird die Verbindung zum WiFi nur im Setup geprüft? Was passiert wenn das WLAN unterbrochen wird ohne das der Sketch neu gestartet wird? Sollte die Prüfung nicht alle x millis stattfinden und dann ggf. die Uhr gestellt werden?

Nein!!

Der Esp8266 verbindet sich selber wieder.

Ausser man stellt den AutoConnect explizit ab.

Esp8266 Dokumentation

Welches Board der TO verwendet enzieht sich meiner Kenntnis.

Der von dir verlinkte Nodemcu passt nicht auf ein Steckbrett, nimm einen mit CP2102 Chip, der ist schmaler.

Gruß Fips

agmue: Nein, da normalerweise kein WLAN vorhanden ist: Zum "Syncen" wird dann Reset gedrückt.

Wenn dies mein Projekt wäre, würde ich den zusammengeklaubten, funktionierenden Sketch gut speichern und dann ein Redesign beginnen.

Ich habe aber lernen müssen, daß in diesem Forum nur ein irgendwie funktionierender Sketch meist das angestrebte Ziel ist. Naja, ist dann eben so.

Naja, also ist die Uhr nicht für "unbeachteten" Gebrauch zu verwenden, schade :(

Also ich bin eigentlich schon für Ordnung, aber dazu muss man auch erst wissen wie man Ordnung schafft - und da bin ich noch weit entfernt von.

Derfips: Nein!!

Der Esp8266 verbindet sich selber wieder.

Ausser man stellt den AutoConnect explizit ab.

Esp8266 Dokumentation

Welches Board der TO verwendet enzieht sich meiner Kenntnis.

Der von dir verlinkte Nodemcu passt nicht auf ein Steckbrett, nimm einen mit CP2102 Chip, der ist schmaler.

Gruß Fips

Okay, dies widerspricht dann aber der Aussage von agmue, würde die Sache aber wieder interessant machen :)

Ob das Teil auf ein Steckbrett passt ist mir eigentlich egal, zum testen geht es mit Strippen. Aber das Argument schmaler macht die mit CP2102 Chip natürlich noch interessanter.

Danke euch beiden :)

Gruß

MiReu

Derfips:
Der Esp8266 verbindet sich selber wieder.

setSyncProvider(getNtpTime);

Das finde ich in setup, aber wo innerhalb von loop wird die Zeit synchronisiert?

MiReu:
… aber dazu muss man auch erst wissen wie man Ordnung schafft …

Dafür kann man dieses Forum um Hilfe bitten, passiert nur leider fast nie. Bei einer Fußgängerampel haben Rudi und ich uns einen Wettstreit geliefert, er in OOP, ich prozedural, fand ich spannend. Mit sowas kann man dann den eigenen Stil verbessern.