Micro station météo avec un ESP 8266

Micro station météo avec un ESP8266

Créer une station météo connectée est un excellent projet pour découvrir l’IoT et le microcontrôleur ESP8266. Ce module permet de mesurer les conditions environnementales en temps réel et d’envoyer les données vers une API distante.

La station météo permet de :

  • mesurer la température
  • mesurer l’humidité
  • mesurer la pression atmosphérique
  • afficher les données sur un écran OLED
  • envoyer les mesures vers une API REST

Matériel utilisé

Microcontrôleur

  • ESP8266 (ESP8266MOD ou NodeMCU)
  • Connexion WiFi intégrée
  • Compatible MicroPython

Capteur environnemental

  • BME280 : capteur 3 en 1
  • Température
  • Humidité
  • Pression atmosphérique
  • Communication I2C

Affichage

  • Écran OLED 128x64
  • Contrôleur SSD1306
  • Interface I2C
  • Faible consommation électrique

Schéma de câblage (I2C)

Le bus I2C permet de connecter plusieurs périphériques avec seulement deux fils.

Signal ESP8266 OLED BME280
SDA GPIO4 (D2) SDA SDA
SCL GPIO5 (D1) SCL SCL
VCC 3.3V VCC VCC
GND GND GND GND

Adresses I2C :

  • OLED : 0x3C
  • BME280 : 0x76

Fonctionnement du module météo

  1. Connexion au réseau WiFi
  2. Lecture des mesures du capteur BME280
  3. Affichage des données sur l’écran OLED
  4. Envoi des mesures vers une API HTTP
  5. Attente de 30 secondes
  6. Nouvelle mesure

Code MicroPython ESP8266

Capteur barométrique, température et humidité : BME280
Module d'affichage : module IIC OLED LCD 128X64
Mini carte de développement : ESP8266 WiFi

# Affichage OLED SSD1306 en MicroPython | MicroPython SSD1306  OLED display
# affiche les mesures d'un capteur BME280 i2c sur un ecran OLED
# Display values from an i2c BME280 sensor on OLED screen

from machine import Pin, I2C
import time, ssd1306, bme280, PostHTTP, ConnectWifi, ujson, urequests

pinScl       = 5  #ESP8266 GPIO5 (D1)
pinSda       = 4  #ESP8266 GPIO4 (D2)
addrOled     = 60  #0x3c
addrBME280   = 118 #0x76
hSize        = 64  # Hauteur ecran en pixels | display heigh in pixels
wSize        = 128 # Largeur ecran en pixels | display width in pixels

dustDensity  = 5

oledIsConnected = False
bmeIsConnected  = False
pa = 0
hum = 0
hum = 0
apiKey = 'apiKey'
url = 'https://api.ms-only.net/meteo/'

# init ic2 object
i2c = I2C(scl=Pin(pinScl), sda=Pin(pinSda)) #ESP8266 5/4

# Scan le bus i2c et verifie si le BME280 et l'ecran OLED sont connectes
# Scan i2c bus and check if BME2 and OLDE display are connected
#print('Scan i2c bus...')
devices = i2c.scan()
if len(devices) == 0:
  print("No i2c device !")
else:
  print('i2c devices found:', len(devices))
  for device in devices: 
    if device == addrOled:
      oledIsConnected = True
    if device == addrBME280:
      bmeIsConnected = True  
    print(device)

#print("Tentative de connexion")    
ConnectWifi.CONNECTWIFI.connect()
    
while True:  

  if bmeIsConnected:
    bme = bme280.BME280(i2c=i2c,address=addrBME280)
    print("BME280 values:")
    print(bme.values)
    temp,pa,hum = bme.values 
    print(temp)
    print(pa) 
    print(hum)
    
  if oledIsConnected:
    oled = ssd1306.SSD1306_I2C(wSize, hSize, i2c, addrOled)
    oled.fill(0)
    if bmeIsConnected:     
      oled.text("Temp. "+temp, 0, 0)
      oled.text("PA "+pa, 0, 17)
      oled.text("Hum. "+hum, 0, 34)       
      oled.show()
    else:   
      oled.text("BME KO", 0, 0)
      oled.show()
  else:
    print('! No i2c display')
   
  if bmeIsConnected:      
   
    headers = {'Content-Type': 'application/json', 'charset': 'utf-8'}
    
    dict = PostHTTP.POSTHTTP.send(apiKey, temp, pa, hum, dustDensity)
    #print(dict)
    response = urequests.post(url , data = dict, headers=headers)
    print(response.text)
    time.sleep_ms(30000)
class CONNECTWIFI:  
    def connect():
        import network
        
        ip        = '192.168.0.27'
        subnet    = '255.255.255.0'
        gateway   = '192.168.0.1'
        dns       = '1.1.1.1'
        ssid      = "SSID"
        password  = "passwd"
     
        station = network.WLAN(network.STA_IF)
     
        if station.isconnected() == True:
            print("Already connected")
            return
     
        station.active(True)
        station.ifconfig((ip,subnet,gateway,dns))
        station.connect(ssid, password)
     
        while station.isconnected() == False:
            pass
     
        print("Connection successful")
        print(station.ifconfig())

    def disconnect():
        import network
        station = network.WLAN(network.STA_IF)
        station.disconnect()
        station.active(False)
class POSTHTTP:  
    def send(apiKey, temp, pa, hum, dust):
      dict = '['
      dict = dict + '{"apikey":"' + apiKey + '"},'
      dict = dict + '{"location": [48.772938, 2.072463]},'
      dict = dict + '{"sensors":' 
      dict = dict + '['
      dict = dict + '{"device":"temperature",'
      dict = dict + '"unity":"c",'
      dict = dict + '"values":"' + temp + '"},'
      dict = dict + '{"device":"pressure",'
      dict = dict + '"unity":"hpa",'
      dict = dict + '"values":"' + pa + '"},'
      dict = dict + '{"device":"hygrometry",' 
      dict = dict + '"unity":"%",'  
      dict = dict + '"values":"' + hum + '"}'
      dict = dict + ']'
      dict = dict + '}'      
      dict = dict + '] '
      return dict

Améliorations possibles

  • ajouter capteur pluie
  • ajouter capteur vent
  • alimentation solaire
  • mode deep sleep
  • envoi MQTT

Conclusion

Cette micro station météo basée sur ESP8266 constitue une excellente base pour un projet IoT complet. Elle peut évoluer facilement vers une station météo connectée au cloud.

jensepas

Auteur de l'article

jensepas

Publié le : 11/08/2020
Mise à jour : 25/03/2026