Man sucht sich im Netz einen Wolf. Man meint, Lösungen gefunden zu haben. Aber sie laufen nicht. Warum? Weil sich zwischen dem Beitrag und der Entwicklungsumgebung einiges verändert hat. Netterweise ist es hier nun auch etwas einfacher geworden. Die NTP-bezogenen Sketche mit mordmäßig komplizierten Kram kann man nun getrost wegwerfen, da die time.h inzwischen durch die Board Bibliothek des ESP32 seitens Expressif komplettiert wurde. Schön.
Hier habe ich mir nun einen Beispielsketch zusammengefrankensteint, welcher zum Beispiel an diverse Dinge als Ersatz für überbordende und komplizierte NTP-Applikationen herhalten kann. Der Code ist weitestgehend selbsterklärend. Wenn man weiter tweaken möchte, z.B. die Updateraten, kann man direkt bei Expressif nachsehen.
/*
Testsketch für NTP mit ESP32
*/
#include <WiFi.h> // WLAN-Kram
#include "time.h" // Zeitfunktionen inkl. NTP
#include "esp_sntp.h" // Zugriff auf NTP-ESP32 Umgebung
const char* ssid = "SSID";
const char* password = "PASSWORT";
unsigned long epochTime; // UNIX - Zeit
const char* ntpServer = "ptbtime1.ptb.de"; // NTP-Server
const long gmtOffset_sec = 3600; // MEZ
const int daylightOffset_sec = 3600; // MESZ
time_t now;
void setup(){
Serial.begin(115200);
while(!Serial){} // Ausserhalb des Debuggings rauskommentieren
delay(1000); // damit keine Zeichen verschluckt werden
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi verbunden.");
// Init NTP und Uhrzeit holen
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println("Uhrzeit holen");
struct tm tm;
do {
Serial.print(".");} // warten bis NTP synchronisiert ist
while (!getLocalTime(&tm));
// weiß nicht, ob das Abschalten von WIFI sinnvoll ist wegen
// späteren Sync. Vielleicht kann man es mit der Abfrage
// synchronisieren ...
// disconnect WiFi as it's no longer needed
// WiFi.disconnect(true);
// WiFi.mode(WIFI_OFF);
}
void loop(){
delay(1000);
printLocalTime();
}
// Function that gets current epoch time
unsigned long getTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
//Serial.println("NTP not ready");
return(0);
}
time(&now);
return now;
}
void printLocalTime(){
struct tm tm;
if(!getLocalTime(&tm)){
Serial.println("NTP nicht bereit");
return;
}
Serial.println(&tm, "%A, %B %d %Y %H:%M:%S");
Serial.print("Day of week: ");
Serial.println(&tm, "%A");
Serial.print("Month: ");
Serial.println(&tm, "%B");
Serial.print("Day of Month: ");
Serial.println(&tm, "%d");
Serial.print("Year: ");
Serial.println(&tm, "%Y");
Serial.print("Hour: ");
Serial.println(&tm, "%H");
Serial.print("Hour (12 hour format): ");
Serial.println(&tm, "%I");
Serial.print("Minute: ");
Serial.println(&tm, "%M");
Serial.print("Second: ");
Serial.println(&tm, "%S");
Serial.println("Time variables");
char timeHour[3];
strftime(timeHour,3, "%H", &tm);
Serial.println(timeHour);
char timeWeekDay[10];
strftime(timeWeekDay,10, "%A", &tm);
Serial.println(timeWeekDay);
Serial.println();
epochTime = getTime();
Serial.print("Epoch Time: ");
Serial.println(epochTime);
}
Keine Kommentare:
Kommentar veröffentlichen