Gå til innhold
  • Bli medlem
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");  
     }

     

     

    Endret av Fermate

    Brukertilbakemelding

    Anbefalte kommentarer



    Bli med i samtalen

    Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

    Gjest
    Skriv en kommentar...

    ×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

      Du kan kun bruke opp til 75 smilefjes.

    ×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

    ×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

    ×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.




×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.