TPs IoT - 3 Projets | BTS Electronique

TPs Internet des Objets (IoT)

3 Projets : MQTT, ThingSpeak, Dashboard Node-RED

📨 MQTT ☁️ Cloud 📊 Dashboard
📨

TP1 : Communication MQTT

Protocole Publish/Subscribe pour IoT

🎯 Objectifs

  • Comprendre le protocole MQTT et ses concepts
  • Configurer un broker MQTT
  • Publier et souscrire a des topics
  • Échanger des donnees entre ESP32

Architecture MQTT

                         BROKER MQTT
                      (broker.hivemq.com)
                      ┌───────────────────┐
                      │                   │
           ┌──────────┤    TOPICS         ├──────────┐
           │          │                   │          │
           │          │ bts/salle1/temp   │          │
           │          │ bts/salle1/hum    │          │
           │          │ bts/led/cmd       │          │
           │          │                   │          │
           │          └───────────────────┘          │
           │                   ▲                     │
      PUBLISH                  │               SUBSCRIBE
           │                   │                     │
           ▼                   │                     ▼
    ┌─────────────┐            │           ┌─────────────┐
    │   ESP32     │            │           │   ESP32     │
    │  CAPTEUR    │────────────┘           │    LED      │
    │  (DHT11)    │                        │  (actuator) │
    └─────────────┘                        └─────────────┘
    
    QoS (Quality of Service):
    - QoS 0 : Au plus une fois (fire & forget)
    - QoS 1 : Au moins une fois (ACK)
    - QoS 2 : Exactement une fois (handshake)
                    

Code ESP32 : Publisher MQTT

# TP1 : MQTT Publisher (MicroPython ESP32)

from umqtt.simple import MQTTClient
import network
import dht
from machine import Pin
import time
import json

# Configuration
WIFI_SSID = "VotreWiFi"
WIFI_PASS = "MotDePasse"
MQTT_BROKER = "broker.hivemq.com"
MQTT_PORT = 1883
CLIENT_ID = "esp32_bts_pub"
TOPIC_TEMP = "bts/salle1/temperature"
TOPIC_HUM = "bts/salle1/humidity"

# Capteur DHT11
sensor = dht.DHT11(Pin(4))

# Connexion WiFi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASS)
while not wlan.isconnected():
    time.sleep(1)
print(f"WiFi OK: {wlan.ifconfig()[0]}")

# Connexion MQTT
client = MQTTClient(CLIENT_ID, MQTT_BROKER, MQTT_PORT)
client.connect()
print("MQTT connecte!")

# Publication periodique
while True:
    try:
        sensor.measure()
        temp = sensor.temperature()
        hum = sensor.humidity()
        
        # Publier temperature
        client.publish(TOPIC_TEMP, str(temp))
        # Publier humidite
        client.publish(TOPIC_HUM, str(hum))
        
        print(f"📤 T={temp}°C, H={hum}%")
        
    except Exception as e:
        print(f"Erreur: {e}")
    
    time.sleep(10)

Code ESP32 : Subscriber MQTT

# MQTT Subscriber - Controle LED

from umqtt.simple import MQTTClient
from machine import Pin
import network, time

led = Pin(2, Pin.OUT)
TOPIC_CMD = "bts/led/cmd"

def callback(topic, msg):
    print(f"📥 {topic}: {msg}")
    if msg == b"ON":
        led.value(1)
    elif msg == b"OFF":
        led.value(0)

# ... connexion WiFi ...

client = MQTTClient("esp32_bts_sub", "broker.hivemq.com")
client.set_callback(callback)
client.connect()
client.subscribe(TOPIC_CMD)

print("🎧 En ecoute sur", TOPIC_CMD)

while True:
    client.check_msg()
    time.sleep_ms(100)
☁️

TP2 : Plateforme Cloud ThingSpeak

Stockage et visualisation de donnees IoT

Configuration ThingSpeak

  1. Creer un compte sur thingspeak.com
  2. Creer un nouveau Channel
  3. Ajouter les Fields : Field1=Temperature, Field2=Humidity
  4. Copier la Write API Key

Code : Envoi vers ThingSpeak

# TP2 : Envoi donnees vers ThingSpeak

import urequests
import network
import dht
from machine import Pin
import time

# Configuration ThingSpeak
API_KEY = "VOTRE_WRITE_API_KEY"
URL = "http://api.thingspeak.com/update"

sensor = dht.DHT11(Pin(4))

# ... connexion WiFi ...

while True:
    try:
        sensor.measure()
        temp = sensor.temperature()
        hum = sensor.humidity()
        
        # Construire URL avec parametres
        params = f"?api_key={API_KEY}&field1={temp}&field2={hum}"
        
        # Envoyer requete HTTP GET
        response = urequests.get(URL + params)
        print(f"ThingSpeak: {response.text}")
        response.close()
        
    except Exception as e:
        print(f"Erreur: {e}")
    
    time.sleep(15)  # ThingSpeak: min 15s entre updates
📊

TP3 : Dashboard Node-RED

Interface de visualisation et controle

Installation Node-RED

# Installation sur Raspberry Pi ou PC
npm install -g node-red
npm install node-red-dashboard

# Lancer Node-RED
node-red

# Acceder a l'interface
# http://localhost:1880
# Dashboard: http://localhost:1880/ui

Flow Node-RED : MQTT → Dashboard

    ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
    │  MQTT In    │────▶│   Function  │────▶│   Gauge     │
    │             │     │   (parse)   │     │ Temperature │
    │ bts/salle1/ │     │             │     │             │
    │ temperature │     └─────────────┘     └─────────────┘
    └─────────────┘
    
    ┌─────────────┐     ┌─────────────┐
    │   Button    │────▶│  MQTT Out   │
    │  (ON/OFF)   │     │             │
    │             │     │ bts/led/cmd │
    └─────────────┘     └─────────────┘

    Configuration MQTT In:
    - Server: broker.hivemq.com:1883
    - Topic: bts/salle1/temperature
    - QoS: 0
                    

Criteres d'evaluation

CriterePoints
TP1 : Communication MQTT bidirectionnelle/7
TP2 : Envoi donnees vers ThingSpeak/6
TP3 : Dashboard Node-RED fonctionnel/7
Total/20

TPs IoT - MQTT, Cloud, Dashboard