ESP32_Zeit vom NTP Server holen

Fertige Geräte mit Bilden, Schaltungen, Programmen vorstellen.
Antworten
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

ESP32_Zeit vom NTP Server holen

Beitrag von Admin »

Ich beginne gerade mit den ersten Versuchen die Zeit vom NTP Server zu holen. Oder auch von der Fritzbox. Ist auch schon gelungen. Ist ja wirklich leicht wenn man es im Netz vorgekaut bekommt. Aber jetzt muss ich mich in die Vorlage mal ein bischen reinarbeiten.
Bis jetzt verstehe ich nur Bahnhof. Also es geht, aber ich weiß noch nicht warum :O: Der ESP32 hat übrigens auch schon ein RTC on board. Man muss also nur die Zeit von Server holen und an den ESP32 übergeben, dann läuft die Zeit ohne Eingriffe von aussen weiter.

Aber ein Anfang ist gemacht. :)
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Zeit vom NTP Server holen

Beitrag von Admin »

Die NTP Serverabfrage mit der Übergabe der Daten ins Display. Aber ich bin in dem Thema noch lange nicht zuhause. Abschreiben ist einfach.
.
ESP32 NTP-Server.jpg
ESP32 NTP-Server.jpg (259.88 KiB) 1869 mal betrachtet

Code: Alles auswählen

#include <WiFi.h>
#define SchlafZeit 3E7 // Mikrosekunden hier 3s
#define NTP_SERVER "de.pool.ntp.org"
#define TZ_INFO "WEST-1DWEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" // Western European Time
RTC_DATA_ATTR int bootZaeler = 0;   // Variable in RTC Speicher bleibt erhalten nach Reset

// OLED Display einrichten
#include <U8g2lib.h>  // als U8g2 im Bibliotheksverwalter zu finden
U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0);

void setup()
{
  esp_sleep_wakeup_cause_t wakeup_cause; // Variable für wakeup Ursache
  setenv("TZ", TZ_INFO, 1);             // Zeitzone  muss nach dem reset neu eingestellt werden
  tzset();
  Serial.begin(115200);
  Serial.println("");
  ++bootZaeler;
  Serial.println("Start Nr.: " + String(bootZaeler));
  wakeup_cause = esp_sleep_get_wakeup_cause(); // wakeup Ursache holen
  if (wakeup_cause != 3) ErsteStart();     // Wenn wakeup durch Reset

  oled.begin();
  oled.clearBuffer();              // Textspeicher löschen
  oled.setFont(u8g2_font_6x12_tr); // choose a suitable font 6x12
  //oled.setFont(u8g2_font_9x15_mf);
  oled.setCursor(10, (1 * 10));
  oled.print(F("NTP-Server Abfrage"));
  oled.sendBuffer();
}

void loop()
{
  tm local;
  getLocalTime(&local);
  Serial.println(&local, "Datum: %d.%m.%y  Zeit: %H:%M:%S"); // Zeit Datum Print Ausgabe formatieren
  Serial.println("Deep Sleep - Gehe schlafen \r\n \r\n");

  oled.setFont(u8g2_font_10x20_mf);
  //oled.setFont(u8g2_font_9x15_mf);
  oled.setCursor(20, 40);
  oled.print(&local, "Am %d.%m");
  oled.setCursor(20, 55);
  oled.print(&local, "Um %H:%M");
  oled.sendBuffer();

  esp_sleep_enable_timer_wakeup(SchlafZeit);    // Deep Sleep Zeit einstellen
  esp_deep_sleep_start();                       // Starte Deep Sleep
}
void ErsteStart()
{
  Serial.println("Start nach dem Reset");
  WiFi.mode(WIFI_STA);
  WiFi.begin("Name", "Passwort");
  Serial.println("");

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("IP Addresse: ");
  Serial.println(WiFi.localIP());
  Serial.println("Hole NTP Zeit");
  struct tm local;
  configTzTime(TZ_INFO, NTP_SERVER); // ESP32 Systemzeit mit NTP Synchronisieren
  getLocalTime(&local, 10000);      // Versuche 10 s zu Synchronisieren
  WiFi.mode(WIFI_OFF);
}
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Zeit vom NTP Server holen

Beitrag von Admin »

Ich habe jetzt dieses Programm mal etwas nach meinen Wünschen angepasst. Habe daher die Teile rausgenommen, wo die CPU schlafen geschickt wird. Habe ein Display benutzt und habe im Moment mit Hilfe von Millis nur noch alle 24 Std. eine Zeitanpassung über WLAN vom NTP Server. Ich möchte aber die Zeit zur Aktualisierung gerne aus der Systemuhr bestimmen, und nicht über Millis(). Da habe ich in meiner alten Birne gerade noch ein Problem.
PS: Habe übrigens gesehen, dass die CPU etwa 100mA weniger Verbrauch hat, wenn sie schläft. Also gelegendlich ein gutes Argument für´s schlafen schicken. :)

Grüße
Franz

Das Programm schaut im Moment so aus:

Code: Alles auswählen

#include <WiFi.h>
//#define NTP_SERVER "de.pool.ntp.org"
#define NTP_SERVER "Fritz.Box"
#define TZ_INFO "WEST-1DWEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" // Western European Time

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
byte zaehler = 0;
const unsigned long Tag = ((1000*60)*60)*24UL;
unsigned long laufzeit = Tag;
unsigned long aktuellzeit;
//---------------------Setup---------------------------
void setup()
{
  lcd.begin();
  lcd.backlight();
  Serial.begin(9600);
  lcd.setCursor (0, 0);
  lcd.print (F(" NTP Server Abfrage "));
}
//---------------------LOOP---------------------------
void loop()
{
aktuellzeit = millis();
  
  tm local;
  getLocalTime(&local);
  lcd.setCursor (0, 2);
  lcd.print(&local, "   Datum: %d.%m.%y");
  lcd.setCursor (0, 3);
  lcd.print(&local, "   Zeit:  %H:%M:%S");
  if (aktuellzeit - laufzeit >=Tag)
  {
    NTP_Zeit();
    laufzeit = aktuellzeit;
  }
}
//----------------WIFI Verbindung---------------------
void NTP_Zeit()
{
  lcd.setCursor (0, 1);
  lcd.print(F("Zeitserver verbinden"));
  WiFi.mode(WIFI_STA);
  WiFi.begin("Name", "Passwort");

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
  }
  lcd.setCursor (0, 1);
  lcd.print(F("++ Hole NTP Zeit ++ "));
  struct tm local;
  configTzTime(TZ_INFO, NTP_SERVER); // ESP32 Systemzeit mit NTP Synchronisieren
  getLocalTime(&local, 10000);      // Versuche 10 s zu Synchronisieren
  WiFi.mode(WIFI_OFF);
  lcd.setCursor (0, 1);
  lcd.print(F(" NTP Zeit abgefragt "));
}
.
ESP32_NTP_Zeit_01.jpg
ESP32_NTP_Zeit_01.jpg (260.73 KiB) 1852 mal betrachtet
Die Anzeige am Oled Display ist vom linken ESP32 und hat nichts mit dem Internet Zugang zum NTP Server zu tun, sondern ist noch vom Test mit dem 4 Kanal ADC-Sensor zur Spannungsmessung. Der Rechte ESP32 ist die CPU, die gerade die Zeit übers Wlan holt und dann die Interne Uhr des ESP32 benutzt. Und die Zeit auf dem LCD Display 4x20 Zeichen darstellt.
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Zeit vom NTP Server holen

Beitrag von Admin »

Jetzt läuft es nach Wunsch. Habe mir Hilfe im ArduinoCC Forum geholt, weil ich es nicht hingebracht hätte.

Hier das aktuelle Programm:

Code: Alles auswählen

#include <WiFi.h>
//#define NTP_SERVER "de.pool.ntp.org"
#define NTP_SERVER "Fritz.Box"
#define TZ_INFO "WEST-1DWEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" // Western European Time

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
byte zaehler = 0;
//---------------------Setup---------------------------
void setup()
{
  lcd.begin();
  lcd.backlight();
  Serial.begin(9600);
  lcd.setCursor (0, 0);
  lcd.print (F(" NTP Server Abfrage "));
}
//---------------------LOOP---------------------------
void loop()
{
  tm local;
  getLocalTime(&local);
  lcd.setCursor (0, 2);
  lcd.print(&local, "   Datum: %d.%m.%y");
  lcd.setCursor (0, 3);
  lcd.print(&local, "   Zeit:  %H:%M:%S");
   /*
    struct tm enthält diese Atribute:
    ===============================================
    Member   Type  Meaning                   Range
    tm_sec   int   seconds after the minute  0-60*
    tm_min   int   minutes after the hour    0-59
    tm_hour  int   hours since midnight      0-23
    tm_mday  int   day of the month          1-31
    tm_mon   int   months since January      0-11
    tm_year  int   years since 1900
    tm_wday  int   days since Sunday         0-6
    tm_yday  int   days since January 1      0-365
    tm_isdst int   Daylight Saving Time flag
    ==============================================
  */
  if (zaehler == 0)
  {
    NTP_Zeit();
    zaehler = 1;
  }
  // 00:00:XX = 3600(=1 Std) * std = 0 + min = 0 * 60 = 0 + sec = maximal 59 sec
  uint32_t nbSek = 3600ul * local.tm_hour + local.tm_min * 60ul + local.tm_sec;
  if (nbSek <= 2) // zwischen 00:00:00 Uhr und 00:00:01 Uhr Zeit vom NTP holen
  {
    NTP_Zeit();
  }
}
//----------------WIFI Verbindung---------------------
void NTP_Zeit()
{
  lcd.setCursor (0, 1);
  lcd.print(F("Zeitserver verbinden"));
  WiFi.mode(WIFI_STA);
  WiFi.begin("Name", "Password");

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
  }
  lcd.setCursor (0, 1);
  lcd.print(F("++ Hole NTP Zeit ++ "));
  struct tm local;
  configTzTime(TZ_INFO, NTP_SERVER); // ESP32 Systemzeit mit NTP Synchronisieren
  getLocalTime(&local, 10000);      // Versuche 10 s zu Synchronisieren
  WiFi.mode(WIFI_OFF);
  lcd.setCursor (0, 1);
  lcd.print(F(" NTP Zeit abgefragt "));
}
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Zeit vom NTP Server holen

Beitrag von Admin »

Ich habs mal noch ein wenig angeändert. Um zu sehen, wann die Uhr zuletzt aktualisiert wurde. Sie Wir jeden Tag gleich um 00:00:01 Uhr automatisch aktualisiert und auch immer dann, wenn ein Stromausfall war, und die Spannung wieder gekommen ist.

Das ist das geänderte Programm:

Code: Alles auswählen

#include <WiFi.h>
//#define NTP_SERVER "de.pool.ntp.org"
#define NTP_SERVER "Fritz.Box"
#define TZ_INFO "WEST-1DWEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" // Western European Time

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//---------------------Setup---------------------------
void setup()
{
  lcd.begin();
  lcd.backlight();
  Serial.begin(9600);
  lcd.setCursor (0, 0);
  lcd.print (F(" NTP Server Abfrage "));
  NTP_Zeit();
}
//---------------------LOOP---------------------------
void loop()
{
  tm local;
  getLocalTime(&local);
  lcd.setCursor (0, 2);
  lcd.print(&local, "    Datum: %d.%m.%y");
  lcd.setCursor (0, 3);
  lcd.print(&local, "   Es ist: %H:%M:%S");
  /*
    struct tm enthält diese Atribute:
    ===============================================
    Member   Type  Meaning                   Range
    tm_sec   int   seconds after the minute  0-60*
    tm_min   int   minutes after the hour    0-59
    tm_hour  int   hours since midnight      0-23
    tm_mday  int   day of the month          1-31
    tm_mon   int   months since January      0-11
    tm_year  int   years since 1900
    tm_wday  int   days since Sunday         0-6
    tm_yday  int   days since January 1      0-365
    tm_isdst int   Daylight Saving Time flag
    ==============================================
  */
  // 00:00:XX = 3600(=1 Std) * std = 0 + min = 0 * 60 = 0 + sec = maximal 59 sec
  uint32_t nbSek = 3600ul * local.tm_hour + local.tm_min * 60ul + local.tm_sec;
  if (nbSek <= 2) // zwischen 00:00:00 Uhr und 00:00:59 Uhr Zeit vom NTP holen
  {
    NTP_Zeit();
  }
}
//----------------WIFI Verbindung---------------------
void NTP_Zeit()
{
  lcd.setCursor (0, 1);
  lcd.print(F("Zeitserver verbinden"));
  WiFi.mode(WIFI_STA);
  WiFi.begin("Name", "Passwort");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
  }
  lcd.setCursor (0, 1);
  lcd.print(F("++ Hole NTP Zeit ++ "));
  struct tm local;
  configTzTime(TZ_INFO, NTP_SERVER); // ESP32 Systemzeit mit NTP Synchronisieren
  getLocalTime(&local, 10000);      // Versuche 10 s zu Synchronisieren
  WiFi.mode(WIFI_OFF);
  lcd.setCursor (0, 1);
  lcd.print(&local, " vom %d.%m um %H:%M");
  lcd.setCursor (0, 1);
}
Und so sieht die Anzeige dann jetzt aus:
.
ESP32_NTP_Uhr.jpg
ESP32_NTP_Uhr.jpg (282.36 KiB) 1832 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Zeit vom NTP Server holen

Beitrag von Admin »

Ich habe mal noch einen Lautsprecher an den ESP32 gehängt, und dann eine Tonausgabe in Programm dazu geschrieben. So wird jetzt, wenn der ESP32 sich wieder Zeit und Datum vom NTP - Server holt, dieser biep, biep, biiiiiep, ausgegeben. Also entweder um 00:00 Uhr oder nach Stromausfall, macht sich die Uhr bemerkbar. Leider geht das beim ESP32 nicht einfach mit dem Tone() Befehl, sondern man braucht eine Lib dazu. Ich habe hier die Tone32.h Lib.

Franz

Das schaut dann so aus:

Code: Alles auswählen

#include <WiFi.h>
//#define NTP_SERVER "de.pool.ntp.org"
#define NTP_SERVER "Fritz.Box"
#define TZ_INFO "WEST-1DWEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" // Western European Time

#include <Tone32.h>
#define BUZZER_PIN 16
#define BUZZER_CHANNEL 0

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//---------------------Setup---------------------------
void setup()
{
  lcd.begin();
  lcd.backlight();
  Serial.begin(9600);
  lcd.setCursor (0, 0);
  lcd.print (F(" NTP Server Abfrage "));
  NTP_Zeit();
}
//---------------------LOOP---------------------------
void loop()
{
  tm local;
  getLocalTime(&local);
  lcd.setCursor (0, 2);
  lcd.print(&local, " Datum:    %d.%m.%y");
  lcd.setCursor (0, 3);
  lcd.print(&local, " Zeit :    %H:%M:%S");
  /*
    struct tm enthält diese Atribute:
    ===============================================
    Member   Type  Meaning                   Range
    tm_sec   int   seconds after the minute  0-60*
    tm_min   int   minutes after the hour    0-59
    tm_hour  int   hours since midnight      0-23
    tm_mday  int   day of the month          1-31
    tm_mon   int   months since January      0-11
    tm_year  int   years since 1900
    tm_wday  int   days since Sunday         0-6
    tm_yday  int   days since January 1      0-365
    tm_isdst int   Daylight Saving Time flag
    ==============================================
  */
  //00:00:XX = 3600(=1 Std) * std = 0 + min = 0 * 60 = 0 + sec = maximal 59 sec
  uint32_t nbSek = 3600ul * local.tm_hour + local.tm_min * 60ul + local.tm_sec;
  if (nbSek <= 2) // zwischen 00:00:00 Uhr und 00:00:59 Uhr Zeit vom NTP holen
  {
    NTP_Zeit();
  }
}
//----------------WIFI Verbindung---------------------
void NTP_Zeit()
{
  lcd.setCursor (0, 1);
  lcd.print(F("Zeitserver verbinden"));
  WiFi.mode(WIFI_STA);
  WiFi.begin("Name", "Password");
  while (WiFi.status() != WL_CONNECTED) // Ist WLAN Connect?
  {
    delay(500);
  }
  lcd.setCursor (0, 1);
  lcd.print(F("++ Hole NTP Zeit ++ "));
  struct tm local;
  configTzTime(TZ_INFO, NTP_SERVER); // ESP32 Systemzeit mit NTP Synchronisieren
  getLocalTime(&local, 10000);      // Versuche 10 s zu Synchronisieren
  WiFi.mode(WIFI_OFF);
  lcd.setCursor (0, 0);
  lcd.print(&local, " vom %d.%m um %H:%M ");
  lcd.setCursor (0, 1);
  lcd.print(F("--------------------"));
  tone(BUZZER_PIN, NOTE_G4, 200, BUZZER_CHANNEL);
  noTone(BUZZER_PIN, BUZZER_CHANNEL);
  tone(BUZZER_PIN, NOTE_A4, 200, BUZZER_CHANNEL);
  noTone(BUZZER_PIN, BUZZER_CHANNEL);
  tone(BUZZER_PIN, NOTE_G4, 500, BUZZER_CHANNEL);
  noTone(BUZZER_PIN, BUZZER_CHANNEL);
}
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: ESP32_Zeit vom NTP Server holen

Beitrag von Admin »

Ich habe mal das Programm noch ein wenig übersichtlicher gamacht.

Das Display der ESP32 Uhr zeigt jetzt in der ersten Zeile Datum Uhrzeit an, wo der ESP32 zuletzt die Zeit aus dem Internet geholt hat. Und in Zeile 3 und Zeile 4, das Aktuelle Datum, mit der aktuellen Uhrzeit. Ich hole im Moment die Zeit noch um 00:00 Uhr, was aber eigentlich nicht so toll ist, weil die Zeit in der Nacht der Umstellung (Sommer/Winter), glaube ich, um 04:00 Uhr morgens aktuallisiert wird. Da macht es keinen Sinn, um 00:00 Uhr die Zeit vom Server zu holen, da dann den ganzen folgenden Tag die Zeit um eine Std. falsch ist. :(o): :(o):

Das kleine OLED - Display; unten im Bild; zeigt zwei Spannungen an, mit einem ADS1115 Sensor gemessen. Die Analog Eingänge am ESP32 kann man nach meiner Meinung nur zum Spannung schätzen verwenden. Also schauen ob Spannung anliegt, nicht aber genau, welche Spannung anliegt. Aber der ADS1115 ist für kleines Geld zu haben und kann auf 4 Kanälen also 4 verschiedene Spannungen messen. Und das in einer Auflösung, wie man sie auf normalen 08/15 Messgeräten auch hat. Der erste Wert (1,54 Volt) ist die auf einen Poti eingestellte Spannung, der zweite Wert (3,30 Volt) ist die Betriebsspannung der beiden ESP32.

Hier mal das aktuelle Bild:
.
ESP32_NTP_Zeit_02.jpg
ESP32_NTP_Zeit_02.jpg (786.35 KiB) 1813 mal betrachtet
Hier das aktuelle Programm dazu:

Code: Alles auswählen

#include <WiFi.h>
//#define NTP_SERVER "de.pool.ntp.org"
#define NTP_SERVER "Fritz.Box"
#define TZ_INFO "WEST-1DWEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" // Western European Time

#include <Tone32.h>
#define BUZZER_PIN 16
#define BUZZER_CHANNEL 0

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//---------------------Setup---------------------------
void setup()
{
  lcd.begin();
  lcd.backlight();
  Serial.begin(9600);
  lcd.setCursor (0, 0);
  lcd.print (F(" NTP Server Abfrage "));
  NTP_Zeit();
}
//---------------------LOOP---------------------------
void loop()
{
  tm local;
  getLocalTime(&local);
  lcd.setCursor (0, 2);
  lcd.print(&local, " Datum:    %d.%m.%y");
  lcd.setCursor (0, 3);
  lcd.print(&local, " Zeit :    %H:%M:%S");
  /*
    struct tm enthält diese Atribute:
    ===============================================
    Member   Type  Meaning                   Range
    tm_sec   int   seconds after the minute  0-60*
    tm_min   int   minutes after the hour    0-59
    tm_hour  int   hours since midnight      0-23
    tm_mday  int   day of the month          1-31
    tm_mon   int   months since January      0-11
    tm_year  int   years since 1900
    tm_wday  int   days since Sunday         0-6
    tm_yday  int   days since January 1      0-365
    tm_isdst int   Daylight Saving Time flag
    ==============================================
  */
  //00:00:XX = 3600(=1 Std) * std = 0 + min = 0 * 60 = 0 + sec = maximal 59 sec
  uint32_t nbSek = 3600ul * local.tm_hour + local.tm_min * 60ul + local.tm_sec;
  if (nbSek <= 2) // zwischen 00:00:00 Uhr und 00:00:59 Uhr Zeit vom NTP holen
  {
    NTP_Zeit();
  }
}
//----------------WIFI Verbindung---------------------
void NTP_Zeit()
{
  lcd.setCursor (0, 1);
  lcd.print(F("Zeitserver verbinden"));
  WiFi.mode(WIFI_STA);
  WiFi.begin("Name", "Passwort");
  while (WiFi.status() != WL_CONNECTED) // Ist WLAN Connect?
  {
    delay(500);
  }
  lcd.setCursor (0, 1);
  lcd.print(F("++ Hole NTP Zeit ++ "));
  struct tm local;
  configTzTime(TZ_INFO, NTP_SERVER); // ESP32 Systemzeit mit NTP Synchronisieren
  getLocalTime(&local, 10000);      // Versuche 10 s zu Synchronisieren
  WiFi.mode(WIFI_OFF);
  lcd.setCursor (0, 0);
  lcd.print(&local, " vom %d.%m um %H:%M ");
  lcd.setCursor (0, 1);
  lcd.print(F("--------------------"));
  //Die Töne sind C4-D4-E4-F4-G4-A4-B4
  tone(BUZZER_PIN, NOTE_C4, 200, BUZZER_CHANNEL);
  noTone(BUZZER_PIN, BUZZER_CHANNEL);
  tone(BUZZER_PIN, NOTE_D4, 200, BUZZER_CHANNEL);
  noTone(BUZZER_PIN, BUZZER_CHANNEL);
  tone(BUZZER_PIN, NOTE_E4, 500, BUZZER_CHANNEL);
  noTone(BUZZER_PIN, BUZZER_CHANNEL);
 
}
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: ESP32_Zeit vom NTP Server holen

Beitrag von Admin »

Hier habe ich mal noch die Zeit verstellt, zur der die Uhrzeit vom NTP geholt wird. In meinem Fall hier von der Fritzbox. Der Wert der Zeiteinstellung ist immer die Zeit in Sekunden von 00:00 Uhr bis dahin, wo die Zeit geholt werden soll. Und da habe ich dann ein Zeitfenser von 2 Sekunden genommen, dass die Zeit nicht x-fach geholt wird, sondern nur 1x Am Bild sieht man in der ersten Zeile des Display Datum und Zeit, wo zuletzt die Aktuelle Zeit vom NTP geholt wurde. Das war um 04:00 Uhr. Also wenn in der Nacht die Sommer- / Winterzeit umgestellt wurde, ist um 04:00 Uhr ja bereits die neue Uhrzeit am NTP. Ich glaube um 03:00 Uhr wird er umgestellt.
Unten ist das Programm mit der veränderten Zeiteinstellung.
14400 ist die Zeit für 04:00 Uhr. Eine Std. ist 3600 Sek. x 4 = 14400 Sek. nach 00:00 Uhr.
Hier das Bild dazu:
Der rechte ESP32 ist die Uhr, der linke ESP32 ist das Messgerät für die Spannung.
.
ESP32_NTP_Zeit_03.jpg
ESP32_NTP_Zeit_03.jpg (985.76 KiB) 1801 mal betrachtet

Code: Alles auswählen

#include <WiFi.h>
//#define NTP_SERVER "de.pool.ntp.org"
#define NTP_SERVER "Fritz.Box"
#define TZ_INFO "WEST-1DWEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" // Western European Time

#include <Tone32.h>
#define BUZZER_PIN 16
#define BUZZER_CHANNEL 0

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//---------------------Setup---------------------------
void setup()
{
  lcd.begin();
  lcd.backlight();
  Serial.begin(9600);
  lcd.setCursor (0, 0);
  lcd.print (F(" NTP Server Abfrage "));
  NTP_Zeit();
}
//---------------------LOOP---------------------------
void loop()
{
  tm local;
  getLocalTime(&local);
  lcd.setCursor (0, 2);
  lcd.print(&local, " Datum:    %d.%m.%y");
  lcd.setCursor (0, 3);
  lcd.print(&local, " Zeit :    %H:%M:%S");
  /*
    struct tm enthält diese Atribute:
    ===============================================
    Member   Type  Meaning                   Range
    tm_sec   int   seconds after the minute  0-60*
    tm_min   int   minutes after the hour    0-59
    tm_hour  int   hours since midnight      0-23
    tm_mday  int   day of the month          1-31
    tm_mon   int   months since January      0-11
    tm_year  int   years since 1900
    tm_wday  int   days since Sunday         0-6
    tm_yday  int   days since January 1      0-365
    tm_isdst int   Daylight Saving Time flag
    ==============================================
  */
  //00:00:XX = 3600(=1 Std) * std = 0 + min = 0 * 60 = 0 + sec = maximal 59 sec
  uint32_t nbSek = 3600ul * local.tm_hour + local.tm_min * 60ul + local.tm_sec;
  //if(nbSek <=2) // zwischen 00:00:00 Uhr und 00:00:59 Uhr Zeit vom NTP holen
  if((nbSek <=14403)&&(nbSek >14400)) // 04:00 Uhr Morgens
  {
    NTP_Zeit();
  }
}
//----------------WIFI Verbindung---------------------
void NTP_Zeit()
{
  lcd.setCursor (0, 1);
  lcd.print(F("Zeitserver verbinden"));
  WiFi.mode(WIFI_STA);
  WiFi.begin("RuterName", "Passwort");
  while (WiFi.status() != WL_CONNECTED) // Ist WLAN Connect?
  {
    delay(500);
  }
  lcd.setCursor (0, 1);
  lcd.print(F("++ Hole NTP Zeit ++ "));
  struct tm local;
  configTzTime(TZ_INFO, NTP_SERVER); // ESP32 Systemzeit mit NTP Synchronisieren
  getLocalTime(&local, 10000);      // Versuche 10 s zu Synchronisieren
  WiFi.mode(WIFI_OFF);
  lcd.setCursor (0, 0);
  lcd.print(&local, " vom %d.%m um %H:%M ");
  lcd.setCursor (0, 1);
  lcd.print(F("--------------------"));
  //Die Töne sind C4-D4-E4-F4-G4-A4-B4
  tone(BUZZER_PIN, NOTE_C4, 200, BUZZER_CHANNEL);
  noTone(BUZZER_PIN, BUZZER_CHANNEL);
  tone(BUZZER_PIN, NOTE_D4, 200, BUZZER_CHANNEL);
  noTone(BUZZER_PIN, BUZZER_CHANNEL);
  tone(BUZZER_PIN, NOTE_E4, 500, BUZZER_CHANNEL);
  noTone(BUZZER_PIN, BUZZER_CHANNEL);
 
}
Antworten

Zurück zu „Fertige Projekte Vorstellen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast