- Komponenter, der kræves
- Nova PM-sensor SDS011 til måling af PM2.5 og PM10
- Grundlæggende om 0,96 'OLED-skærmmodul
- Forberedelse af MQ-7-sensoren til måling af kulilte (CO)
- Beregning af luftkvalitetsindeks
- Kredsløbsdiagram
- Opbygning af Air Quality Monitoring System Circuit på Perf Board
- Adafruit IO-opsætning
- Kode Forklaring til
- 3D-trykt kabinet til AQI-overvågningssystem
- Test af AQI-overvågningssystemet
Når vinteren begynder, tykner luften, der hænger over os, med røg og luftformige emissioner fra brændende marker, industrifabrikker og køretøjstrafik, der blokerer solen og gør det svært at trække vejret. Eksperter siger, at de høje niveauer af luftforurening og COVID-19-pandemi kan være en farlig blanding, der kan have alvorlige konsekvenser. Nødvendigheden af realtidsovervågning af luftkvalitet er meget skarp.
Så i dette projekt skal vi bygge et ESP32-overvågningssystem til luftkvalitet ved hjælp af Nova PM SDS011-sensor, MQ-7-sensor og DHT11-sensor. Vi bruger også et OLED-displaymodul til at vise luftkvalitetsværdier. Den luftkvalitetsindeks (AQI) i Indien er baseret på otte forurenende stoffer, PM10, PM2,5, SO2 og NO2, CO, ozon, NH3, og Pb. Det er dog ikke nødvendigt at måle alle forurenende stoffer. Så vi skal måle koncentrationen af PM2.5, PM10 og kulilte for at beregne luftkvalitetsindekset. AQI-værdierne vil blive offentliggjort på Adafruit IO, så vi kan overvåge det overalt. Tidligere har vi også målt koncentrationen af LPG, røg og ammoniakgas ved hjælp af Arduino.
Komponenter, der kræves
- ESP32
- Nova PM-sensor SDS011
- 0,96 'SPI OLED-skærmmodul
- DHT11-sensor
- MQ-7 sensor
- Jumper Wires
Nova PM-sensor SDS011 til måling af PM2.5 og PM10
SDS011-sensoren er en meget ny luftkvalitetssensor udviklet af Nova Fitness. Det fungerer på princippet om laserspredning og kan få partikelkoncentrationen mellem 0,3 og 10 μm i luften. Denne sensor består af en lille ventilator, luftindgangsventil, laserdiode og fotodiode. Luften kommer ind gennem luftindgangen, hvor en lyskilde (Laser) oplyser partiklerne, og det spredte lys omdannes til et signal af en fotodetektor. Disse signaler forstærkes derefter og behandles for at få partikelkoncentrationen af PM2.5 og PM10. Vi har tidligere brugt Nova PM Sensor med Arduino til at beregne koncentrationen af PM10 & PM2.5.
SDS011 sensor specifikationer:
- Output: PM2.5, PM10
- Måleområde: 0,0-999,9 μg / m3
- Indgangsspænding: 4.7V til 5.3V
- Maksimal strøm: 100mA
- Søvnstrøm: 2mA
- Svartid: 1 sekund
- Seriel dataoutputfrekvens: 1 gang / sekund
- Partikeldiameteropløsning: ≤0,3μm
- Relativ fejl: 10%
- Temperaturområde: -20 ~ 50 ° C
Grundlæggende om 0,96 'OLED-skærmmodul
OLED (Organic Light Emitting Diode) er en slags lysemitterende diode, der er lavet ved hjælp af organiske forbindelser, der exciterer, når den elektriske strøm får lov til at strømme gennem dem. Disse organiske forbindelser har deres eget lys, hvorfor de ikke kræver nogen baggrundsbelysning som normale LCD-skærme. På grund af denne grund er OLED-skærmteknologi energieffektiv og udbredt i fjernsyn og andre skærmprodukter.
Forskellige typer OLED'er er tilgængelige på markedet baseret på skærmens farve, antal ben, størrelse og controller IC. I denne vejledning bruger vi det monokrome blå 7-benede SSD1306 0,96 ”OLED-modul, der er 128 pixels bredt og 64 pixels langt. Denne 7-polede OLED understøtter SPI-protokol og controller IC SSD1306 hjælper OLED med at vise de modtagne tegn. Lær mere om OLED og dets grænseflade til forskellige mikrocontrollere ved at følge linket.
Forberedelse af MQ-7-sensoren til måling af kulilte (CO)
MQ-7 CO- kulmonoxid- gassensormodul registrerer koncentrationerne af CO i luften. Sensoren kan måle koncentrationer på 10 til 10.000 ppm. MQ-7-sensor kan enten købes som et modul eller bare som en sensor alene. Tidligere har vi brugt mange forskellige typer gassensorer til at detektere og måle forskellige gasser, du kan også tjekke dem ud, hvis du er interesseret. I dette projekt bruger vi MQ-7 sensormodulet til at måle kuliltekoncentration i PPM. Kredsløbsdiagrammet til MQ-7-kortet er angivet nedenfor:
Belastningsmodstanden RL spiller en meget vigtig rolle for at få sensoren til at fungere. Denne modstand ændrer sin modstandsværdi i henhold til koncentrationen af gas. MQ-7 sensorkortet leveres med en belastningsmodstand på 1KΩ, der er ubrugelig og påvirker sensoraflæsningerne. Så for at måle de passende CO-koncentrationsværdier skal du udskifte 1KΩ-modstanden med en 10KΩ-modstand.
Beregning af luftkvalitetsindeks
AQI i Indien beregnes ud fra den gennemsnitlige koncentration af et bestemt forurenende stof målt over et standard tidsinterval (24 timer for de fleste forurenende stoffer, 8 timer for kulilte og ozon). For eksempel er AQI for PM2.5 og PM10 baseret på 24-timers gennemsnitskoncentration og AQI for kulilte er baseret på 8-timers gennemsnitskoncentration). AQI-beregningerne inkluderer de otte forurenende stoffer, der er PM10, PM2.5, kvælstofdioxid (NO 2), svovldioxid (SO 2), kulilte (CO), ozon på jorden (O 3), ammoniak (NH 3), og bly (Pb). Imidlertid måles alle forurenende stoffer ikke hvert sted.
Baseret på de målte 24-timers omgivelseskoncentrationer af et forurenende stof beregnes et subindeks, som er en lineær funktion af koncentrationen (f.eks. Vil subindekset for PM2.5 være 51 ved koncentration 31 µg / m3, 100 ved koncentration 60 µg / m3 og 75 i en koncentration på 45 µg / m3). Det værste underindeks (eller maksimum af alle parametre) bestemmer den samlede AQI.
Kredsløbsdiagram
Kredsløbsdiagrammet til IoT-baseret luftkvalitetsovervågningssystem er meget simpelt og angivet nedenfor:
SDS011-sensor, DHT11 og MQ-7-sensor får strøm med + 5V, mens OLED-skærmmodulet får strøm med 3,3V. Senderen og modtagerstifterne i SDS011 er tilsluttet GPIO16 & 17 i ESP32. Analog ud-stiften på MQ-7-sensoren er tilsluttet GPIO 25, og datapinnen på DHT11-sensoren er tilsluttet GPIO27-sensoren. Da OLED Display-modulet bruger SPI-kommunikation, har vi etableret en SPI-kommunikation mellem OLED-modulet og ESP32. Forbindelserne er vist i nedenstående tabel:
S. nr |
OLED-modulstift |
ESP32 Pin |
1 |
GND |
Jord |
2 |
VCC |
5V |
3 |
D0 |
18 |
4 |
D1 |
23 |
5 |
RES |
2 |
6 |
DC |
4 |
7 |
CS |
5 |
S. nr |
SDS011 Pin |
ESP32 Pin |
1 |
5V |
5V |
2 |
GND |
GND |
3 |
RX |
17 |
4 |
TX |
16 |
S. nr |
DHT-stift |
ESP32 Pin |
1 |
Vcc |
5V |
2 |
GND |
GND |
3 |
Data |
27 |
S. nr |
MQ-7 ben |
ESP32 Pin |
1 |
Vcc |
5V |
2 |
GND |
GND |
3 |
A0 |
25 |
Opbygning af Air Quality Monitoring System Circuit på Perf Board
Som du kan se fra hovedbilledet, var ideen at bruge dette kredsløb inde i et 3D-trykt kabinet. Så det komplette kredsløb vist ovenfor er loddet på et perf-kort. Sørg for at bruge ledninger til at forlade tilstrækkelig afstand til at montere OLED og sensorer. Mit perfkort loddet til OLED, og sensormodulet er vist nedenfor.
Adafruit IO-opsætning
Adafruit IO er en åben dataplatform, der giver dig mulighed for at samle, visualisere og analysere live data i skyen. Ved hjælp af Adafruit IO kan du uploade, vise og overvåge dine data over internettet og gøre dit projekt IoT aktiveret. Du kan styre motorer, læse sensordata og lave seje IoT-applikationer over internettet ved hjælp af Adafruit IO.
For at bruge Adafruit IO skal du først oprette en konto på Adafruit IO. For at gøre dette skal du gå til Adafruit IO-webstedet og klikke på 'Kom godt i gang gratis' øverst til højre på skærmen.
Når du er færdig med oprettelsen af kontoen, skal du logge ind på kontoen og klikke på 'Vis AIO-nøgle' i øverste højre hjørne for at få kontoens brugernavn og AIO-nøgle.
Når du klikker på 'AIO-nøgle', vises et vindue med Adafruit IO AIO-nøgle og brugernavn. Kopier denne nøgle og brugernavn, den bruges i kode.
Efter at have fået AIO-tasterne skal du oprette et feed til at gemme DHT-sensordataene. For at oprette et feed skal du klikke på 'Feed'. Klik derefter på 'Handlinger', og vælg derefter 'Opret et nyt feed' blandt de tilgængelige indstillinger.
Herefter åbnes et nyt vindue, hvor du skal indtaste feedets navn og beskrivelse. At skrive en beskrivelse er valgfri.
Klik på 'Opret' efter dette; du bliver omdirigeret til det nyoprettede feed.
Til dette projekt oprettede vi i alt seks feeds til PM10-, PM2.5-, CO-, temperatur-, fugtigheds- og AQI-værdier. Følg den samme procedure som ovenfor for at oprette resten af feeds.
Efter oprettelse af feeds opretter vi nu en Adafruit IO-dashboardfunktion for at visualisere sensordataene på en enkelt side. Til det skal du først oprette et dashboard og derefter tilføje alle disse feeds i dette dashboard.
For at oprette et dashboard skal du klikke på indstillingen Dashboard og derefter klikke på 'Handling' og derefter klikke på 'Opret et nyt dashboard.'
I det næste vindue skal du indtaste navnet på instrumentbrættet og klikke på 'Opret'.
Når instrumentbrættet oprettes, bruger vi nu Adafruit IO-blokke som Gauge og Slider til at visualisere dataene. For at tilføje en blok skal du klikke på '+' i øverste højre hjørne.
Vælg derefter 'Gauge' blokken.
I det næste vindue skal du vælge de feeddata, du vil visualisere.
I det sidste trin skal du ændre blokindstillingerne for at tilpasse det.
Følg nu den samme procedure som ovenfor for at tilføje visualiseringsblokke til resten af feeds. Mit Adafruit IO Dashboard så sådan ud:
Kode Forklaring til
Den komplette kode for dette projekt findes i slutningen af dokumentet. Her forklarer vi nogle vigtige dele af koden.
Koden bruger SDS011, Adafruit_GFX, Adafruit_SSD1306, Adafruit_MQTT, og DHT.h biblioteker. Bibliotekerne SDS011, Adafruit_GFX og Adafruit_SSD1306 kan downloades fra Library Manager i Arduino IDE og installeres derfra. For det skal du åbne Arduino IDE og gå til Skitse <Inkluder bibliotek <Administrer biblioteker . Søg nu efter SDS011, og installer SDS Sensor-biblioteket af R. Zschiegner.
Installer ligeledes Adafruit GFX og Adafruit SSD1306-bibliotekerne af Adafruit. Adafruit_MQTT.h og DHT11.h kan downloades fra de givne links.
Efter installation af bibliotekerne til Arduino IDE skal du starte koden ved at inkludere de nødvendige biblioteksfiler.
#omfatte
I de næste linjer skal du definere OLED-skærmens bredde og højde. I dette projekt har jeg brugt en 128 × 64 SPI OLED-skærm. Du kan ændre variablerne SCREEN_WIDTH og SCREEN_HEIGHT i henhold til din skærm.
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64
Definer derefter SPI-kommunikationsnålene, hvor OLED Display er tilsluttet.
#define OLED_MOSI 23 #define OLED_CLK 18 #define OLED_DC 4 #define OLED_CS 5 #define OLED_RESET 2
Opret derefter en instans til Adafruit-skærmen med bredden og højden og SPI-kommunikationsprotokollen, der er defineret tidligere.
Adafruit_SSD1306 skærm (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Inkluder derefter WiFi- og Adafruit IO-legitimationsoplysningerne, som du kopierede fra Adafruit IO-serveren. Disse inkluderer MQTT-serveren, portnr., Brugernavn og AIO-nøgle.
const char * ssid = "Galaxy-M20"; const char * pass = "ac312124"; #define MQTT_SERV "io.adafruit.com" #define MQTT_PORT 1883 #define MQTT_NAME "choudharyas" #define MQTT_PASS "988c4e045ef64c1b9bc8b5bb7ef5f2d9"
Konfigurer derefter Adafruit IO-feeds til lagring af sensordata. I mit tilfælde har jeg defineret seks feeds til lagring af forskellige sensordata, nemlig: AirQuality, Temperature, Humidity, PM10, PM25 og CO.
Adafruit_MQTT_Client mqtt (& klient, MQTT_SERV, MQTT_PORT, MQTT_NAME, MQTT_PASS); Adafruit_MQTT_Publish AirQuality = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / AirQuality"); Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / Temperature"); Adafruit_MQTT_Publish Fugtighed = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / Fugtighed"); Adafruit_MQTT_Publish PM10 = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / PM10"); Adafruit_MQTT_Publish PM25 = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / PM25"); Adafruit_MQTT_Publish CO = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / CO");
Initialiser nu Serial Monitor med en baudhastighed på 9600 til fejlfindingsformål inden for setup () -funktionen. Initialiser også OLED-skærmen, DHT-sensoren og SDS011-sensoren med funktionen start () .
ugyldig opsætning () {my_sds.begin (16,17); Serial.begin (9600); dht.begin (); display.begin (SSD1306_SWITCHCAPVCC);
For- sløjfen inde i opsætningsfunktionen bruges til at samle værdierne op til et defineret tal og derefter indstille tælleren til nul.
for (int thisReading1 = 0; thisReading1 <numReadingsPM10; thisReading1 ++) {readingsPM10 = 0; }
Læsning af sensorværdierne:
Nu inden i loop-funktionen skal du bruge millis () -metoden til at læse sensorværdierne hver time. Hver af gassensorerne udsender en analog værdi fra 0 til 4095. For at konvertere denne værdi til spænding, brug følgende ligning: RvRo = MQ7Raw * (3.3 / 4095); hvor MQ7Raw er den analoge værdi fra sensorens analoge stift. Læs også PM2.5- og PM10-aflæsningerne fra SDS011-sensoren.
hvis ((usigneret lang) (currentMillis - previousMillis)> = interval) {MQ7Raw = analogRead (iMQ7); RvRo = MQ7Raw * (3,3 / 4095); MQ7ppm = 3,027 * exp (1,0698 * (RvRo)); Serial.println (MQ7ppm); fejl = my_sds.read (& p25, & p10); hvis (! fejl) {Serial.println ("P2.5:" + String (p25)); Serial.println ("P10:" + streng (p10)); }}
Konvertering af værdierne:
De PM2,5 og PM10 værdier er allerede i ug / m 3, men vi nødt til at konvertere carbonmonoxid værdier fra PPM til mg / m 3. Konverteringsformlen er angivet nedenfor:
Koncentration (mg / m 3) = Koncentration (PPM) × (Molekylær masse (g / mol) / molvolumen (L))
Hvor: Molekylær Masse af CO er 28.06 g / mol og molær Volume er 24.45L ved 25 0 C
KoncentrationINmgm3 = MQ7ppm * (28.06 / 24.45); Serial.println (ConcentrationINmgm3);
Beregning af 24-timers gennemsnit:
Beregn derefter de næste 24 timers gennemsnit for PM10, PM2.5 aflæsning og 8 timers gennemsnit for kulilte aflæsninger. I den første linje med kode skal du tage den aktuelle sum og trække det første element i arrayet, og gem det nu som det nye total. Oprindeligt vil det være nul. Hent derefter sensorværdierne og tilføj den aktuelle aflæsning til det samlede antal og øg nummerindekset. Hvis indeksets værdi er lig med eller større end numReadings, skal du indstille indekset til nul.
totalPM10 = totalPM10 - aflæsninger PM10; aflæsninger PM10 = p10; totalPM10 = totalPM10 + aflæsninger PM10; readIndexPM10 = readIndexPM10 + 1; hvis (readIndexPM10> = numReadingsPM10) {readIndexPM10 = 0; }
Derefter skal du endelig offentliggøre disse værdier på Adafruit IO.
hvis (! Temperature.publish (temperatur)) {forsinkelse (30000); } hvis (! Humidity.publish (fugtighed)) {forsinkelse (30000); ……………………………………………………………. …………………………………………………………….
3D-trykt kabinet til AQI-overvågningssystem
Dernæst målte jeg dimensionerne på opsætningen ved hjælp af min vernier og målte også dimensionerne på sensorerne og OLED for at designe et hus. Mit design så sådan ud nedenfor, når det var gjort.
Efter at jeg var tilfreds med designet, eksporterede jeg det som en STL-fil, skar det ud på basis af printerindstillingerne og til sidst udskrev det. Igen kan STL-filen også downloades fra Thingiverse, og du kan udskrive dit kabinet ved hjælp af det.
Efter at udskriften var færdig, fortsatte jeg med at samle projektet, der var oprettet i en permanent kabinet, for at installere det i et anlæg. Med den færdige forbindelse tilsluttet monterede jeg kredsløbet i mit kabinet, og alt passede godt, som du kan se her.
Test af AQI-overvågningssystemet
Når hardware og kode er klar, er det tid til at teste enheden. Vi brugte en ekstern 12V 1A-adapter til at drive enheden. Som du kan se, viser enheden koncentrationen af PM10, PM2.5 og kulilte på OLED-skærmen. Koncentrationen af PM2,5 og PM10 i pg / m 3, mens koncentrationen af carbonmonoxid i mg / m 3.
Disse aflæsninger vil også blive offentliggjort på Adafruit IO Dashboard. Maksimumet for alle parametre (PM10, PM2.5 & CO) er AQI.
AQI-værdierne for de sidste 30 dage vises som en graf.
Dette er, hvordan du kan bruge sensorerne SDS011 og MQ-7 til at beregne luftkvalitetsindekset. Den komplette bearbejdning af projektet kan også findes i den linkede video nedenfor. Håber du nød projektet og fandt det interessant at bygge dit eget. Hvis du har spørgsmål, skal du lade dem være i kommentarfeltet nedenfor.