Përmbajtje:
- Furnizimet
- Hapi 1: Lidhja e Komponentëve
- Hapi 2: Biblioteka dhe Programi Arduino
- Hapi 3: Programi MIT App Inventor 2
- Hapi 4: REZULTATI
Video: Sistemi për Monitorimin e Cilësisë së Ajrit për Ndotjen e Grimcave: 4 Hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:17
HYRJE:
1 Në këtë projekt unë tregoj se si të ndërtoj një detektor grimcash me ekran të të dhënave, kopje rezervë të të dhënave në kartën SD dhe IOT. Vizualisht një ekran unazor neopixel tregon cilësinë e ajrit.
2 Cilësia e ajrit është një shqetësim gjithnjë e më i rëndësishëm sot. ka sisteme për të matur shkallën e pluhurit, por ato janë shumë të shtrenjta. Ekzistojnë detektorë grimcash me kosto të ulët dhe me cilësi të lartë në treg, siç tregohet nga disa studime.
për shembull:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Prandaj vendosa të ndërtoj një pajisje të aftë për të matur numrin e grimcave sipas klasave të madhësisë (0.5µm në 10 µm), vizualisht me një shfaqje të thjeshtë të rezultatit (unaza neo pixel), një ekran më të detajuar në një ekran TFT dhe një kopje rezervë të vulosur me kohë në një kartë SD.
4 Për më tepër kam shtuar një modul komunikimi bluetooth për të qenë në gjendje të komunikoj me një aplikacion android dhe kështu të publikoj rezultatet në një server IOT.
5 Kostoja e përgjithshme e tërësisë nuk i kalon 60 €
Furnizimet
-Arduino uno R3
-Arduino proto mburojë
-TFT ekran ST7735
-Unaza neopixel 24 led
-Plantower PMS5003
-HC-06 modul bluetooth
Hapi 1: Lidhja e Komponentëve
komponentët e ndryshëm janë të lidhur sipas diagramit të mësipërm
Hapi 2: Biblioteka dhe Programi Arduino
1 bibliotekën
për ekranin TFT
github.com/adafruit/Adafruit-GFX-Library
për unazën neo pixel
github.com/adafruit/Adafruit_NeoPixel
për kartën sd
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; #përfshi
// Cila pin në Arduino është e lidhur me NeoPixels?
#define PIN 6 // Në xhingël ose Gemma, sugjeroni ta ndryshoni këtë në 1
// Sa NeoPixel janë bashkangjitur në Arduino?
#përcaktoni NUMPIXELS 24 // Madhësia popullore e unazës NeoPixel Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = piksele. Ngjyra (0, 250, 0); uint32_t portokalli = piksele. Ngjyra (250, 250, 0); uint32_t rouge = piksele. Ngjyra (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // gjithashtu mund ta lidhni këtë me rivendosjen Arduino
#include // Biblioteka bazë grafike
#includ // Biblioteka specifike për pajisjet kompjuterike #Include #include const int cs_sd = 4; int temps; // temps d'acquisition temp të dyfishtëInit; // inicimi i kohëmatësit au démarrage du loop ()
#nëse është përcaktuar (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// Opsioni 1: përdorni çdo kunj, por pak më ngadalë
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Opsioni 2: duhet të përdorni kunjat e harduerit SPI
// (për UNO thats sclk = 13 dhe sid = 11) dhe kunja 10 duhet të jetë // një dalje. Kjo është shumë më e shpejtë - kërkohet edhe nëse doni // të përdorni kartën microSD (shikoni shembullin e vizatimit të figurës) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); noton nombre_leds = 0; void setup () {Serial.begin (9600); // Fillimi i ndërlidhjes I2C Wire.begin (); // Filloni modulin RTC RTC.filloni (); Serial.print ("init SD"); vonesa (1000); nëse (! SD.filloj (cs_sd)) // Gjendja është e shkëlqyeshme si la carte SD është paraprake e përdorimit të {Serial.print ("Defaut SD"); kthim; } Serial.print ("Carte SD OK");
Të dhënat e skedarit = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println ("Blerja e Démarrage"); // Ecrit dans ce fichier data.mbylli (); tft.initR (INITR_GREENTAB); // inicializoni një çip ST7735S, skedë e zezë Serial.println ("init"); // dalja jonë e korrigjimit tft.fillScreen (ST7735_BLACK); // norma e baudit të sensorit është 9600 pmsSerial.begin (9600);
piksele.filloj (); // INITIALIZO objektin e shiritit NeoPixel (KQRKOHET)
pixels.setBrightness (2);
}
struktura pms5003data {
uint16_t framelen; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t grimca_03um, grimca_05um, grimca_10um, grimca_25um, grimca_50um, grimca_100um; uint16_t i papërdorur; uint16_t kontrollues; };
strukturo të dhënat e të dhënave; void loop () {pixels.clear (); // Vendosni të gjitha ngjyrat e pikselëve në 'off' DateTime now = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (tani);
temps = ((millis () - tempsInit))/1000; // Démarrage du chrono
if (lexoPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("pjesë nbre/ 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. 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 ("pjesë nbre/ 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 (((noton (të dhënat. pjesëzat_03um)/65535)*24)); // nombre_leds = (8); Serial.println (nombre_leds);
nëse ((nombre_leds = 1)) {
piksele.mbush (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); piksele.mbush (portokalli, 8, ((nombre_leds) -8)); } tjetër nëse (nombre_leds> 16) {
piksele.mbush (vert, 0, 8); piksele.mbush (portokalli, 8, 8); piksele.mbush (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Dërgoni ngjyrat e azhurnuara të pikselëve në harduer.
// Përkufizimi données String PM03 = String (data.particles_03um); String PM05 = String (data.particles_05um); Vargu PM10 = String (të dhënat.particles_10um); String PM25 = String (data.particles_25um); Vargu PM50 = String (të dhëna.pjesëzat_50um); String PM100 = String (data.particles_100um); String PMS10 = String (data.pm10_standard); String PMS25 = String (data.pm25_standard); String PMS100 = String (data.pm100_standard); Temps String = String (temps);
// Ecriture des données dans le fichier texte
Të dhënat e skedarit = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); te dhenat.mbylle (); }
}
boolean readPMSdata (Stream *s) {
nëse (! s-> në dispozicion ()) {kthehu false; } // Lexoni një bajt në të njëjtën kohë derisa të arrijmë në fillimin e bajtit special '0x42' nëse (s-> shikoj ()! = 0x42) {s-> lexoni (); kthehu i rremë; }
// Tani lexoni të gjitha 32 bajtët
nëse (s-> në dispozicion () readBytes (tampon, 32);
// bëj gati checksum
për (uint8_t i = 0; i <30; i ++) {sum+= tampon ; }
/* korrigjimi i gabimeve
për (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (tampon , HEX); Serial.print (","); } Serial.println (); */ // Të dhënat vijnë në fund, kjo e zgjidh atë kështu që punon në të gjitha platformat uint16_t buffer_u16 [15]; për (uint8_t i = 0; i <15; i ++) {buffer_u16 = tampon [2 + i*2 + 1]; tampon_u16 + = (tampon [2 + i*2] << 8); }
// vendoseni në një strukturë të bukur:)
memcpy ((e pavlefshme *) & të dhëna, (e pavlefshme *) buffer_u16, 30);
nëse (shuma! = data.checksum) {
Serial.println ("Dështimi i shumës së kontrollit"); kthehu i rremë; } // sukses! kthehet e vërtetë; }
// Converti le numéro de jour en jour /! / La semaine commence un dimanche
String donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; rasti 1: kthimi "LUN"; rasti 2: kthimi "MAR"; rasti 3: kthimi "MER"; rasti 4: kthimi "JEU"; rasti 5: kthimi "VEN"; rasti 6: kthimi "SAM"; parazgjedhur: kthehu ""; }}
// affiche la date et l'heure sur l'écran
void affiche_date_heure (DataTime datetime) {// Data String jour = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + String (dataetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (dataetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());
Serial.print (jour); Serial.print (""); Serial.print (heure); //Serial.print (""); Të dhënat e skedarit = SD.open ("donnees.txt", FILE_WRITE); data.print (jour + "" + heure + ""); te dhenat.mbylle ();
tft.setCursor (2, 120);
tft.setTextColor (ST7735_GREEN); tft.setTextSize (1); tft.print ("data"); 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);
vonesë (500);
}
// permet d'afficher les nombres sur deux chiffres
Vargu Vers2Chiffres (byte nombre) {String resultat = ""; if (nombre <10) resultat = "0"; return resultat += String (nombre, DEC); }
Hapi 3: Programi MIT App Inventor 2
ky është blloku i kodit të shpikësit të aplikacionit MIT
Hapi 4: REZULTATI
ja video e rezultatit
Recommended:
Matës i cilësisë së ajrit të brendshëm: 5 hapa (me fotografi)
Matës i Cilësisë së Ajrit të Brendshëm: Projekt i thjeshtë për të kontrolluar cilësinë e ajrit në shtëpinë tuaj. Meqenëse ne qëndrojmë/punojmë nga shtëpia shumë kohët e fundit, mund të jetë një ide e mirë të monitoroni cilësinë e ajrit dhe t'i kujtoni vetes kur është koha për të hapur dritaren dhe merrni ajër të pastër
Ekrani LED i statusit të cilësisë së ajrit PurpleAir: 4 hapa
Ekrani LED i Statusit të Cilësisë së Ajrit PurpleAir: Me zjarret e fundit në Kaliforni cilësia e ajrit në San Francisko është ndikuar shumë. Ne u gjendëm duke kontrolluar hartën PurpleAir pa pushim në telefonat ose laptopët tanë duke u përpjekur të shihnim kur ajri ishte mjaft i sigurt për të hapur fitoren
Sensori i cilësisë së ajrit AEROBOT V1.0: 6 hapa (me fotografi)
Sensori i Cilësisë së Ajrit AEROBOT V1.0: Ky udhëzues ka të bëjë me krijimin e një sensori të lirë dhe shumë të saktë të cilësisë së ajrit të quajtur AEROBOT. Ky projekt tregon temperaturën, lagështinë relative, dendësinë e pluhurit PM 2.5 dhe paralajmërimet për cilësinë e ajrit të rrethinës. Përdor sensin DHT11
Sensori i Cilësisë së Ajrit duke përdorur një Arduino: 4 hapa
Sensori i Cilësisë së Ajrit duke përdorur një Arduino: Në këtë post, ne do të mësojmë se si të ndërtojmë një sensor të thjeshtë por të dobishëm të cilësisë së ajrit. Ne do të përdorim sensorin SGP30 së bashku me Piksey Pico, megjithëse skica do të funksionojë me pothuajse çdo bord të pajtueshëm me Arduino. Videoja e mësipërme ju flet përmes
Monitorimi i Cilësisë së Ajrit duke përdorur Fotonin e Grimcave: 11 Hapa (me fotografi)
Monitorimi i Cilësisë së Ajrit duke përdorur Foton Particle: Në këtë projekt sensori i grimcave PPD42NJ përdoret për të matur cilësinë e ajrit (PM 2.5) të pranishme në ajër me Parton Photon. Ai jo vetëm që shfaq të dhënat në tastierën Particle dhe dweet.io, por gjithashtu tregon cilësinë e ajrit duke përdorur RGB LED duke e ndryshuar atë