AccueilAteliersStation météo
ATELIER 03 Débutant

Station météo

Mesure la température avec un capteur DS18B20 (1-Wire) et affiche les données sur un écran OLED SSD1306. Un seul fil suffit pour lire le capteur !

3h

ESP32DS18B20OLEDI2C1-Wire

Ce que tu vas créer

Une station météo qui lit la température en temps réel et l’affiche sur un petit écran OLED. Le projet combine deux protocoles de communication différents :


Matériel nécessaire

ComposantQuantitéNotes
ESP321Fourni en atelier
Capteur DS18B201Version TO-92 ou module étanche
Résistance 4.7 kΩ1Pull-up obligatoire sur le fil DATA
Écran OLED SSD1306 128x641Interface I2C (4 broches)
Câble micro-USB1Fourni en atelier

Connexions

câblage
DS18B20 VCC  ──── ESP32 3.3V
DS18B20 GND  ──── ESP32 GND
DS18B20 DATA ──── ESP32 GPIO27  (+ résistance 4.7kΩ vers 3.3V)

OLED VCC  ──── ESP32 3.3V
OLED GND  ──── ESP32 GND
OLED SDA  ──── ESP32 GPIO21
OLED SCL  ──── ESP32 GPIO22

Le code

Station météo MicroPython — main.py .python
atelier3-station-meteo/main.py
94 lignes GitHub
# Atelier 03 — Station météo (DS18B20 + OLED SSD1306)
# Fablab Ardèche — MicroPython
#
# Mesure la température avec un capteur DS18B20 (1-Wire)
# et affiche les données sur un écran OLED SSD1306.
#
# Matériel : ESP32, DS18B20, résistance 4.7kΩ, OLED SSD1306 128x64
# Connexions :
#   DS18B20 DATA → GPIO27  (+ résistance 4.7kΩ vers 3.3V)
#   OLED SDA     → GPIO21
#   OLED SCL     → GPIO22

from machine import Pin, I2C
import onewire, ds18x20
import ssd1306
import time, math

# --- Initialisation DS18B20 ---
ow  = onewire.OneWire(Pin(27))
ds  = ds18x20.DS18X20(ow)
capteurs = ds.scan()

if not capteurs:
    print("Aucun capteur DS18B20 trouvé !")
    print("Vérifie le câblage et la résistance 4.7kΩ")
else:
    print(f"{len(capteurs)} capteur(s) trouvé(s)")

# --- Initialisation OLED ---
i2c  = I2C(0, scl=Pin(22), sda=Pin(21), freq=400_000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

# --- Historique pour le graphique ---
HIST_MAX = 64
historique = []

def lire_temperature():
    if not capteurs:
        return None
    ds.convert_temp()
    time.sleep_ms(750)
    return ds.read_temp(capteurs[0])

def afficher(temp, mini, maxi):
    oled.fill(0)

    if temp is None:
        oled.text("Capteur absent!", 0, 24)
        oled.show()
        return

    # Titre
    oled.text("Station Meteo", 0, 0)
    oled.hline(0, 10, 128, 1)

    # Température principale
    t_str = f"{temp:.1f}C"
    oled.text(t_str, 0, 16)

    # Mini / Maxi
    oled.text(f"min:{mini:.0f} max:{maxi:.0f}", 0, 30)

    # Graphique de l'historique
    if len(historique) >= 2:
        plage = maxi - mini if maxi != mini else 1
        for x, val in enumerate(historique[-64:]):
            y = int(63 - ((val - mini) / plage) * 18)
            y = max(44, min(63, y))
            oled.pixel(x, y, 1)

    oled.hline(0, 44, 128, 1)
    oled.show()

# --- Boucle principale ---
print("Station météo démarrée")
mini_t = 99.0
maxi_t = -99.0

while True:
    temp = lire_temperature()

    if temp is not None:
        if temp < mini_t:
            mini_t = temp
        if temp > maxi_t:
            maxi_t = temp
        historique.append(temp)
        if len(historique) > HIST_MAX:
            historique.pop(0)
        print(f"Température : {temp:.2f} °C  (min {mini_t:.1f} / max {maxi_t:.1f})")

    afficher(temp, mini_t, maxi_t)
    time.sleep(2)

Comment ça marche

Lire le capteur DS18B20

Le protocole 1-Wire permet de connecter plusieurs capteurs sur un seul fil. MicroPython intègre une librairie dédiée :

import onewire, ds18x20
from machine import Pin

# Initialiser le bus 1-Wire sur GPIO27
ow = onewire.OneWire(Pin(27))
ds = ds18x20.DS18X20(ow)

# Chercher les capteurs connectés
roms = ds.scan()

# Lancer une mesure puis lire
ds.convert_temp()
time.sleep_ms(750)          # attendre la conversion (750ms max)
temp = ds.read_temp(roms[0])
print(f"Température : {temp:.1f} °C")

Afficher sur l’écran OLED

from machine import I2C
import ssd1306

i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.fill(0)                         # effacer l'écran
oled.text("Station meteo", 0, 0)
oled.text(f"Temp: {temp:.1f} C", 0, 20)
oled.show()                          # envoyer vers l'écran

Pour aller plus loin

Ajouter humidité DHT22

Branche un capteur DHT22 pour mesurer aussi le taux d'humidité et l'afficher sur l'OLED.

Alertes WiFi

Envoie une notification sur ton téléphone quand la température dépasse un seuil.

Plusieurs capteurs sur un fil

Le protocole 1-Wire supporte plusieurs DS18B20 sur le même fil — mesure différentes pièces.