Station météo Raspberry Pi Zero avec BME280, DS18B20 et TSL2561

Station météo Raspberry Pi Zero avec BME280, DS18B20 et TSL2561

Ce projet montre comment créer une station météo basée sur Raspberry Pi Zero capable de collecter des données environnementales et de les envoyer vers une API distante.

Le système lit plusieurs capteurs et affiche les valeurs en temps réel sur un écran OLED.

Les mesures collectées :

  • température
  • humidité
  • pression atmosphérique
  • luminosité ambiante (lux)
  • niveau infrarouge

Ce projet est idéal pour l’expérimentation IoT, la domotique ou l’enregistrement de données environnementales.


Matériel utilisé

Carte principale

  • Raspberry Pi Zero ou Raspberry Pi Zero W
  • Système Linux
  • support du bus I2C

Capteurs

  • BME280 capteur environnemental :
    • température
    • humidité
    • pression atmosphérique
  • DS18B20 capteur de température numérique (bus 1-wire)
  • TSL2561 capteur de luminosité :
    • lumière visible
    • lumière infrarouge
    • mesure en lux

Affichage

  • écran OLED 128x64
  • contrôleur SSD1306
  • communication I2C

Architecture du système

Le Raspberry Pi Zero lit les données des capteurs via les interfaces I2C et 1-wire. Les mesures sont affichées sur un écran OLED puis envoyées vers une API HTTP.

  1. lecture de la température via le capteur DS18B20
  2. lecture de l’humidité et de la pression via le BME280
  3. lecture de la luminosité via le TSL2561
  4. affichage des mesures sur l’écran OLED
  5. envoi des données vers une API REST
  6. nouvelle mesure toutes les 30 secondes

Activation du capteur 1-wire DS18B20

Le capteur DS18B20 nécessite l’activation du bus 1-wire sous Linux :


os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

La température est ensuite accessible via un fichier système Linux.


Code Python

from PIL import ImageFont
from PIL import ImageDraw
from PIL import Image

from BME280 import *
import SSD1306 as Adafruit_SSD1306

import os
import glob
import time
import requests
import smbus
import tsl2561

import PostHTTP

apiKey = 'API_KEY'
url = 'https://api.ms-only.net/meteo/'

RST = None

disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

disp.begin()

disp.clear()
disp.display()

width = disp.width
height = disp.height

image = Image.new('1', (width, height))

draw = ImageDraw.Draw(image)

draw.rectangle((0,0,width,height), outline=0, fill=0)

font = ImageFont.load_default()

base_dir = '/sys/bus/w1/devices/'

device_folder = glob.glob(base_dir + '28*')[0]

device_file = device_folder + '/w1_slave'


def read_temp_raw():

    f = open(device_file, 'r')

    lines = f.readlines()

    f.close()

    return lines


def read_temp():

    lines = read_temp_raw()

    while lines[0].strip()[-3:] != 'YES':

        time.sleep(0.2)

        lines = read_temp_raw()

    equals_pos = lines[1].find('t=')

    if equals_pos != -1:

        temp_string = lines[1][equals_pos+2:]

        temp_c = float(temp_string) / 1000.0

        return str(temp_c)


sensor = BME280()

bus = smbus.SMBus(1)

sensorLux = tsl2561.Tsl2561(bus)

while True:

    draw.rectangle((0,0,width,height), outline=0, fill=0)

    temp_ds18b20 = read_temp()

    temp_bme280 = round(sensor.read_temperature(), 2)

    pressure = round(sensor.read_pressure()/100, 2)

    humidity = round(sensor.read_humidity(), 2)

    lux_full, lux_ir = sensorLux.lux

    lux_full = round(lux_full,2)

    lux_ir = round(lux_ir,2)

    draw.text((0,0),"Temp: " + str(temp_bme280) + " C", font=font, fill=255)

    draw.text((0,10),"Hum: " + str(humidity) + " %", font=font, fill=255)

    draw.text((0,20),"Press: " + str(pressure) + " hPa", font=font, fill=255)

    draw.text((0,30),"Lux: " + str(lux_full), font=font, fill=255)

    draw.text((0,40),"IR: " + str(lux_ir), font=font, fill=255)

    disp.image(image)

    disp.display()

    headers = {
        'Content-Type': 'application/json'
    }

    payload = PostHTTP.POSTHTTP.send(

        apiKey,

        str(temp_bme280),

        str(pressure),

        str(humidity),

        str(lux_full),

        str(lux_ir),

        "0"
    )

    response = requests.post(

        url,

        data=payload,

        headers=headers

    )

    time.sleep(30)

Exemple de données envoyées à l’API

{
 "temperature": 21.5,
 "pressure": 1013,
 "humidity": 45,
 "lux": 320,
 "infrared": 120
}

Améliorations possibles

  • ajouter capteur de vent
  • ajouter capteur de pluie
  • stockage en base de données
  • tableau de bord web
  • intégration MQTT
  • visualisation Grafana
  • boîtier extérieur étanche

Conclusion

Cette station météo Raspberry Pi Zero montre comment combiner plusieurs capteurs environnementaux dans un système IoT compact.

Le projet peut facilement évoluer vers une plateforme complète de monitoring météo connectée au cloud.

jensepas

Auteur de l'article

jensepas

Publié le : 01/08/2022
Mise à jour : 25/03/2026