- Būtini komponentai
- „Nova PM“ jutiklis SDS011, skirtas matuoti PM2,5 ir PM10
- 0.96 'OLED ekrano modulio pagrindai
- MQ-7 jutiklio paruošimas anglies monoksidui (CO) matuoti
- Oro kokybės indekso skaičiavimas
- Grandinės schema
- Oro kokybės stebėjimo sistemos grandinės sukūrimas ant Perf Board
- „Adafruit IO“ sąranka
- Kodo paaiškinimas
- 3D spausdintas korpusas AQI stebėjimo sistemai
- AQI stebėjimo sistemos testavimas
Įsibėgėjus žiemai, virš mūsų kabantis oras sutirštėja deginant laukus, pramonės gamyklas ir transporto priemones iš dūmų ir dujinių teršalų, užstodamas saulę ir apsunkindamas kvėpavimą. Ekspertai teigia, kad didelis oro užterštumas ir COVID-19 pandemija gali būti pavojingas mišinys, galintis sukelti rimtų pasekmių. Būtinybė tikrinti oro kokybę realiu laiku yra labai ryški.
Taigi šiame projekte mes ketiname sukurti ESP32 oro kokybės stebėjimo sistemą naudodami „Nova PM SDS011“ jutiklį, „MQ-7“ jutiklį ir „DHT11“ jutiklį. Oro kokybės vertėms rodyti taip pat naudosime OLED ekraną. Oro kokybės indeksas (AQI) Indijoje yra grindžiama aštuonių teršalų, KD10, KD2,5, SO2 ir NO2, CO, ozono, NH3 ir Pb. Tačiau nebūtina matuoti visų teršalų. Taigi, norėdami apskaičiuoti oro kokybės indeksą, matuosime PM2,5, PM10 ir anglies monoksido koncentraciją. AQI vertės bus paskelbtos „Adafruit IO“, kad galėtume jas stebėti iš bet kur. Anksčiau mes taip pat matavome SND, dūmų ir amoniako dujų koncentraciją naudodami „Arduino“.
Būtini komponentai
- ESP32
- „Nova PM“ jutiklis SDS011
- 0,96 'SPI OLED ekrano modulis
- DHT11 jutiklis
- MQ-7 jutiklis
- Šuolių laidai
„Nova PM“ jutiklis SDS011, skirtas matuoti PM2,5 ir PM10
„SDS011 Sensor“ yra visai neseniai „Nova Fitness“ sukurtas oro kokybės jutiklis. Jis veikia lazerio sklaidos principu ir gali gauti dalelių koncentraciją ore nuo 0,3 iki 10μm. Jutiklį sudaro nedidelis ventiliatorius, oro įleidimo vožtuvas, lazerinis diodas ir fotodiodas. Oras patenka per oro įleidimo angą, kur šviesos šaltinis (lazeris) apšviečia daleles, o išsklaidytą šviesą fotodetektorius paverčia signalu. Šie signalai sustiprinami ir apdorojami, kad gautų dalelių koncentraciją PM2,5 ir PM10. Anksčiau PM10 ir PM2,5 koncentracijai apskaičiuoti naudojome „Nova PM Sensor“ su „Arduino“.
SDS011 jutiklio specifikacijos:
- Išvestis: PM2,5, PM10
- Matavimo diapazonas: 0,0–999,9 μg / m3
- Įėjimo įtampa: nuo 4,7 V iki 5,3 V
- Maksimali srovė: 100mA
- Miego srovė: 2mA
- Atsakymo laikas: 1 sekundė
- Serijinių duomenų išvesties dažnis: 1 kartas per sekundę
- Dalelių skersmens skiriamoji geba: ≤0,3 μm
- Santykinė klaida: 10%
- Temperatūros diapazonas: -20 ~ 50 ° C
0.96 'OLED ekrano modulio pagrindai
OLED (organinis šviesą skleidžiantis diodas) yra tam tikras šviesos diodas, gaminamas naudojant organinius junginius, kurie sužadina, kai jiems leidžiama tekėti elektros srovei. Šie organiniai junginiai turi savo šviesą, todėl jiems nereikia jokių apšvietimo grandinių, kaip įprastiems skystųjų kristalų ekranams. Dėl šios priežasties OLED ekranų technologija yra energiją taupanti ir plačiai naudojama televizoriuose ir kituose ekrano produktuose.
Rinkoje yra įvairių tipų OLED, atsižvelgiant į ekrano spalvą, kaiščių skaičių, dydį ir valdiklio IC. Šioje pamokoje naudosime monochrominį mėlyną 7 kontaktų SSD1306 0,96 ”OLED modulį, kurio plotis yra 128 pikselių ir ilgis - 64 pikseliai. Šis 7 kontaktų OLED palaiko SPI protokolą, o valdiklis IC SSD1306 padeda OLED rodyti gautus simbolius. Sužinokite daugiau apie OLED ir jo sąsają su skirtingais mikrovaldikliais, spustelėdami nuorodą.
MQ-7 jutiklio paruošimas anglies monoksidui (CO) matuoti
MQ-7 CO anglies monoksido dujų jutiklio modulis nustato CO koncentracijas ore. Jutiklis gali išmatuoti koncentracijas nuo 10 iki 10 000 ppm. „MQ-7“ jutiklį galima įsigyti kaip modulį arba tik kaip jutiklį. Anksčiau įvairioms dujoms aptikti ir matuoti naudojome daug įvairių dujų jutiklių, kuriuos taip pat galite patikrinti. Šiame projekte mes naudojame MQ-7 jutiklio modulį anglies monoksido koncentracijai PPM matuoti. Žemiau pateikiama MQ-7 plokštės schema:
Apkrovos rezistorius RL vaidina labai svarbų vaidmenį, kad jutiklis veiktų. Šis rezistorius keičia savo varžos vertę pagal dujų koncentraciją. MQ-7 jutiklio plokštės apkrova yra 1KΩ, kuri yra nenaudinga ir veikia jutiklio rodmenis. Taigi, norint išmatuoti tinkamas CO koncentracijos vertes, 1KΩ rezistorių turite pakeisti 10KΩ rezistoriumi.
Oro kokybės indekso skaičiavimas
AQI Indijoje apskaičiuojamas pagal vidutinę konkretaus teršalo koncentraciją, išmatuotą per standartinį laiko intervalą (24 val. Daugumai teršalų, 8 val. Anglies monoksidui ir ozonui). Pavyzdžiui, PM2,5 ir PM10 AQI yra pagrįstas vidutine 24 valandų koncentracija, o anglies monoksido AQI - 8 valandų vidutine koncentracija). Į AQI skaičiavimus įeina aštuoni teršalai, kurie yra PM10, PM2,5, azoto dioksidas (NO 2), sieros dioksidas (SO 2), anglies monoksidas (CO), žemės lygio ozonas (O 3), amoniakas (NH 3), ir švinas (Pb). Tačiau visi teršalai nėra matuojami kiekvienoje vietoje.
Remiantis išmatuotomis teršalo 24 valandų aplinkos koncentracijomis, apskaičiuojamas subindeksas, kuris yra tiesinė koncentracijos funkcija (pvz., PM2,5 subindeksas bus 51, kai koncentracija yra 31 µg / m3, 100 - esant koncentracijai 60 µg / m3 ir 75, kai koncentracija 45 µg / m3). Blogiausias subindeksas (arba maksimalus visų parametrų rodiklis) lemia bendrą AKS.
Grandinės schema
IoT pagrįstos oro kokybės stebėjimo sistemos schema yra labai paprasta ir pateikta žemiau:
Jutiklis SDS011, DHT11 ir MQ-7 maitinamas + 5 V įtampa, o OLED ekranas - 3,3 V įtampa. SDS011 siųstuvo ir imtuvo kaiščiai yra prijungti prie ESP32 GPIO16 ir 17. MQ-7 jutiklio analoginis išvesties kaištis yra prijungtas prie GPIO 25, o DHT11 jutiklio duomenų kaištis - prie GPIO27 jutiklio. Kadangi OLED ekranas modulis naudoja SPI ryšį, mes sukūrėme SPI ryšį tarp OLED modulio ir ESP32. Jungtys parodytos žemiau esančioje lentelėje:
S.No |
OLED modulio kaištis |
ESP32 kaištis |
1 |
BND |
Žemė |
2 |
VCC |
5V |
3 |
D0 |
18 |
4 |
D1 |
23 |
5 |
RES |
2 |
6 |
DC |
4 |
7 |
CS |
5 |
S.No |
SDS011 kaištis |
ESP32 kaištis |
1 |
5V |
5V |
2 |
BND |
BND |
3 |
RX |
17 |
4 |
TX |
16 |
S.No |
DHT kaištis |
ESP32 kaištis |
1 |
Vcc |
5V |
2 |
BND |
BND |
3 |
Duomenys |
27 |
S.No |
MQ-7 kaištis |
ESP32 kaištis |
1 |
Vcc |
5V |
2 |
BND |
BND |
3 |
A0 |
25 |
Oro kokybės stebėjimo sistemos grandinės sukūrimas ant Perf Board
Kaip matote iš pagrindinio vaizdo, kilo mintis naudoti šią grandinę 3D spausdinto korpuso viduje. Taigi visa pirmiau parodyta grandinė yra prilituota ant perf lentos. Nepamirškite naudoti laidų, kad paliktumėte pakankamai atstumo OLED ir jutikliams montuoti. Mano perf plokštė lituota į OLED ir jutiklio modulis parodytas žemiau.
„Adafruit IO“ sąranka
„Adafruit IO“ yra atvira duomenų platforma, leidžianti kaupti, vizualizuoti ir analizuoti tiesioginius duomenis debesyje. Naudodamiesi „Adafruit IO“, galite įkelti, rodyti ir stebėti savo duomenis internete ir įjungti projekto IoT. Galite valdyti variklius, skaityti jutiklių duomenis ir kurti šaunias interneto programas naudodami „Adafruit IO“.
Norėdami naudoti „Adafruit IO“, pirmiausia sukurkite „Adafruit IO“ paskyrą. Norėdami tai padaryti, eikite į „Adafruit IO“ svetainę ir viršutiniame dešiniajame ekrano kampe spustelėkite „Pradėti nemokamai“.
Baigę paskyros kūrimo procesą, prisijunkite prie paskyros ir viršutiniame dešiniajame kampe spustelėkite „Peržiūrėti AIO raktą“, kad gautumėte paskyros vartotojo vardą ir AIO raktą.
Kai spustelėsite „AIO Key“, pasirodys langas su „Adafruit IO AIO Key“ ir vartotojo vardu. Nukopijuokite šį raktą ir vartotojo vardą, jie bus naudojami kode.
Gavę AIO raktus, sukurkite kanalą DHT jutiklio duomenims saugoti. Norėdami sukurti sklaidos kanalą, spustelėkite „Sklaidos kanalas“. Tada spustelėkite „Veiksmai“, tada iš galimų parinkčių pasirinkite „Sukurti naują sklaidos kanalą“.
Po to atidaromas naujas langas, kuriame reikia įvesti sklaidos kanalo pavadinimą ir aprašą. Rašyti aprašą yra neprivaloma.
Po to spustelėkite „Sukurti“; būsite nukreipti į naujai sukurtą sklaidos kanalą.
Šiam projektui mes sukūrėme iš viso šešis PM10, PM2,5, CO, temperatūros, drėgmės ir AQI vertinimus. Norėdami sukurti likusius sklaidos kanalus, atlikite tą pačią procedūrą kaip aukščiau.
Sukūrę sklaidos kanalus, dabar sukursime „Adafruit IO“ informacijos suvestinės funkciją, kad jutiklio duomenys būtų vizualizuojami viename puslapyje. Tam pirmiausia sukurkite informacijos suvestinę, tada į tą informacijos suvestinę įtraukite visus šiuos tiekimus.
Norėdami sukurti informacijos suvestinę, spustelėkite parinktį Informacijos suvestinė, tada spustelėkite „Veiksmas“, o po to spustelėkite „Sukurti naują informacijos suvestinę“.
Kitame lange įveskite prietaisų skydelio pavadinimą ir spustelėkite „Kurti“.
Kuriant prietaisų skydelį, dabar duomenims vizualizuoti naudosime „Adafruit“ IO blokus, tokius kaip matuoklis ir slankiklis. Norėdami pridėti bloką, spustelėkite „+“ viršutiniame dešiniajame kampe.
Tada pasirinkite bloką „Vėžė“.
Kitame lange pasirinkite sklaidos kanalo duomenis, kuriuos norite vizualizuoti.
Paskutiniame etape pakeiskite bloko nustatymus, kad jį pritaikytumėte.
Dabar atlikite tą pačią procedūrą kaip pirmiau, kad pridėtumėte kitų kanalų vizualizavimo blokus. Mano „Adafruit IO“ prietaisų skydelis atrodė taip:
Kodo paaiškinimas
Visas šio projekto kodas pateikiamas dokumento pabaigoje. Čia mes paaiškiname keletą svarbių kodo dalių.
Kodas naudoja SDS011, „ Adafruit_GFX“, „ Adafruit_SSD1306“, „ Adafruit_MQTT“ ir „ DHT.h“ bibliotekas. SDS011, „Adafruit_GFX“ ir „Adafruit_SSD1306“ bibliotekas galima atsisiųsti iš „Arduino IDE“ bibliotekos tvarkyklės ir įdiegti iš ten. Tam atidarykite „Arduino IDE“ ir eikite į „ Sketch <Include Library <Manage Libraries“ . Dabar ieškokite SDS011 ir įdiekite R. Zschiegner SDS Sensor biblioteką.
Panašiai įdiekite „ Adafruit GFX“ ir „Adafruit SSD1306“ bibliotekas. Adafruit_MQTT.h ir DHT11.h galima atsisiųsti iš nurodytų nuorodų.
Įdiegę bibliotekas į „Arduino IDE“, paleiskite kodą įtraukdami reikalingus bibliotekų failus.
# įtraukti
Kitose eilutėse nustatykite OLED ekrano plotį ir aukštį. Šiame projekte aš naudojau 128 × 64 SPI OLED ekraną. Kintamuosius SCREEN_WIDTH ir SCREEN_HEIGHT galite pakeisti pagal savo ekraną.
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64
Tada nustatykite SPI ryšio kaiščius, kur prijungtas OLED ekranas.
#define OLED_MOSI 23 #define OLED_CLK 18 #define OLED_DC 4 #define OLED_CS 5 #define OLED_RESET 2
Tada sukurkite „Adafruit“ ekrano egzempliorių su anksčiau apibrėžtu pločio ir aukščio bei SPI ryšio protokolu.
„Adafruit_SSD1306“ ekranas (SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Tada įtraukite „WiFi“ ir „Adafruit IO“ kredencialus, kuriuos nukopijavote iš „Adafruit IO“ serverio. Tai apims MQTT serverį, prievado numerį, vartotojo vardą ir AIO raktą.
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"
Tada nustatykite „Adafruit IO“ sklaidos kanalus jutiklių duomenims saugoti. Mano atveju aš apibrėžiau šešis kanalus skirtingiems jutiklių duomenims saugoti, būtent: oro kokybė, temperatūra, drėgmė, PM10, PM25 ir CO.
„Adafruit_MQTT_Client mqtt“ (& klientas, 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 / Temperatūra"); „Adafruit_MQTT_Publish Humidity“ = „Adafruit_MQTT_Publish“ (& mqtt, MQTT_NAME "/ f / Drėgnumas"); „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");
Dabar, kai yra sąrankos () funkcija, inicializuokite „Serial Monitor“ 9600 perdavimo greičiu derinimo tikslais. Taip pat pradėkite OLED ekraną, DHT jutiklį ir SDS011 jutiklį su pradžios () funkcija.
negaliojanti sąranka () {my_sds.begin (16,17); Serijos pradžia (9600); dht.prasideda (); display.begin (SSD1306_SWITCHCAPVCC);
Už kilpos viduje sąrankos funkcija yra naudojama surinkti vertes iki apibrėžto skaičiaus ir tada nustatyti skaitiklis iki nulio.
for (int thisReading1 = 0; thisReading1 <numReadingsPM10; thisReading1 ++) {rodmenysPM10 = 0; }
Jutiklio reikšmių skaitymas:
Dabar ciklo funkcijos viduje naudokite milis () metodą, kad nuskaitytumėte jutiklio reikšmes kas valandą. Kiekvienas dujų jutiklis išleidžia analoginę vertę nuo 0 iki 4095. Norėdami šią vertę paversti įtampa, naudokite šią lygtį: RvRo = MQ7Raw * (3,3 / 4095); kur MQ7Raw yra analoginė vertė iš jutiklio analoginio kaiščio. Taip pat perskaitykite PM2,5 ir PM10 rodmenis iš SDS011 jutiklio.
if ((nepasirašytas ilgas) (currentMillis - previousMillis)> = intervalas) {MQ7Raw = analogRead (iMQ7); RvRo = MQ7Raw * (3,3 / 4095); MQ7ppm = 3,027 * exp (1,0698 * (RvRo)); Serial.println (MQ7ppm); klaida = my_sds.read (& p25, & p10); jei (! klaida) {Serial.println ("P2.5:" + eilutė (p25)); Serial.println ("P10:" + eilutė (p10)); }}
Vertybių konvertavimas:
PM2,5 ir PM10 vertės jau yra µg / m 3, tačiau turime konvertuoti anglies monoksido vertes iš PPM į mg / m 3. Konversijos formulė pateikiama žemiau:
Koncentracija (mg / m 3) = koncentracija (PPM) × (molekulinė masė (g / mol) / molinis tūris (L))
Kur: molekulinė masė CO yra 28,06 g / mol ir molinė tomas yra 24.45L esant 25 0 C
Koncentracija INmgm3 = MQ7ppm * (28,06 / 24,45); Serial.println (koncentracijaINmgm3);
Apskaičiuojant 24 valandų vidurkį:
Tada kitose eilutėse apskaičiuokite 24 valandų vidurkį PM10, PM2,5 rodmenims ir 8 valandų vidurkį anglies monoksido rodmenims. Pirmoje kodo eilutėje paimkite esamą sumą ir atimkite pirmąjį masyvo elementą, dabar išsaugokite tai kaip naują sumą. Iš pradžių tai bus „Nulis“. Tada gaukite jutiklio reikšmes ir pridėkite dabartinį rodmenį prie viso ir padidinkite skaičių indeksą. Jei indekso vertė lygi arba didesnė už numReadings, nustatykite indeksą atgal į nulį.
totalPM10 = totalPM10 - rodmenysPP10; rodmenysPM10 = p10; totalPM10 = visoPP10 + rodmenysPP10; readIndexPM10 = readIndexPM10 + 1; if (readIndexPM10> = numReadingsPM10) {readIndexPM10 = 0; }
Tada pagaliau paskelbkite šias vertybes „Adafruit IO“.
jei (! Temperatūra.publikuoti (temperatūra)) {delsa (30000); } if (! Drėgmė.publikuoti (drėgmė)) {delsa (30000); ………………………………………………………. ……………………………………………………….
3D spausdintas korpusas AQI stebėjimo sistemai
Toliau aš išmatavau sąrankos matmenis naudodamas savo grotuvą, taip pat matavau jutiklių ir OLED matmenis, kad suprojektuočiau korpusą. Mano dizainas atrodė maždaug taip žemiau, kai tai buvo padaryta.
Po to, kai buvau patenkintas dizainu, eksportavau jį kaip STL failą, supjaustiau jį pagal spausdintuvo nustatymus ir galiausiai atspausdinau. Vėlgi, STL failą taip pat galima atsisiųsti iš „Thingiverse“ ir galite spausdinti savo korpusą naudodami jį.
Po to, kai buvo atspausdinta, aš pradėjau surinkti projektą, sukurtą nuolatiniame korpuse, kad jį įdiegčiau objekte. Atlikęs pilną jungtį, aš sujungiau grandinę į savo korpusą ir viskas buvo gerai, kaip matote čia.
AQI stebėjimo sistemos testavimas
Kai aparatinė įranga ir kodas bus paruošti, laikas išbandyti įrenginį. Prietaisui maitinti naudojome išorinį 12V 1A adapterį. Kaip matote, įrenginyje OLED ekrane bus rodoma PM10, PM2,5 ir anglies monoksido koncentracija. PM2,5 ir PM10 koncentracija yra µg / m 3, o anglies monoksido - mg / m 3.
Šie rodmenys taip pat bus paskelbti „Adafruit IO Dashboard“. Visų parametrų (PM10, PM2,5 ir CO) maksimalus dydis bus AQI.
Pastarųjų 30 dienų AQI vertės bus rodomos kaip diagrama.
Taip galite naudoti SDS011 ir MQ-7 jutiklius oro kokybės indeksui apskaičiuoti. Visą projekto darbą taip pat galite rasti žemiau esančiame vaizdo įraše. Tikiuosi, kad jums patiko projektas ir jums buvo įdomu kurti savo. Jei turite klausimų, palikite juos komentarų skiltyje žemiau.