🛠 Heure exacte via NTP : l'horloge temps réel des projets connectés

Raspberry Pi Pico W · intermediaire · Schéma : IMG-pico-w-intermediaire-3-picow-ntp-horloge.svg — Pico W envoyant un paquet UDP vers un serveur NTP via Internet, horloge affichant l'heure UTC, ecarts d'horloge interne avant/apres synchronisation annotés

Objetivos

El RP2040 no tiene reloj de tiempo real (RTC): sin una fuente de tiempo, time.time vuelve a empezar desde cero (o desde el año 2000) en cada reinicio, lo cual es un inconveniente grave para registrar la hora de las mediciones o realizar conexiones HTTPS. El SDK oficial proporciona un ejemplo NTP completo en pico_w/wifi/ (carpeta ntp); en MicroPython, unas pocas líneas de socket UDP son suficientes. Vas a entender el paquete NTP v3 de 48 bytes, el desplazamiento de época 1900→1970, y por qué el modo SNTP del SDK es más limpio en C.

Material

Código completo

# ntp.py — synchronisation NTP en MicroPython (UDP brut, paquet 48 octets)
import machine, network, socket, time

wlan = network.WLAN; wlan.active(True)
if not wlan.isconnected:
    wlan.connect('my_ssid', 'my_password')
    while not wlan.isconnected:
        machine.idle

NTP_EPOCH_OFFSET = 2208988800   # secondes entre 1900 et 1970

def sync_time(server='pool.ntp.org'):
    addr = socket.getaddrinfo(server, 123)[0][-1]
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.settimeout(5)
    pkt = bytearray(48)
    pkt[0] = 0x1B               # LI=0, VN=3, mode=3 (client)
    s.sendto(pkt, addr)
    data = s.recv(48)[0]
    secs = int.from_bytes(data[40:44], 'big') - NTP_EPOCH_OFFSET
    machine.RTC.datetime((1970, 1, 1, 0, 0, 0, 0, 0)[:3] +
                           time.gmtime(secs)[3:6] + (0,))
    return secs

t = sync_time
print('UTC :', time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(t)))
# En C SDK : exemple officiel pico_w/wifi/ntp (lwIP) ; lwIP expose aussi
# une API SNTP — > 
# de lwIP embarquee dans le Pico SDK (sntp_setserver vs sntp_set_server).

Verificación esperada

La consola muestra la fecha/hora UTC actual, coherente con la de tu PC. Tras la sincronización, time.time devuelve segundos POSIX reales: tus registros de sensores quedan con marca de tiempo, y el HTTPS con validación de certificado se vuelve posible. Ejecuta un script sin sincronización: la hora vuelve a empezar desde cero — la prueba de que el RP2040 no retiene nada sin NTP (sin RTC, sin batería).

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales