Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Kit capteur PM10, température et humidité DIY Arduino

Composants et fournitures

Outils nécessaires

Applications et services en ligne

À propos du projet

Contexte

Des études expérimentales suggèrent que les particules fines (PM) pourraient agir comme « vecteur » de propagation du virus COVID-19. Le virus serait transporté sur de plus longues distances par les particules en suspension, restant viable heures, jours, voire semaines. La pollution particulaire pourrait ainsi favoriser la propagation du coronavirus, augmentant le nombre d'infections.

En Italie du Nord, le confinement n'a pas réduit significativement les PM, car l'élevage intensif (porcs, vaches, volailles) en produit massivement, outre usines et voitures. Même usines fermées et circulation stoppée, les concentrations de PM en Lombardie sont restées élevées à cause des fermes continuant à produire lisier et polluants. Des chercheurs italiens ont mis en évidence une corrélation significative entre dépassements quotidiens de seuils PM10 et propagation du COVID-19 (période 10-29 fév 2020), avec concentration des cas dans la vallée du Pô, surtout en Lombardie, alors que le Sud était moins touché.

Le PM agirait comme substrat permettant aux virus de rester actifs dans l'atmosphère (heures/jours). Facteurs environnementaux : température élevée et rayonnement solaire accélèrent l'inactivation ; humidité relative élevée favorise la diffusion. La survie virale diminue autour de 50 % HR, mais reste active < 40 % et > 60 %. Une étude de Yale montre que faible humidité favorise propagation et survie des particules infectieuses.

Ma solution

Créer un dispositif reproductible, peu coûteux et simple mesurant PM10, température et humidité relative pour alerter quand les valeurs deviennent potentiellement dangereuses. Le dispositif intègre : capteur PM10, capteur T°/HR, afficheur, 3 LEDs, pilotés par Arduino Nano. Données affichées sur l'écran, LEDs indiquent la situation air.

Quatre situations identifiées :

  1. Normal – PM10 0-25 µg/m³ et HR 40-60 %
  2. Faible – PM10 0-25 µg/m³ et HR <40 % ou >60 %
  3. Faible – PM10 26-50 µg/m³ et HR 40-60 %
  4. Avertissement – PM10 26-50 µg/m³ et HR <40 % ou >60 %
  5. Avertissement – PM10 >51 µg/m³ et HR 40-60 %
  6. Alarme – PM10 >51 µg/m³ et HR <40 % ou >60 %

LEDs associées :

Capteur SDS018 – PM10

Mesure concentration particules 0,3-10 µm par diffusion laser. Sortie numérique UART, ventilateur intégré. Précis, réponse <10 s, résolution 0,3 µg/m³, certifié CE/FCC/RoHS.

Brochage : 1-NC, 2-1µm (PWM), 3-5V, 4-2,5µm (PWM), 5-GND, 6-RX (UART TTL), 7-TX (UART TTL).

Connexion à Arduino Nano : SDS018 5V → Nano 5V ; GND → GND ; TX (broche 7) → RX Nano.

Capteur DHT22

Capteur numérique température/humidité. 3-5 V, 2,5 mA max, HR 0-100 % (précision 2-5 %), T° -40 à 80 °C (±0,5 °C), échantillonnage 0,5 Hz.

Brochage : VDD, DATA, NC, GND.

Connexion : VDD → 5V Nano ; GND → GND ; condensateur 100 nF entre VDD-GND ; résistance 4,7 kΩ pull-up entre DATA-VDD ; DATA → broche D2 Nano.

Bibliothèque Arduino : DHT sensor library by Adafruit v1.3.10.

Écran OLED I2C SSD1306

128×32 pixels, fond noir caractères blancs, driver SSD1306, interface I2C, 3,3-5 V.

Brochage : SDA, SCL, VCC, GND.

Connexion : VCC → 5V ; GND → GND ; SCL → A5 ; SDA → A4.

Bibliothèque : Adafruit SSD1306 v2.2.1.

Connexion des LEDs

Trois LEDs 3 mm (rouge, verte, jaune). Anodes : rouge → D3, verte → D4, jaune → D5. Cathodes : résistance 390 Ω en série vers GND.

Modification hardware Arduino Nano

Pour lire la sortie série du SDS018, il faut modifier l'Arduino Nano : retirer la résistance CMS indiquée (flèche rouge sur photo), la souder verticalement, souder deux fils sur cette résistance, ajouter un connecteur broches au bout. Insérer le cavalier sur ce connecteur uniquement lors de la programmation. Une fois programmé, retirer le cavalier (ou la résistance définitivement) pour permettre lecture SDS018 et moniteur série simultanés.

Alimentation

Arduino Nano alimenté via USB par power bank (ou broche Vin 7-12 V).

Boîtier et assemblage

Boîtier orange PLA imprimé 3D en deux parties : partie basse (Arduino Nano, SDS018) avec ouverture USB Mini-B ; partie haute (DHT22, écran, LEDs) avec 3 trous pour LEDs (agrandissables à 5 mm pour supports). Fichiers 3D joints.

Assemblage : souder LEDs + résistances, gaine thermorétractable, fixer DHT22 et écran à la colle chaude, souder fils sur Nano, fixer Nano à la colle, regrouper fils +/-, gaine thermorétractable, connecter SDS018 via connecteurs femelles, visser SDS018 (M3×6), fermer boîtier (4 vis M3×16).

Firmware

Sketch Arduino. Organigramme simplifié :

  1. Premier tour : délai 2 s (premier relevé DHT22).
  2. Lecture DHT22 → envoi T°/HR sur moniteur série.
  3. Lecture SDS018 → envoi PM2.5/PM10 sur moniteur série.
  4. Gestion LEDs selon seuils PM10/HR (voir situations ci-dessus).
  5. Affichage alterné sur OLED (toutes les 2 s) : PM10 + HR (ou « Alarm!!! » si alarme) / PM2.5 + T°.
  6. Délai 2 s en fin de boucle.

Code complet (Arduino)

#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

int startdhr22 = 0;
int switchDisplay = 0;
const int ledRed = 3;
const int ledGreen = 4;
const int ledYellow = 5;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(ledYellow, OUTPUT);
  dht.begin();
  Serial.begin(9600);
  Serial.println("start");
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  // Test LEDs
  digitalWrite(ledGreen, HIGH); delay(500);
  digitalWrite(ledYellow, HIGH); delay(500);
  digitalWrite(ledRed, HIGH); delay(500);
  digitalWrite(ledGreen, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW);
  delay(500);
}

void loop() {
  // DHT22
  if(0 == startdhr22) { delay(2000); startdhr22 = 1; }
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) { Serial.println(F("Failed to read from DHT sensor!")); return; }
  Serial.print(F("Humidity: ")); Serial.print(h); Serial.print(F("% Temperature: ")); Serial.print(t); Serial.println(F("°C "));

  // SDS018
  uint8_t dataIN[10] = {0};
  float pm25, pm10;
  while(Serial.available() > 0) {
    for(int i=0; i<10; ++i) { dataIN[i] = Serial.read(); }
    if((0xAA == dataIN[0]) && (0xC0 == dataIN[1]) && (0xAB == dataIN[9])) {
      uint8_t cksum = 0;
      for(int i=2; i<=7; ++i) cksum += dataIN[i];
      if(cksum == dataIN[8]) {
        digitalWrite(LED_BUILTIN, HIGH);
        uint8_t pm25Lo = dataIN[2], pm25Hi = dataIN[3];
        uint8_t pm10Lo = dataIN[4], pm10Hi = dataIN[5];
        pm25 = ((pm25Hi * 256.0) + pm25Lo)/10.0;
        pm10 = ((pm10Hi * 256.0) + pm10Lo)/10.0;
        Serial.print("PM2.5: "); Serial.print(pm25); Serial.println(" ug/m3");
        Serial.print("PM10: "); Serial.print(pm10); Serial.println(" ug/m3");
      }
      Serial.println("-----------------");
    }
    Serial.flush();
  }

  // LEDs
  if((pm10 <= 25) && ((h >= 40) && (h <= 60))) { // Normal
    digitalWrite(ledGreen, LOW); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW);
  } else if((pm10 <= 25) && ((h < 40) || (h > 60))) { // Faible
    digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW);
  } else if(((pm10 > 25) && (pm10 <= 50)) && ((h >= 40) && (h <= 60))) { // Faible
    digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, LOW); digitalWrite(ledRed, LOW);
  } else if(((pm10 > 25) && (pm10 <= 50)) && ((h < 40) || (h > 60))) { // Avertissement
    digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, HIGH); digitalWrite(ledRed, LOW);
  } else if((pm10 > 50) && ((h >= 40) && (h <= 60))) { // Avertissement
    digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, HIGH); digitalWrite(ledRed, LOW);
  } else { // Alarme
    digitalWrite(ledGreen, HIGH); digitalWrite(ledYellow, HIGH); digitalWrite(ledRed, HIGH);
  }

  // Affichage OLED
  if(0 == switchDisplay) {
    display.clearDisplay();
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0,0);
    if(pm10 > 50) display.print("Alarm!!!");
    else { display.print("PM10:"); display.println(pm10); }
    display.print(" HR%:"); display.println(h);
    display.display();
    switchDisplay = 1;
  } else {
    display.clearDisplay();
    display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
    display.setCursor(0,0);
    display.print("PM25:"); display.println(pm25);
    display.print("T[C]:"); display.println(t);
    display.display();
    switchDisplay = 0;
  }
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1500);
}

Pièces personnalisées et boîtiers

Schéma électrique

Schéma de câblage complet (image non incluse).

Processus de fabrication

  1. L'approche circulaire de SABIC : Emballages plastiques, sécurité et durabilité face au COVID‑19
  2. Comment le COVID-19 a accéléré l'automatisation dans l'industrie du plastique
  3. COVID-19 et la fin du paradigme économique d'après-guerre
  4. L'effet pandémie : le COVID-19 accélère l'innovation blockchain et cryptomonnaies
  5. La COVID-19 accélère la fin des appels d'offres annuels des chargeurs
  6. Wayfair et COVID-19 : naviguer les défis des vendeurs exonérés de taxe dans une économie post-pandémie
  7. Combler le fossé des compétences : stratégies de reconversion et reformation post-COVID pour les fabricants
  8. Guide et ressources COVID-19 pour les dirigeants manufacturiers
  9. Comment la COVID-19 redessine l'avenir du travail et de l'automatisation — Insights d'une nouvelle étude