Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

Connaître l’heure exacte depuis ESP32 avec Internet en MicroPython

(Mis à jour le 11/05/2023)

Et oui, l’ESP32 peut récupérer l’heure et la date exacte avec simplement une connexion Internet. Dès que l’ESP32 est complètement éteint, il perd la notion du temps. C’est comme l’horloge d’un four ou d’un micro-ondes qui affiche 00:00 quand il y a eu une coupure de courant. Le moyen le plus classique est alors d’utiliser une horloge RTC externe avec une pile branché en permanence.

Note

C’est typiquement ce qu’il avait dans les anciennes tours d’ordinateur pour maintenir l’horloge du BIOS avec une pile CMOS.

Mais cela demande du matériel supplémentaire, plus d’espace et coûte plus cher.

Synchroniser l’horloge c’est très pratique lorsque l’ESP32 se réveille de temps en temps pour communiquer avec des services WEB, et qu’il veut dater ses paquets avec la bonne date. Cela peut être aussi utile pour avoir un réveil qui exécute une tâche à une heure précise.

Note

Une horloge RTC externe peut s’avérer utile si l’ESP32 ne bénéficie pas d’une connexion à Internet. Il est possible d’utiliser un serveur NTP pour ajuster l’horloge RTC et la synchroniser avec l’heure réelle 😉.

Serveur NTP : A quoi ça sert ?

La synchronisation du temps entre ordinateurs

Les serveurs NTP (Network Time Protocol) sont destinés à synchroniser les horloges des ordinateurs sur un réseau informatique. Leur objectif est de garantir que tous les ordinateurs du réseau partagent la même heure, ce qui est important pour diverses applications, telles que la gestion des fichiers ou la sécurité informatique. C’est aussi pour éviter des erreurs dues à un manque de synchronisation des horloges.

Si vous voulez en apprendre davantage sur le fonctionnement du protocole NTP et de son architecture, je vous conseille cette excellente vidéo en anglais de Computerphile .

Note

En résumé, le protocole NTP permet à l’ESP32 de récupérer la date actuelle avec une grande précision.

L’ESP32 devra faire confiance à des serveurs NTP fiables qui fournissent une heure précise dans le monde entier. Beaucoup de ses serveurs utilisent les signaux des satellites GPS pour obtenir des mesures très exactes du temps. Le plus populaire est « pool.ntp.org « .

La représentation du temps en informatique : timestamp, temps epoch et Unix ?

Pour les ordinateurs, une date sous forme de texte n’est pas très pratique à comprendre, d’autant plus que le format varie d’un pays à un autre. C’est pour cette raison qu’ils utilisent des timestamps . Un timestamp (horodatage) spécifie la date et l’heure exacte d’un événement et se présente sous la forme d’une suite de chiffres. Bien sûr on peut formater à nouveau ce timestamp en une date plus compréhensible pour un humain.

Le temps Unix (Epoch Time) est la quantité de secondes qui se sont écoulées depuis le 1er janvier 1970 à minuit. Cette référence est souvent prise comme point de départ pour déterminer la date et l’heure d’un événement à l’aide d’un timestamp.

Un timestamp égal à 1601054743 veut dire qu’il s’est écoulé 1601054743s depuis le 1er janvier 1970. En format texte, le timestamp équivaut au Mardi 13 Décembre 2022 à 10h12m25s

Prendre en compte le décalage horaire (UTC, GMT)

Pour connaître l’heure locale dans un pays donné, il est nécessaire de prendre en considération le décalage horaire qui s’y applique. L’heure de référence est l’UTC ou GMT, qui est équivalent à un décalage horaire de +0. Ce décalage est ensuite ajusté en fonction du fuseau horaire local. En France, le décalage est +1 en hiver et +2 en été.

Récupérer la date depuis un Internet (Serveur NTP) avec un ESP32 en MicroPython

MicroPython intègre de base le module ntptime qui s’occupe de tout !

import network
import time
import socket
import ntptime
from machine import RTC

ssid = 'upesy-ap'
password = 'cupcakes'

if __name__=="__main__":
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)

    while wlan.isconnected() == False:
        print('.', end = " ")
        time.sleep_ms(500)

    print("Wi-Fi Config: ", wlan.ifconfig())

    ntptime.settime()
    utc_datetime = RTC().datetime()
    print(utc_datetime)

    dt = utc_datetime
    print(f"{dt[0]}-{dt[1]:02}-{dt[2]:02}T{dt[4]:02}:{dt[5]:02}:{dt[6]:02}.{dt[7]:02}")

Une fois que l’ESP32 est connecté au Wi-Fi, on utilise la fonction ntptime.settime() pour mettre à jour l’horloge interne de l’ESP32. Ensuite, on utilise la fonction RTC().datetime() pour récupérer la date et l’heure. Cette fonction renvoie un tuple (une sorte de liste) qui contient les informations suivantes : (year , month , day , weekday , hours , minutes , seconds , subseconds ).

A la fin, le script affiche la date en format ISO 8601 en utilisant les f-string de Python .

Note

Il s’agit de l’heure UTC. Actuellement, il n’y a pas de moyen pratique pour avoir une date qui prend en compte automatiquement les changements d’heure en fonction des zones. Il faudra inclure cette mécanique manuellement.

Prendre en compte les fuseaux horaires : Avoir l’heure locale

Voici des fonctions qui permettent de choisir n’importe quel décalage horaire, pour avoir la bonne heure locale :

import network
import time
import socket
import ntptime
from machine import RTC

ssid = 'upesy-ap'
password = 'cupcakes'

def get_iso_date():
    dt = RTC().datetime()
    return f"{dt[0]}-{dt[1]:02}-{dt[2]:02}T{dt[4]:02}:{dt[5]:02}:{dt[6]:02}.{dt[7]:02}"


def set_tz_offset_date(offset):
    dt = RTC().datetime()
    RTC().datetime((dt        


 
      
    
     

       
           
        

     

Cette section est réservée aux abonnés. Il vous reste 73% à découvrir.

Devenir membre premium

Déjà abonné ? Connectez-vous