Title:
Station Météo Air Intelligent avec Raspberry Pi : Contrôle Automatique de Ventilation
URL:
station-meteo-air-intelligent-raspberry-pi-controle-automatique-ventilation
Meta Description:
Build un moniteur air qualité avec Raspberry Pi. Contrôle automatique de ventilation via capteurs CO2, COV et particules fines.
Pourquoi surveiller la qualité de l’air dans votre atelier ?
En tant que makers, nous passons des heures dans nos ateliers et laboratoires électroniques, souvent dans des espaces confinés où s’accumulent vapeurs de soudure, poussières de découpe et divers composés volatils. Saviez-vous que l’air d’un atelier d’électronique peut contenir jusqu’à 10 fois plus de particules fines que l’air extérieur ? Ce projet combine Raspberry Pi, capteurs environnementaux et automatisation pour créer un système intelligent de surveillance et de contrôle de la qualité de l’air, avec activation automatique de la ventilation lorsque des seuils critiques sont dépassés.
Matériel requis pour le projet
Pour reproduire ce projet, vous aurez besoin des composants suivants :
- Raspberry Pi 4 (2GB ou plus) avec alimentation
- Carte SD 16GB minimum avec Raspberry Pi OS
- Capteur BME680 (température, humidité, pression, COV)
- Capteur SDS011 (particules fines PM2.5/PM10)
- Capteur SGP30 (CO2 et COV)
- Module relais 5V 2 canaux
- Écran OLED SSD1306 128×64 (optionnel)
- Boîtier avec ventilation pour Raspberry Pi
- Câbles Dupont et breadboard
- Alimentation 5V pour les capteurs
Architecture du système et schéma de câblage
Notre système repose sur une architecture modulaire où chaque capteur communique via I2C ou UART avec le Raspberry Pi. Le schéma de connexion est le suivant :
Connexions I2C (Bus commun)
- BME680 : SDA → GPIO2, SCL → GPIO3, VCC → 3.3V, GND → GND
- SGP30 : SDA → GPIO2, SCL → GPIO3, VCC → 3.3V, GND → GND
- SSD1306 : SDA → GPIO2, SCL → GPIO3, VCC → 3.3V, GND → GND
Connexion SDS011 (UART)
- RX → GPIO15 (TXD), TX → GPIO16 (RXD), VCC → 5V, GND → GND
Module relais
- IN1 → GPIO17, IN2 → GPIO18, VCC → 5V, GND → GND
Installation et configuration logicielle
Commencez par mettre à jour votre système et installer les dépendances nécessaires :
sudo apt update && sudo apt upgrade -ysudo apt install python3-pip python3-venv i2c-tools python3-smbussudo pip3 install RPI.GPIO adafruit-circuitpython-bme680sudo pip3 install adafruit-circuitpython-sgp30 sds011-librarysudo pip3 install pillow adafruit-circuitpython-ssd1306
Activation des interfaces
Activez I2C et UART via raspi-config :
sudo raspi-config# Interface Options → I2C → Yes# Interface Options → Serial Port → No pour console, Yes pour hardware
Développement du script Python principal
Créons notre script principal qui va collecter les données et contrôler le relais :
import timeimport boardimport busioimport adafruit_bme680import adafruit_sgp30from sds011 import SDS011import RPi.GPIO as GPIOfrom PIL import Image, ImageDraw, ImageFontimport adafruit_ssd1306# Configuration GPIORELAY_PIN = 17GPIO.setmode(GPIO.BCM)GPIO.setup(RELAY_PIN, GPIO.OUT)# Initialisation I2Ci2c = busio.I2C(board.SCL, board.SDA)# Initialisation capteursbme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c)sgp30 = adafruit_sgp30.Adafruit_SGP30(i2c)# Initialisation SDS011sensor_sds = SDS011(‘/dev/ttyAMA0’)sensor_sds.sleep(sleep=False)# Initialisation OLEDoled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)# Seuils d’activation ventilationCO2_THRESHOLD = 800 # ppmVOC_THRESHOLD = 200 # ppbPM25_THRESHOLD = 25 # μg/m³def read_sensors(): “”Lecture de tous les capteurs”” data = { ‘temp’: bme680.temperature, ‘humidity’: bme680.humidity, ‘pressure’: bme680.pressure, ‘co2’: sgp30.eCO2, ‘voc’: sgp30.TVOC, ‘pm25’: sensor_sds.query().pm25, ‘pm10’: sensor_sds.query().pm10 } return datadef control_ventilation(data): “”Contrôle du relais en fonction des seuils”” if (data[‘co2’] > CO2_THRESHOLD or data[‘voc’] > VOC_THRESHOLD or data[‘pm25’] > PM25_THRESHOLD): GPIO.output(RELAY_PIN, GPIO.HIGH) return True else: GPIO.output(RELAY_PIN, GPIO.LOW) return Falsedef display_data(data, ventilation_on): “”Affichage sur écran OLED”” image = Image.new(‘1’, (oled.width, oled.height)) draw = ImageDraw.Draw(image) font = ImageFont.load_default() draw.text((0, 0), f”CO2: {data[‘co2’]} ppm”, font=font, fill=255) draw.text((0, 16), f”VOC: {data[‘voc’]} ppb”, font=font, fill=255) draw.text((0, 32), f”PM2.5: {data[‘pm25’]} μg/m³”, font=font, fill=255) draw.text((0, 48), f”VENT: {‘ON’ if ventilation_on else ‘OFF’}”, font=font, fill=255) oled.image(image) oled.show()# Boucle principaletry: while True: sensor_data = read_sensors() vent_status = control_ventilation(sensor_data) display_data(sensor_data, vent_status) print(f”Temp: {sensor_data[‘temp’]:.1f}°C”) print(f”CO2: {sensor_data[‘co2’]} ppm”) print(f”Ventilation: {‘ACTIVE’ if vent_status else ‘INACTIVE’}”) print(“-” * 20) time.sleep(10) except KeyboardInterrupt: GPIO.cleanup() sensor_sds.sleep(sleep=True)
Intégration avec Home Assistant (Optionnel)
Pour ceux qui utilisent Home Assistant, voici comment intégrer notre station météo :
# configuration.yamlsensor: – platform: mqtt name: “Air Quality CO2” state_topic: “air_quality/co2” unit_of_measurement: “ppm” – platform: mqtt name: “Air Quality PM2.5” state_topic: “air_quality/pm25” unit_of_measurement: “μg/m³”automation: – alias: “Activer ventilation si CO2 élevé” trigger: platform: numeric_state entity_id: sensor.air_quality_co2 above: 800 action: service: switch.turn_on entity_id: switch.ventilation_relay
Calibration et optimisation des capteurs
La calibration est cruciale pour des mesures précises :
Calibration du SGP30
Le capteur SGP30 nécessite une calibration de base. Placez-le dans un environnement extérieur propre pendant 30 minutes :
# Script de calibrationbaseline = sgp30.baseline_eCO2sgp30.set_iaq_baseline(baseline)
Optimisation BME680
Pour améliorer la précision du BME680, utilisez ces paramètres :
bme680.sea_level_pressure = 1013.25bme680.humidity_oversample = 2bme680.temp_oversample = 2
Contrôle de systèmes de ventilation externes
Notre système peut contrôler divers types de ventilation via le module relais. Pour les ateliers où des travaux de soudure ou d’usinage génèrent beaucoup de fumées et de poussières, un ventilateur extracteur de fumée professionnel peut être connecté directement au relais. Ces systèmes, conçus pour un débit d’air important, sont idéaux pour les ateliers de makers où la qualité de l’air peut rapidement se dégrader. Le relais GPIO peut commander la mise sous tension de l’extracteur lorsque les seuils de pollution sont dépassés.
Améliorations et extensions possibles
Notre projet peut être étendu de multiples façons :
Ajout de notifications
# Notification Telegramimport requestsdef send_telegram_alert(message): bot_token = ‘YOUR_BOT_TOKEN’ chat_id = ‘YOUR_CHAT_ID’ url = f’https://api.telegram.org/bot{bot_token}/sendMessage’ data = {‘chat_id’: chat_id, ‘text’: message} requests.post(url, data=data)
Stockage des données dans une base SQLite
import sqlite3from datetime import datetimedef init_db(): conn = sqlite3.connect(‘air_quality.db’) c = conn.cursor() c.execute(”’CREATE TABLE IF NOT EXISTS measurements (timestamp TEXT, co2 INTEGER, voc INTEGER, pm25 REAL)”’) conn.commit() conn.close()def save_measurement(data): conn = sqlite3.connect(‘air_quality.db’) c = conn.cursor() timestamp = datetime.now().isoformat() c.execute(“INSERT INTO measurements VALUES (?, ?, ?, ?)”, (timestamp, data[‘co2’], data[‘voc’], data[‘pm25’])) conn.commit() conn.close()
Interface web avec Flask
Créez une interface web pour visualiser les données en temps réel :
from flask import Flask, render_template, jsonifyimport sqlite3app = Flask(__name__)@app.route(‘/’)def dashboard(): return render_template(‘dashboard.html’)@app.route(‘/api/data’)def api_data(): conn = sqlite3.connect(‘air_quality.db’) c = conn.cursor() c.execute(“SELECT * FROM measurements ORDER BY timestamp DESC LIMIT 100”) data = c.fetchall() conn.close() return jsonify(data)
Dépannage et optimisation des performances
Problèmes courants et leurs solutions :
- Capteurs non détectés : Vérifiez les connexions I2C avec
- i2cdetect -y 1
- Mesures incohérentes : Laissez les capteurs s’acclimater 30 minutes
- Interférences RF : Utilisez des câbles blindés pour les connexions longues
- Consommation mémoire : Optimisez le garbage collector Python
Conclusion : Vers un atelier intelligent et sain
Ce projet démontre comment un Raspberry Pi couplé à des capteurs appropriés peut transformer la gestion de la qualité de l’air dans votre atelier. Le système non seulement surveille en temps réel les paramètres critiques, mais agit également de manière proactive pour maintenir un environnement de travail sain. La modularité du projet permet d’ajouter facilement de nouveaux capteurs ou fonctionnalités selon vos besoins spécifiques. N’hésitez pas à partager vos améliorations et variantes de ce projet dans les commentaires !

