Jump to content
  • Sign Up
Støtt hjemmeautomasjon.no!
  • Fermate
    Fermate

    ESP32 Lese klokka fra Internet med NTP (7)

    Her er kode for å lese NTP (OBS Uten noen WiFi som selvfølgelig trengs)

     

    Sitat
    #include <time.h>
     
     //Time
    #define MY_NTP_SERVER "pool.ntp.org"
    #define MY_TZ "CET-1CEST,M3.5.0,M10.5.0/3" // TZ = TimeZone hentet herfra: https://ftp.fau.de/aminet/util/time/tzinfo.txt
    time_t now;    // this is the epoch (Unixtid: Antall sekunder siden UTC 00:00:00 1/1-1970)
    tm timeNow;
     
    time_t last;
    tm timeLast;
     
    // ****************************
    void setup() {
     // Setup Serial Monitor
     Serial.begin(115200);
     
      // NTP
     configTime(0, 0, MY_NTP_SERVER); // 0, 0 because we will use TZ in the next line
     setenv("TZ", MY_TZ, 1); // Set environment variable with your time zone
     tzset();
     
    }
     
    // ****************************
    void loop(){
     
      time(&now); // read the current time
      localtime_r(&now, &timeNow); // update the structure with the current time
     
      if (timeNow.tm_year==70) { // Tid ikke klar ennå
        delay(1000); // Kun for debug lesbarhet i Serial monitor
        Serial.println("Venter på Tid");  
      } else {
        if (timeNow.tm_sec!= timeLast.tm_sec) { // Har det gått et sekund siden sist?
          Serial.print("Year:");
          Serial.print(timeNow.tm_year);    
          Serial.print(" Hour:");
          Serial.print(timeNow.tm_hour);  
          Serial.print(" Min:");
          Serial.print(timeNow.tm_min);  
          Serial.print(" Sec:");
          Serial.print(timeNow.tm_sec);  
          Serial.println();  
        timeLast=timeNow;
        }
      }
    }

     

    Med NTP (Network Time Protocol) kan vi lese eksakt tid fra Internet.
    Da trenger vi selvfølgelig en Internet forbindelse. Det enklese er å bruke WiFiManager men siden dette er en guideserie primært for MQTT bruker vi like godt den isteden.

    Det er liten vits i å kalle NTP bibliokeket før vi har fått WiFi forbindelse så jeg bruker 

    if (MQTTclient.isWifiConnected()) {
    for å sjekke dette.
     
    NTP Biblioteket kaller selv opp NTP serveren hvert 60 minutt og i starten kan det ta litt tid før vi får første tidsavlesning. Før tid er klar vil biblioteket returnere tid = 0 som er 00:00:00 1/1-1970
     
    Av en eller annen grunn returnerer den 124 for år nå isteden for 2024. Om noen har tips om å fikse/forklare dette er det fint.
     
    For å få riktig tidssone og sommer/vintertid sier vi ifra om dette til biblioteket.
    Kodene er hentet herfra:  
    https://ftp.fau.de/aminet/util/time/tzinfo.txt
     
    Her er komplett kode med MQTT som leser klokka og skriver den til Serial Monitor:
    Jeg bruker onboard LED til å vise om jeg har WiFi connect.
     
    Sitat
    #define ONBOARD_LED 2
    #include <EspMQTTClient.h>
    #include <time.h>
     
     //Time
    #define MY_NTP_SERVER "pool.ntp.org"
    #define MY_TZ "CET-1CEST,M3.5.0,M10.5.0/3" // TZ = TimeZone hentet herfra: https://ftp.fau.de/aminet/util/time/tzinfo.txt
    time_t now;    // this is the epoch (Unixtid: Antall sekunder siden UTC 00:00:00 1/1-1970)
    tm timeNow;
     
    time_t last;
    tm timeLast;
     
    //MQTT
    EspMQTTClient MQTTclient(
      "ThePromisedLAN", // SSID
      "Hallelujah!", // WiFi Password
      "192.168.1.2",  // MQTT Broker server ip
      "",   // MQTTUsername Can be omitted if not needed
      "",   // MQTTPassword Can be omitted if not needed
      "NPTTestClient",     // Client name that uniquely identify your device
      1883              // The MQTT port, default to 1883. this line can be omitted
    );
     
    // ****************************
    void setup() {
     // Setup Serial Monitor
     Serial.begin(115200);
     
     // Set pin mode for test LED som viser WiFi Status denne gangen
     pinMode(ONBOARD_LED,OUTPUT);
     digitalWrite(ONBOARD_LED,HIGH);
     
     // MQTTclient.setKeepAlive();
     MQTTclient.setKeepAlive(60);
     
      // NTP
     configTime(0, 0, MY_NTP_SERVER); // 0, 0 because we will use TZ in the next line
     setenv("TZ", MY_TZ, 1); // Set environment variable with your time zone
     tzset();
    }
     
    // ****************************
    void loop(){
     
      MQTTclient.loop();
     
     if (MQTTclient.isWifiConnected()) {
       digitalWrite(ONBOARD_LED,LOW);
     
       time(&now); // read the current time
       localtime_r(&now, &timeNow); // update the structure with the current time
     
       if (timeNow.tm_year==70) { // Tid ikke klar ennå
         delay(1000); // Kun for debug lesbarhet i Serial monitor
         Serial.println("Venter på Tid");  
       } else {
         if (timeNow.tm_sec!= timeLast.tm_sec) { // Har det gått et sekund siden sist?
           Serial.print("Year:");
           Serial.print(timeNow.tm_year);    
           Serial.print(" Hour:");
           Serial.print(timeNow.tm_hour);  
           Serial.print(" Min:");
           Serial.print(timeNow.tm_min);  
           Serial.print(" Sec:");
           Serial.print(timeNow.tm_sec);  
           Serial.println();  
          timeLast=timeNow;
         }
       }
      } else {
       digitalWrite(ONBOARD_LED,HIGH); //Venter på WiFi COnnect
      }
    }
     
    void onConnectionEstablished()
     {
     Serial.println("onConnectionEstablished");
     MQTTclient.publish("NPTTestClient/status", "started");  
     }

     

     

    User Feedback

    Recommended Comments



    Join the conversation

    You can post now and register later. If you have an account, sign in now to post with your account.

    Guest
    Add a comment...

    ×   Pasted as rich text.   Paste as plain text instead

      Only 75 emoji are allowed.

    ×   Your link has been automatically embedded.   Display as a link instead

    ×   Your previous content has been restored.   Clear editor

    ×   You cannot paste images directly. Upload or insert images from URL.




×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.