Mastodon katzenjens' Technik-Blog: NTP und ESP32 Mastodon

03.01.2025

NTP und ESP32

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);
}

Das Bild zeigt die Anti_Aliased_Clock von Bodmer, bei welcher ich den Code aufgeräumt habe.


Keine Kommentare:

Kommentar veröffentlichen