PasFuteFute - Elle/il sait quel feutre a le meilleur goût.
(Permalink)
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.
Pour reproduire ce projet, vous aurez besoin des composants suivants :
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 :
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
Activez I2C et UART via raspi-config :
sudo raspi-config# Interface Options → I2C → Yes# Interface Options → Serial Port → No pour console, Yes pour hardware
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)
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
La calibration est cruciale pour des mesures précises :
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)
Pour améliorer la précision du BME680, utilisez ces paramètres :
bme680.sea_level_pressure = 1013.25bme680.humidity_oversample = 2bme680.temp_oversample = 2
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.
Notre projet peut être étendu de multiples façons :
# 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)
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()
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)
Problèmes courants et leurs solutions :
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 !
L’article Station Air Intelligent Raspberry Pi : Contrôle Ventilation est apparu en premier sur Raspberry Pi France.