Obsah:
- Zásoby
- Krok 1: Pripojenie komponentov
- Krok 2: Program Knižnica a Arduino
- Krok 3: Program MIT App Inventor 2
- Krok 4: VÝSLEDOK
Video: Systém monitorovania kvality ovzdušia pre znečistenie časticami: 4 kroky
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:57
ÚVOD:
1 V tomto projekte uvádzam, ako postaviť detektor častíc so zobrazením údajov, zálohovaním údajov na kartu SD a IOT. Kruhový displej neopixelov vizuálne indikuje kvalitu vzduchu.
2 Kvalita ovzdušia je v dnešnej dobe stále dôležitejším problémom. existujú systémy na meranie prašnosti, ale sú veľmi drahé. Ako ukazujú niektoré štúdie, na trhu sú lacné a vysokokvalitné detektory častíc.
napríklad:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Rozhodol som sa preto zostrojiť zariadenie schopné merať počet častíc podľa veľkostných tried (0,5 µm až 10 µm), vizuálne s jednoduchým zobrazením výsledku (neo pixel pixel ring), podrobnejším zobrazením na TFT obrazovke a zálohovanie s časovou pečiatkou na SD kartu.
4 Okrem toho som pridal komunikačný modul bluetooth, aby mohol komunikovať s aplikáciou pre Android, a tak publikovať výsledky na serveri IOT.
5 Celkové náklady na celok nepresahujú 60 €
Zásoby
-Arduino uno R3
-Arduino proto štít
-TFT obrazovka ST7735
-Neopixelový krúžok 24 LED
-Plantower PMS5003
-HC-06 bluetooth modul
Krok 1: Pripojenie komponentov
rôzne komponenty sú spojené podľa vyššie uvedeného diagramu
Krok 2: Program Knižnica a Arduino
1 knižnica
pre obrazovku TFT
github.com/adafruit/Adafruit-GFX-Library
pre neo pixelový prsteň
github.com/adafruit/Adafruit_NeoPixel
pre sd kartu
github.com/arduino-libraries/SD
2 skica arduino
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #zahrnúť
// Ktorý pin na Arduine je pripojený k NeoPixels?
#define PIN 6 // Na Trinket alebo Gemma navrhnite zmeniť toto číslo na 1
// Koľko NeoPixelov je pripojených k Arduinu?
#define NUMPIXELS 24 // Obľúbená veľkosť prsteňa NeoPixel Adafruit_NeoPixel pixelov (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixely. Farba (0, 250, 0); uint32_t oranžová = pixely. Farba (250, 250, 0); uint32_t rouge = pixely. Color (255, 0, 0);
SoftwareSériový pmsSériový (2, 3);
#define cs 10 #define dc 9 #define rst 8 // toto môžete tiež pripojiť k resetovaniu Arduino
#include // Základná grafická knižnica
#include // Knižnica špecifická pre hardvér #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // inicializácia časovača demarrage du loop ()
definované #if (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// Možnosť 1: použite akékoľvek špendlíky, ale trochu pomalšie
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Možnosť 2: musí používať hardvérové piny SPI
// (pre UNO to je sclk = 13 a sid = 11) a pin 10 musí byť // výstup. Je to oveľa rýchlejšie - vyžaduje sa to aj vtedy, ak chcete // použiť kartu microSD (pozri príklad kresby na obrázku) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Inicializácia spojenia I2C Wire.begin (); // Inicializácia modulu RTC RTC.begin (); Serial.print ("init SD"); oneskorenie (1000); if (! SD.begin (cs_sd)) // Podmienka výberu si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); návrat; } Serial.print („Karta SD v poriadku“);
Údaje o súbore = SD.open ("donnees.txt", FILE_WRITE); // Úvahy o "donnees.txt"
data.println (""); data.println („akvizícia demarragu“); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inicializácia čipu ST7735S, čierna záložka Serial.println ("init"); // náš ladiaci výstup tft.fillScreen (ST7735_BLACK); // prenosová rýchlosť senzora je 9600 pmsSerial.begin (9600);
pixely.begin (); // INICIALIZUJTE objekt pásu NeoPixel (POVINNÉ)
pixely.setBrightness (2);
}
struct pms5003data {
uint16_t framelen; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t častice_03um, častice_05um, častice_10um, častice_25um, častice_50um, častice_100um; uint16_t nepoužitý; uint16_t kontrolný súčet; };
dátové údaje štruktúry pms5003; void loop () {pixelov.clear (); // Nastaviť všetky farby pixelov na 'vypnuté' DateTime teraz = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (now);
temps = ((millis () - tempsInit))/1000; // Démarrage du chrono
if (readPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("nbre diely/ 0,1 l");
tft.setCursor (10, 17); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.setCursor (10, 17); tft.print ("0,3 um"); tft.print (data.particles_03um); tft.print ("");
tft.setCursor (10, 29);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("0,5 um"); tft.print (data.particles_05um); tft.print ("");
tft.setCursor (10, 41);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("1,0 um"); tft.print (data.particles_10um); tft.print ("");
tft.setCursor (10, 53);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("2,5 um"); tft.print (data.particles_25um); tft.print ("");
tft.setCursor (10, 65);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("5,0 um"); tft.print (data.particles_50um); tft.print ("");
tft.setCursor (10, 77);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("10 um"); tft.print (data.particles_100um); tft.print ("");
tft.setCursor (2, 89);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("PM 1.0"); tft.setTextColor (ST7735_YELLOW, ST7735_BLACK); tft.print (data.pm10_standard); tft.print (""); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.print (" mikrog/m3 “);
tft.setCursor (2, 100); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("PM 2,5"); tft.setTextColor (ST7735_YELLOW, ST7735_BLACK); tft.print (data.pm25_standard); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.print ("mikrog/m3");
tft.setCursor (2, 110);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("PM 10"); tft.setTextColor (ST7735_YELLOW, ST7735_BLACK); tft.print (data.pm100_standard); tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.print ("mikrog/m3");
tft.setCursor (10, 5);
tft.setTextColor (ST7735_WHITE, ST7735_BLACK); tft.setTextSize (1); tft.println ("nbre diely/ 0,1 l");
// Serial.print (temps);
// Serial.print (""); Serial.print ("#"); Serial.print ("03 µm"); Serial.print (data.particles_03um); Serial.print (""); Serial.print ("05 µm"); Serial.print (data.particles_05um); Serial.print (""); Serial.print ("1 µm"); Serial.print (data.particles_10um); Serial.print (""); Serial.print ("25 µm"); Serial.print (data.particles_25um); Serial.print (""); Serial.print ("50 µm"); Serial.print (data.particles_50um); Serial.print (""); Serial.print ("100 µm"); Serial.print (data.particles_100um); Serial.println (""); nombre_leds = int (((float (data.particles_03um)/65535)*24)); // nombre_leds = (8); Serial.println (nombre_leds);
if ((nombre_leds = 1)) {
pixely.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixelov.fill (vert, 0, 8); pixelov.fill (oranžová, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {
pixelov.fill (vert, 0, 8); pixelov.fill (oranžová, 8, 8); pixely.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixelov.fill (vert, 0, 1); } pixelov.show (); // Odošlite aktualizované farby pixelov na hardvér.
// Definícia darovania Reťazec PM03 = Reťazec (data.particles_03um); Reťazec PM05 = Reťazec (data.particles_05um); Reťazec PM10 = Reťazec (data.particles_10um); Reťazec PM25 = Reťazec (data.particles_25um); Reťazec PM50 = Reťazec (data.particles_50um); Reťazec PM100 = Reťazec (data.particles_100um); Reťazec PMS10 = Reťazec (data.pm10_standard); Reťazec PMS25 = Reťazec (data.pm25_standard); Reťazec PMS100 = Reťazec (data.pm100_standard); String Temps = String (temps);
// Ecriture des données dans le fichier texte
Údaje o súbore = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }
}
boolean readPMSdata (Stream *s) {
if (! s-> available ()) {return false; } // Čítajte bajt naraz, kým sa nedostaneme k špeciálnemu štartovaciemu bajtu '0x42' if (s-> peek ()! = 0x42) {s-> read (); return false; }
// Teraz prečítajte všetkých 32 bajtov
if (s-> available () readBytes (buffer, 32);
// pripravte si kontrolný súčet
pre (uint8_t i = 0; i <30; i ++) {sum+= buffer ; }
/* ladenie
pre (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (buffer , HEX); Serial.print (","); } Serial.println (); */ // Dáta prichádzajú v endian'd, čím sa to vyrieši, takže funguje na všetkých platformách uint16_t buffer_u16 [15]; pre (uint8_t i = 0; i <15; i ++) {buffer_u16 = buffer [2 + i*2 + 1]; buffer_u16 + = (buffer [2 + i*2] << 8); }
// daj to do peknej struktury:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
if (sum! = data.checksum) {
Serial.println ("Zlyhanie kontrolného súčtu"); return false; } // úspech! návrat true; }
// Previesť počet dní do žurnálu /! / La semaine začať bez dimanche
Reťazec donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; prípad 1: návrat „LUN“; prípad 2: návrat „MAR“; prípad 3: návrat „MER“; prípad 4: vrátiť „JEU“; prípad 5: vrátiť "VEN"; prípad 6: vrátiť "SAM"; predvolené: vrátiť ""; }}
// affiche la date et l'heure sur l'écran
neplatné affiche_date_heure (DateTime datetime) {// Date String jour = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + Reťazec (datetime.year (), DEC); // heure Reťazec heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());
Serial.print (jour); Serial.print (""); Serial.print (heure); //Serial.print (""); Údaje o súbore = SD.open ("donnees.txt", FILE_WRITE); data.print (jour + "" + heure + ""); data.close ();
tft.setCursor (2, 120);
tft.setTextColor (ST7735_GREEN); tft.setTextSize (1); tft.print ("date"); tft.setTextColor (ST7735_YELLOW); tft.print (jour); tft.setTextColor (ST7735_GREEN); tft.setCursor (2, 130); tft.print ("heure"); tft. setTextColor (ST7735_YELLOW); tft.print (heure);
oneskorenie (500);
}
// permet d'afficher les nombres sur deux chiffres
Reťazec Vers2Chiffres (počet bajtov) {String resultat = ""; if (nombre <10) resultat = "0"; vrátiť resultat += reťazec (nombre, DEC); }
Krok 3: Program MIT App Inventor 2
toto je blok kódu vynálezcu aplikácie MIT
Krok 4: VÝSLEDOK
tu je video s výsledkom
Odporúča:
Riešenie pre ľahké znečistenie - Artemis: 14 krokov
Riešenie znečistenia svetlom - Artemis: Svetelné znečistenie je niečo, čo ovplyvňuje nás všetkých na celom svete. Odkedy bola žiarovka vynájdená, svetlo sa stalo oveľa populárnejším a používa sa špeciálne vo veľkých mestách ako New York a Chicago. Všetko toto svetlo môže postihnúť
Cenovo dostupný monitor kvality ovzdušia IoT založený na krokoch RaspberryPi 4: 15 (s obrázkami)
Nízkonákladový monitor kvality ovzdušia IoT založený na RaspberryPi 4: Santiago, Čile počas zimnej núdzovej situácie v oblasti životného prostredia má výsadu žiť v jednej z najkrajších krajín sveta, ale bohužiaľ to nie je všetko ružové. Čile v zimnom období veľmi trpí kontamináciou vzduchu,
AirCitizen - monitorovanie kvality ovzdušia: 11 krokov (s obrázkami)
AirCitizen - Monitorovanie kvality ovzdušia: Ahoj všetci! Dnes vás naučíme reprodukovať náš projekt: AirCitizen od tímu AirCitizenPolytech!-Pochádzajúce z „OpenAir / Aký je váš vzduch?“Projekty, projekt AirCitizen, má za cieľ umožniť občanom aktívne hodnotiť kvalitu
Domáci systém monitorovania počasia IoT s podporou aplikácií pre Android (Mercury Droid): 11 krokov
Domáci systém monitorovania počasia IoT s podporou aplikácií pre Android (Mercury Droid): Úvod Mercury Droid je jeden druh vstavaného systému IoT (internet vecí) založený na mobilnej aplikácii Mercury Droid Android. Čo je schopné merať & sledovať domácu aktivitu počasia. je to veľmi lacný systém monitorovania domáceho počasia
Monitor kvality ovzdušia poháňaný časticami: 7 krokov
Monitor kvality vzduchu poháňaný časticami: Kvalita vzduchu. Teraz o tom pravdepodobne viac premýšľate, keď sa náš čistý vzduch zmenil na permanentný opar po oblohe. Fuj Jedna vec, nad ktorou máte kontrolu, je kvalita vzduchu vo vašom dome. V tomto návode vám ukážem, ako si postaviť vzduch