- Komponenter krävs
- Nova PM-sensor SDS011 för mätning av PM2.5 och PM10
- Grunderna i 0,96 'OLED-skärmmodul
- Förbereda MQ-7-sensorn för att mäta kolmonoxid (CO)
- Beräkning av luftkvalitetsindex
- Kretsschema
- Bygga kretsen för övervakning av luftkvalitet på Perf Board
- Adafruit IO-installation
- Kodförklaring för
- 3D-tryckt hölje för AQI-övervakningssystem
- Testa AQI-övervakningssystemet
När vintern sätter igång blir luften som hänger över oss med rök och gasformiga utsläpp från brinnande åkrar, industrifabriker och fordonstrafik, vilket blockerar solen och gör det svårt att andas. Experter säger att de höga nivåerna av luftföroreningar och COVID-19-pandemin kan vara en farlig blandning som kan få allvarliga konsekvenser. Nödvändigheten för övervakning i realtid av luftkvaliteten är mycket uppenbar.
Så i det här projektet ska vi bygga ett ESP32 övervakningssystem för luftkvalitet med hjälp av Nova PM SDS011-sensor, MQ-7-sensor och DHT11-sensor. Vi kommer också att använda en OLED-skärmmodul för att visa luftkvalitetsvärden. Den Air Quality Index (AQI) i Indien är baserat på åtta föroreningar, PM10, PM2.5, SO2 och NO2, CO, Ozon, NH3, och Pb. Det är dock inte nödvändigt att mäta alla föroreningar. Så vi kommer att mäta koncentrationen av PM2.5, PM10 och kolmonoxid för att beräkna luftkvalitetsindexet. AQI-värdena kommer att publiceras på Adafruit IO så att vi kan övervaka det var som helst. Tidigare har vi också mätt koncentrationen av LPG, rök och ammoniakgas med Arduino.
Komponenter krävs
- ESP32
- Nova PM-sensor SDS011
- 0,96 'SPI OLED-skärmmodul
- DHT11-sensor
- MQ-7-sensor
- Bygeltrådar
Nova PM-sensor SDS011 för mätning av PM2.5 och PM10
SDS011-sensorn är en mycket ny luftkvalitetssensor utvecklad av Nova Fitness. Det fungerar på principen om laserspridning och kan få partikelkoncentrationen mellan 0,3 och 10 μm i luften. Denna sensor består av en liten fläkt, luftinloppsventil, laserdiod och fotodiod. Luften kommer in genom luftinloppet där en ljuskälla (Laser) lyser upp partiklarna och det spridda ljuset omvandlas till en signal av en fotodetektor. Dessa signaler förstärks och bearbetas för att få partikelkoncentrationen PM2.5 och PM10. Vi använde tidigare Nova PM-sensor med Arduino för att beräkna koncentrationen av PM10 och PM2.5.
SDS011-sensorspecifikationer:
- Utgång: PM2.5, PM10
- Mätområde: 0,0-999,9 μg / m3
- Ingångsspänning: 4.7V till 5.3V
- Maximal ström: 100mA
- Sömnström: 2mA
- Svarstid: 1 sekund
- Seriell datainmatningsfrekvens: 1 gång / sekund
- Partikeldiameterupplösning: ≤0,3μm
- Relativt fel: 10%
- Temperaturområde: -20 ~ 50 ° C
Grunderna i 0,96 'OLED-skärmmodul
OLED (Organic Light Emitting Diode) är en slags ljusemitterande diod som är tillverkad med organiska föreningar som exciterar när den elektriska strömmen får strömma genom dem. Dessa organiska föreningar har sitt eget ljus, därför behöver de inga bakgrundsbelysningskretsar som vanliga LCD-skärmar. På grund av denna anledning är OLED-skärmteknik energieffektiv och används i stor utsträckning i TV-apparater och andra skärmprodukter.
Olika typer av OLED finns tillgängliga på marknaden baserat på skärmens färg, antalet stift, storlek och styrenhetens IC. I denna handledning kommer vi att använda Monochrome Blue 7-pin SSD1306 0,96 ”OLED-modul som är 128 pixlar bred och 64 pixlar lång. Denna 7-stifts OLED stöder SPI-protokoll och styrenhet IC SSD1306 hjälper OLED att visa de mottagna tecknen. Läs mer om OLED och dess gränssnitt med olika mikrokontroller genom att följa länken.
Förbereda MQ-7-sensorn för att mäta kolmonoxid (CO)
MQ-7 CO- sensormodul för kolmonoxid detekterar koncentrationerna av CO i luften. Sensorn kan mäta koncentrationer på 10 till 10 000 ppm. MQ-7-sensorn kan antingen köpas som en modul eller bara som en sensor ensam. Tidigare har vi använt många olika typer av gassensorer för att upptäcka och mäta olika gaser, du kan också kolla in dem om du är intresserad. I detta projekt använder vi sensormodulen MQ-7 för att mäta kolmonoxidkoncentration i PPM. Kretsschemat för MQ-7-kortet ges nedan:
Lastmotståndet RL spelar en mycket viktig roll för att få sensorn att fungera. Detta motstånd ändrar sitt motståndsvärde i enlighet med koncentrationen av gas. Sensorkortet MQ-7 levereras med ett belastningsmotstånd på 1KΩ som är värdelöst och påverkar sensoravläsningarna. Så för att mäta lämpliga CO-koncentrationsvärden måste du byta ut 1KΩ-motståndet mot ett 10KΩ-motstånd.
Beräkning av luftkvalitetsindex
AQI i Indien beräknas baserat på den genomsnittliga koncentrationen av en viss förorening mätt över ett standardtidsintervall (24 timmar för de flesta föroreningar, 8 timmar för kolmonoxid och ozon). Till exempel är AQI för PM2.5 och PM10 baserat på 24-timmars genomsnittlig koncentration och AQI för kolmonoxid baseras på 8-timmars genomsnittlig koncentration). AQI-beräkningarna inkluderar de åtta föroreningarna som är PM10, PM2.5, kvävedioxid (NO 2), svaveldioxid (SO 2), kolmonoxid (CO), marknivå ozon (O 3), ammoniak (NH 3), och bly (Pb). Emellertid mäts inte alla föroreningar på alla platser.
Baserat på de uppmätta 24-timmars omgivningskoncentrationerna av en förorening beräknas ett subindex, vilket är en linjär koncentrationsfunktion (t.ex. subindex för PM2.5 kommer att vara 51 vid koncentration 31 µg / m3, 100 vid koncentration 60 | ig / m3 och 75 vid en koncentration av 45 | ig / m3). Det värsta delindexet (eller maximalt av alla parametrar) bestämmer den totala AQI.
Kretsschema
Kretsschemat för IoT-baserat övervakningssystem för luftkvalitet är väldigt enkelt och ges nedan:
SDS011-sensorn, DHT11 och MQ-7-sensorn drivs med + 5V medan OLED-skärmmodulen drivs med 3,3V. Sändaren och mottagarstiftet på SDS011 är anslutna till GPIO16 & 17 i ESP32. Den analoga utstiften på MQ-7-sensorn är ansluten till GPIO 25 och datapinnen på DHT11-sensorn är ansluten till GPIO27-sensorn. Eftersom OLED Display-modulen använder SPI-kommunikation har vi upprättat en SPI-kommunikation mellan OLED-modulen och ESP32. Anslutningarna visas i nedanstående tabell:
S. nr |
OLED-modulstift |
ESP32 stift |
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 stift |
1 |
5V |
5V |
2 |
GND |
GND |
3 |
RX |
17 |
4 |
TX |
16 |
S. nr |
DHT-stift |
ESP32 stift |
1 |
Vcc |
5V |
2 |
GND |
GND |
3 |
Data |
27 |
S. nr |
MQ-7 stift |
ESP32 stift |
1 |
Vcc |
5V |
2 |
GND |
GND |
3 |
A0 |
25 |
Bygga kretsen för övervakning av luftkvalitet på Perf Board
Som du kan se från huvudbilden var tanken att använda den här kretsen i ett 3D-tryckt hölje. Så den kompletta kretsen som visas ovan löds på ett perf-kort. Se till att du använder ledningar för att lämna tillräckligt avstånd för att montera OLED och sensorer. Mitt perf-kort lödde till OLED och sensormodulen visas nedan.
Adafruit IO-installation
Adafruit IO är en öppen dataplattform som låter dig aggregera, visualisera och analysera live data i molnet. Med Adafruit IO kan du ladda upp, visa och övervaka dina data över internet och göra ditt projekt IoT aktiverat. Du kan styra motorer, läsa sensordata och skapa coola IoT-applikationer via internet med Adafruit IO.
För att använda Adafruit IO, skapa först ett konto på Adafruit IO. För att göra detta, gå till Adafruit IO-webbplatsen och klicka på "Kom igång gratis" längst upp till höger på skärmen.
När du har slutfört kontoprocessen loggar du in på kontot och klickar på "Visa AIO-nyckel" i det övre högra hörnet för att få kontoanvändarnamnet och AIO-nyckeln.
När du klickar på "AIO-nyckel" dyker ett fönster upp med Adafruit IO AIO-nyckel och användarnamn. Kopiera den här nyckeln och användarnamnet, den kommer att användas i kod.
Efter att ha fått AIO-tangenterna skapar du nu ett flöde för att lagra DHT-sensordata. För att skapa en feed, klicka på "Feed". Klicka sedan på "Åtgärder" och välj sedan "Skapa ett nytt flöde" bland de tillgängliga alternativen.
Efter detta öppnas ett nytt fönster där du behöver ange flödets namn och beskrivning. Att skriva en beskrivning är valfritt.
Klicka på 'Skapa' efter detta; du kommer att omdirigeras till det nyligen skapade flödet.
För detta projekt skapade vi totalt sex flöden för PM10, PM2.5, CO, temperatur, luftfuktighet och AQI-värden. Följ samma procedur som ovan för att skapa resten av matningarna.
Efter att ha skapat feeds skapar vi nu en Adafruit IO-instrumentpanelfunktion för att visualisera sensordata på en enda sida. För det, skapa först en instrumentpanel och lägg sedan till alla dessa flöden i instrumentpanelen.
För att skapa en instrumentpanel, klicka på alternativet Instrumentpanel och klicka sedan på "Åtgärd" och klicka sedan på "Skapa en ny instrumentpanel."
I nästa fönster anger du instrumentpanelens namn och klickar på 'Skapa'.
När instrumentpanelen skapas kommer vi nu att använda Adafruit IO-block som Gauge och Slider för att visualisera data. För att lägga till ett block, klicka på '+' i det övre högra hörnet.
Välj sedan "Gauge" -blocket.
I nästa fönster väljer du de feeddata som du vill visualisera.
I det sista steget ändrar du blockinställningarna för att anpassa den.
Följ nu samma procedur som ovan för att lägga till visualiseringsblock för resten av feedsna. Min Adafruit IO Dashboard såg ut så här:
Kodförklaring för
Den fullständiga koden för detta projekt ges i slutet av dokumentet. Här förklarar vi några viktiga delar av koden.
Koden använder SDS011, Adafruit_GFX, Adafruit_SSD1306, Adafruit_MQTT, och DHT.h bibliotek. Biblioteken SDS011, Adafruit_GFX och Adafruit_SSD1306 kan laddas ner från Library Manager i Arduino IDE och installeras därifrån. För det, öppna Arduino IDE och gå till Skiss <Inkludera bibliotek <Hantera bibliotek . Sök nu efter SDS011 och installera SDS Sensor-biblioteket av R. Zschiegner.
Installera på samma sätt Adafruit GFX och Adafruit SSD1306-biblioteken av Adafruit. Adafruit_MQTT.h och DHT11.h kan laddas ner från de angivna länkarna.
Efter att ha installerat biblioteken till Arduino IDE, starta koden genom att inkludera de biblioteksfiler som behövs.
#omfatta
Definiera OLED-skärmens bredd och höjd i nästa rader. I detta projekt har jag använt en 128 × 64 SPI OLED-skärm. Du kan ändra variablerna SCREEN_WIDTH och SCREEN_HEIGHT enligt din skärm.
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64
Definiera sedan SPI-kommunikationsnålarna där OLED Display är ansluten.
#define OLED_MOSI 23 #define OLED_CLK 18 #define OLED_DC 4 #define OLED_CS 5 #define OLED_RESET 2
Skapa sedan en instans för Adafruit-skärmen med bredden och höjden och SPI-kommunikationsprotokollet som har definierats tidigare.
Adafruit_SSD1306 display (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Ta sedan med WiFi- och Adafruit IO-referenserna som du kopierade från Adafruit IO-servern. Dessa inkluderar MQTT-servern, portnummer, användarnamn och AIO-nyckel.
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"
Ställ sedan in Adafruit IO-flöden för att lagra sensordata. I mitt fall har jag definierat sex flöden för att lagra olika sensordata, nämligen: AirQuality, temperatur, luftfuktighet, PM10, PM25 och 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 Humidity = Adafruit_MQTT_Publish (& mqtt, MQTT_NAME "/ f / Humidity"); 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");
Nu inne i setup () funktion, initiera Serial Monitor vid en baudhastighet av 9600 för felsökning. Initiera också OLED-skärmen, DHT-sensorn och SDS011-sensorn med funktionen start () .
ogiltig installation () {my_sds.begin (16,17); Serial.begin (9600); dht.begin (); display.begin (SSD1306_SWITCHCAPVCC);
Den för slingan inuti inställnings funktionen används för att samla in de värden upp till ett angivet nummer och sedan ställa räknaren till noll.
för (int thisReading1 = 0; thisReading1 <numReadingsPM10; thisReading1 ++) {readingsPM10 = 0; }
Läsa sensorvärden:
Nu inuti loopfunktionen använder du metoden millis () för att läsa av sensorvärdena varannan timme. Var och en av gassensorerna matar ut ett analogt värde från 0 till 4095. För att konvertera detta värde till spänning, använd följande ekvation: RvRo = MQ7Raw * (3.3 / 4095); där MQ7Raw är det analoga värdet från sensorns analoga stift. Läs också PM2.5- och PM10-avläsningarna från SDS011-sensorn.
if ((unsigned long) (currentMillis - previousMillis)> = interval) {MQ7Raw = analogRead (iMQ7); RvRo = MQ7Raw * (3,3 / 4095); MQ7ppm = 3,027 * exp (1,0698 * (RvRo)); Serial.println (MQ7ppm); error = my_sds.read (& p25, & p10); if (! error) {Serial.println ("P2.5:" + Sträng (p25)); Serial.println ("P10:" + Sträng (p10)); }}
Konvertera värdena:
De PM2.5 och PM10 värden är redan i ^ g / m 3 men vi behöver konvertera på kolmonoxid värden från PPM till mg / m 3. Omvandlingsformeln ges nedan:
Koncentration (mg / m 3) = Koncentration (PPM) × (Molekylvikt (g / mol) / molvolym (L))
Där: Molekyl Massa av CO är 28,06 g / mol och Molar Volume är 24.45L vid 25 0 C
Koncentration INmgm3 = MQ7ppm * (28.06 / 24.45); Serial.println (ConcentrationINmgm3);
Beräkning av 24-timmarsgenomsnitt:
Beräkna sedan 24-timmarsgenomsnittet för PM10, PM2.5-avläsning och 8-timmarsmedelvärde för kolmonoxidavläsningar i nästa rader. I den första kodraden, ta den aktuella summan och subtrahera det första elementet i matrisen, spara det nu som det nya totala. Ursprungligen blir det noll. Hämta sedan sensorvärdena och lägg till aktuell avläsning till summan och öka nummerindexet. Om indexets värde är lika med eller större än numReadings, ställ sedan tillbaka indexet till noll.
totalPM10 = totalPM10 - avläsningar PM10; avläsningar PM10 = p10; totalPM10 = totalPM10 + avläsningar PM10; readIndexPM10 = readIndexPM10 + 1; om (readIndexPM10> = numReadingsPM10) {readIndexPM10 = 0; }
Till slut publicerar du dessa värden på Adafruit IO.
if (! Temperature.publish (temperatur)) {fördröjning (30000); } if (! Humidity.publish (fuktighet)) {fördröjning (30000); ……………………………………………………………. …………………………………………………………….
3D-tryckt hölje för AQI-övervakningssystem
Därefter mätte jag installationens dimensioner med min vernier och mätte även sensorns och OLED-dimensionerna för att designa ett hölje. Min design såg ut så här nedan, när den var klar.
Efter att jag var nöjd med designen exporterade jag den som en STL-fil, skivade den utifrån skrivarinställningar och slutligen skrev den ut. Återigen är STL-filen också tillgänglig för nedladdning från Thingiverse och du kan skriva ut höljet med den.
Efter att utskriften var klar fortsatte jag med att montera projektet som sattes upp i ett permanent hölje för att installera det i en anläggning. När den fullständiga anslutningen gjordes monterade jag kretsen i mitt hölje och allt passade bra som du kan se här.
Testa AQI-övervakningssystemet
När hårdvaran och koden är redo är det dags att testa enheten. Vi använde en extern 12V 1A-adapter för att driva enheten. Som du kan se visar enheten koncentrationen av PM10, PM2.5 och kolmonoxid på OLED-skärmen. Koncentrationen av PM2.5 och PM10 är i pg / m 3 medan koncentrationen av kolmonoxid är i mg / m 3.
Dessa avläsningar kommer också att publiceras på Adafruit IO Dashboard. Maximalt av alla parametrar (PM10, PM2.5 & CO) är AQI.
AQI-värdena för de senaste 30 dagarna visas som ett diagram.
Så här kan du använda sensorerna SDS011 och MQ-7 för att beräkna luftkvalitetsindex. Det fullständiga arbetet med projektet finns också i videon som länkas nedan. Hoppas att du gillade projektet och tyckte att det var intressant att bygga ditt eget. Om du har några frågor, vänligen lämna dem i kommentarfältet nedan.