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

    Året som returneres er år - 1900.
    (Du skal altså legge til 1900 på det tallet du får)
     
    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");  
     }

     

     

    Edited by Fermate

    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.