Kazalo:
- Zaloge
- 1. korak: Povezovanje komponent
- 2. korak: Knjižnica in program Arduino
- 3. korak: Program MIT App Inventor 2
- 4. korak: REZULTAT
Video: Sistem za spremljanje kakovosti zraka za onesnaževanje z delci: 4 koraki
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:04
INTRO:
1 V tem projektu sem pokazal, kako zgraditi detektor delcev s prikazom podatkov, varnostno kopijo podatkov na kartici SD in IOT. Vizualno neopiksni prstan prikazuje kakovost zraka.
2 Kakovost zraka je danes vse pomembnejša skrb. obstajajo sistemi za merjenje stopnje prahu, vendar so zelo dragi. Na trgu so poceni in kakovostni detektorji delcev, kar kažejo nekatere študije.
na primer:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Zato sem se odločil za izdelavo naprave, ki bi lahko merila število delcev po velikostnih razredih (0,5 µm do 10 µm), vizualno s preprostim prikazom rezultata (neo pikselni obroč), podrobnejšim prikazom na zaslonu TFT in časovno označena varnostna kopija na kartici SD.
4 Poleg tega sem dodal komunikacijski modul bluetooth, s katerim lahko komuniciram z aplikacijo android in tako objavim rezultate na strežniku IOT.
5 Skupni stroški celote ne presegajo 60 €
Zaloge
-Arduino uno R3
-Arduino proto ščit
-TFT zaslon ST7735
-Neopixel obroč 24 led
-Plantower PMS5003
-HC-06 modul bluetooth
1. korak: Povezovanje komponent
različne komponente so povezane v skladu z zgornjim diagramom
2. korak: Knjižnica in program Arduino
1 knjižnica
za zaslon TFT
github.com/adafruit/Adafruit-GFX-Library
za neo piksel obroč
github.com/adafruit/Adafruit_NeoPixel
za sd kartico
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; #vključi
// Kateri pin na Arduinu je povezan z NeoPixels?
#define PIN 6 // Pri Trinket ali Gemma predlagajte, da to spremenite v 1
// Koliko NeoPixels je priključenih na Arduino?
#define NUMPIXELS 24 // Priljubljena velikost obroča NeoPixel Adafruit_NeoPixel slikovnih pik (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = slikovne pike. Barva (0, 250, 0); uint32_t oranžna = slikovnih pik. Barva (250, 250, 0); uint32_t rouge = slikovne pike. Barva (255, 0, 0);
Programska opremaSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // to lahko povežete tudi s ponastavitvijo Arduina
#include // Osnovna grafična knjižnica
#include // Strojna knjižnica #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // inicializacija du timer au démarrage du loop ()
#if definirano (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// 1. možnost: uporabite vse zatiče, vendar nekoliko počasneje
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Možnost 2: uporabiti morate zatiče strojne opreme SPI
// (za UNO je to sclk = 13 in sid = 11) in pin 10 mora biti // izhod. To je veliko hitreje - potrebno tudi, če želite // uporabljati kartico microSD (glejte primer risbe slike) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Začetek povezave I2C Wire.begin (); // Inicializiramo modul RTC RTC.begin (); Serial.print ("init SD"); zamuda (1000); if (! SD.begin (cs_sd)) // Pogoj preverjen s SD kartico est présente dans l'appareil {Serial.print ("Privzeta SD"); vrnitev; } Serial.print ("Carte SD OK");
Datotečni podatki = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println ("pridobitev Démarragea"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inicializiramo čip ST7735S, črni zavihek Serial.println ("init"); // naš izhod za odpravljanje napak tft.fillScreen (ST7735_BLACK); // hitrost prenosa senzorja je 9600 pmsSerial.begin (9600);
pixels.begin (); // INICIALIZE NeoPixel strip object (POTREBNO)
pixels.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 delci_03um, delci_05um, delci_10um, delci_25um, delci_50um, delci_100um; uint16_t neuporabljeno; uint16_t kontrolna vsota; };
podatkovni podatki struct pms5003; void loop () {pixels.clear (); // Zdaj nastavite vse barve slikovnih pik na 'off' DateTime = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (zdaj);
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 deli/ 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 ("PM 1.0"); 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 ("microg/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 ("microg/m3");
tft.setCursor (10, 5);
tft.setTextColor (ST7735_WHITE, ST7735_BLACK); tft.setTextSize (1); tft.println ("nbre deli/ 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)) {
pixels.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pikslov.fill (oranžno, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {
pikslov.fill (vert, 0, 8); pikslov.polnilo (oranžno, 8, 8); pixels.fill (rouge, 16, (((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pikslov.show (); // Pošlji posodobljene barve slikovnih pik strojni opremi.
// Opredelitev données String PM03 = String (data.particles_03um); Niz PM05 = Niz (data.particles_05um); Niz PM10 = Niz (data.particles_10um); Niz PM25 = Niz (data.particles_25um); Niz PM50 = Niz (data.particles_50um); Niz PM100 = Niz (podatki.delcev_100um); Niz PMS10 = Niz (data.pm10_standard); Niz PMS25 = Niz (data.pm25_standard); Niz PMS100 = Niz (data.pm100_standard); String Temps = niz (temps);
// Ecriture des données dans le fichier texte
Datotečni podatki = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }
}
boolean readPMSdata (tok *s) {
if (! s-> available ()) {return false; } // Beremo po en bajt, dokler ne pridemo do posebnega začetnega bajta '0x42' if (s-> peek ()! = 0x42) {s-> read (); return false; }
// Zdaj preberite vseh 32 bajtov
če (s-> na voljo () readBytes (medpomnilnik, 32);
// pripravimo kontrolno vsoto
za (uint8_t i = 0; i <30; i ++) {vsota+= pufer ; }
/* odpravljanje napak
for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (vmesnik , HEX); Serial.print (","); } Serial.println (); */ // Podatki so v endian'd -u, to jih reši, tako da deluje na vseh platformah uint16_t buffer_u16 [15]; for (uint8_t i = 0; i <15; i ++) {buffer_u16 = medpomnilnik [2 + i*2 + 1]; medpomnilnik_u16 + = (medpomnilnik [2 + i*2] << 8); }
// damo v lepo strukturo:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
if (vsota! = data.checksum) {
Serial.println ("Napaka kontrolne vsote"); return false; } // uspeh! vrni true; }
// Converti le numéro de jour en jour /! / La semaine begin un dimanche
Niz donne_jour_semaine (uint8_t j) {stikalo (j) {primer 0: vrne "DIM"; primer 1: vrnite "LUN"; primer 2: vrnitev "MAR"; primer 3: vrnite "MER"; primer 4: vrnite "JEU"; primer 5: vrnite "VEN"; primer 6: vrnite "SAM"; privzeto: return ""; }}
// affiche la date et l'heure sur l'écran
void affiche_date_heure (DateTime datetime) {// Date String jour = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + Niz (datetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());
Serial.print (jour); Serial.print (""); Serial.print (heure); //Serial.print (""); Datotečni podatki = 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 ("datum"); 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);
zamuda (500);
}
// permet d'afficher les nombres sur deux chiffres
Niz Vers2Chiffres (število bajtov) {String resultat = ""; if (nombre <10) resultat = "0"; povratni rezultat += niz (nombre, DEC); }
3. korak: Program MIT App Inventor 2
to je kodni blok izumitelja aplikacij MIT
4. korak: REZULTAT
tukaj je videoposnetek rezultata
Priporočena:
LED zaslon za prikaz kakovosti zraka PurpleAir: 4 koraki
LED zaslon za prikaz kakovosti zraka PurpleAir: Z nedavnimi požari v Kaliforniji je kakovost zraka v San Franciscu močno prizadeta. Na svojih telefonih ali prenosnih računalnikih smo vedno znova preverjali zemljevid PurpleAir in poskušali ugotoviti, kdaj je zrak dovolj varen, da odpre zmago
Enostavno spremljanje kakovosti zraka s TFT LCD zaslonom- Ameba Arduino: 3 koraki
Enostavno spremljanje kakovosti zraka s TFT LCD zaslonom-Ameba Arduino: Uvod Zdaj, ko večina ljudi ostane doma, da bi se izognili tesnemu stiku s potencialnim nosilcem virusa COVID-19, kakovost zraka postane pomemben dejavnik za dobro počutje ljudi, zlasti v tropskih državah, kjer uporaba klimatske naprave je nujna v času
Spremljanje kakovosti zraka z DSM501A z LCD LCD Nokia: 7 korakov
Spremljanje kakovosti zraka z DSM501A z Nokijinim LCD -jem: Pozdravljeni prijatelji! V tem kratkem navodilu vam bom pokazal, kako spremljati kakovost zraka doma ali kjer koli.To proračunsko ceno za spremljanje kakovosti zraka je precej enostavno sestaviti
Spremljanje kakovosti zraka s fotonom delcev: 11 korakov (s slikami)
Spremljanje kakovosti zraka s fotonom delcev: V tem projektu se senzor delcev PPD42NJ uporablja za merjenje kakovosti zraka (PM 2,5) v zraku s fotonom delcev. Ne prikazuje samo podatkov na konzoli Particle and dweet.io, temveč tudi spreminja kakovost zraka z uporabo LED RGB
AirCitizen - spremljanje kakovosti zraka: 11 korakov (s slikami)
AirCitizen - spremljanje kakovosti zraka: Pozdravljeni vsi! Danes vas bomo naučili, kako reproducirati naš projekt: AirCitizen ekipe AirCitizenPolytech!-Prihaja iz programa 'OpenAir / What's your air?' Projekti AirCitizen želijo državljanom omogočiti aktivno ocenjevanje kakovosti