ESP32_Zeit vom NTP Server holen
- Admin
- Administrator
- Beiträge: 1227
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
ESP32_Zeit vom NTP Server holen
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 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.
Bis jetzt verstehe ich nur Bahnhof. Also es geht, aber ich weiß noch nicht warum 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.
- Admin
- Administrator
- Beiträge: 1227
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: Zeit vom NTP Server holen
Die NTP Serverabfrage mit der Übergabe der Daten ins Display. Aber ich bin in dem Thema noch lange nicht zuhause. Abschreiben ist einfach.
.
.
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);
}
- Admin
- Administrator
- Beiträge: 1227
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: Zeit vom NTP Server holen
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:
.
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.
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 "));
}
- Admin
- Administrator
- Beiträge: 1227
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: Zeit vom NTP Server holen
Jetzt läuft es nach Wunsch. Habe mir Hilfe im ArduinoCC Forum geholt, weil ich es nicht hingebracht hätte.
Hier das aktuelle Programm:
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 "));
}
- Admin
- Administrator
- Beiträge: 1227
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: Zeit vom NTP Server holen
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:
Und so sieht die Anzeige dann jetzt aus:
.
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);
}
.
- Admin
- Administrator
- Beiträge: 1227
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: Zeit vom NTP Server holen
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:
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);
}
- Admin
- Administrator
- Beiträge: 1227
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: ESP32_Zeit vom NTP Server holen
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.
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:
. Hier das aktuelle Programm dazu:
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.
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:
. 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);
}
- Admin
- Administrator
- Beiträge: 1227
- Registriert: Mo 20. Apr 2020, 09:47
- Wohnort: 82441 Ohlstadt
- Kontaktdaten:
Re: ESP32_Zeit vom NTP Server holen
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.
.
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.
.
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);
}
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste