Cuprins:
- Provizii
- Pasul 1: Conectarea componentelor
- Pasul 2: Biblioteca și programul Arduino
- Pasul 3: Programul MIT App Inventor 2
- Pasul 4: REZULTATUL
Video: Sistem de monitorizare a calității aerului pentru poluarea cu particule: 4 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:43
INTRO:
1 În acest proiect arăt cum să construiesc un detector de particule cu afișare de date, backup de date pe card SD și IOT. Vizual, un afișaj de inel neopixeli indică calitatea aerului.
2 Calitatea aerului este o preocupare din ce în ce mai importantă astăzi. există sisteme de măsurare a ratei de praf, dar sunt foarte scumpe. Există pe piață detectoare de particule ieftine și de înaltă calitate, după cum arată unele studii.
de exemplu:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Prin urmare, am decis să construiesc un dispozitiv capabil să măsoare numărul de particule în funcție de clasele de mărime (0,5 µm până la 10 µm), vizual, cu o afișare simplă a rezultatului (neo pixel ring), un afișaj mai detaliat pe un ecran TFT și un copie de rezervă pe un card SD.
4 În plus, am adăugat un modul de comunicare bluetooth pentru a putea comunica cu o aplicație Android și astfel să public rezultatele pe un server IOT.
5 Costul total al întregului nu depășește 60 €
Provizii
-Arduino uno R3
-Scut proto Arduino
-Ecran TFT ST7735
-Inel Neopixel 24 led
-Plantower PMS5003
-Modul bluetooth HC-06
Pasul 1: Conectarea componentelor
diferitele componente sunt conectate conform schemei de mai sus
Pasul 2: Biblioteca și programul Arduino
1 biblioteca
pentru ecranul TFT
github.com/adafruit/Adafruit-GFX-Library
pentru inelul de neo pixel
github.com/adafruit/Adafruit_NeoPixel
pentru cardul sd
github.com/arduino-libraries/SD
2 schița arduino
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #include
// Care pin de pe Arduino este conectat la NeoPixels?
#define PIN 6 // Pe Trinket sau Gemma, sugerează schimbarea acestuia la 1
// Câți NeoPixeli sunt atașați la Arduino?
#define NUMPIXELS 24 // Dimensiune populară a inelului NeoPixel Adafruit_NeoPixel pixeli (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixels. Color (0, 250, 0); uint32_t orange = pixels. Color (250, 250, 0); uint32_t rouge = pixels. Color (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // puteți conecta acest lucru și la resetarea Arduino
#include // Biblioteca grafică de bază
#include // Biblioteca specifică hardware-ului #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // initialisation du timer au démarrage du loop ()
#if definit (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// Opțiunea 1: utilizați orice pini, dar puțin mai încet
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Opțiunea 2: trebuie să utilizați pinii SPI hardware
// (pentru UNO thats sclk = 13 și sid = 11) și pinul 10 trebuie să fie // o ieșire. Acest lucru este mult mai rapid - necesar, de asemenea, dacă doriți // să utilizați cardul microSD (consultați exemplul desenului imagine) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Inițializați legătura I2C Wire.begin (); // Inițializați modulul RTC RTC.begin (); Serial.print ("init SD"); întârziere (1000); if (! SD.begin (cs_sd)) // Condition vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); întoarcere; } Serial.print („Carte SD OK”);
Date fișier = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println („achiziție Démarrage”); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inițializați un cip ST7735S, filă neagră Serial.println ("init"); // ieșirea noastră de depanare tft.fillScreen (ST7735_BLACK); // rata de transmisie a senzorului este de 9600 pms Serial.begin (9600);
pixeli.begin (); // INIȚIALIZAȚI obiectul cu bandă NeoPixel (NECESAR)
pixeli.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 particule_03um, particule_05um, particule_10um, particule_25um, particule_50um, particule_100um; uint16_t neutilizat; uint16_t checksum; };
struct pms5003data data; void loop () {pixels.clear (); // Setați toate culorile pixelilor la „off” DateTime acum = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (acum);
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 ("piese 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.print (" microg / 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 ("piese 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 (((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); pixels.fill (portocaliu, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {
pixels.fill (vert, 0, 8); pixels.fill (portocaliu, 8, 8); pixels.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Trimiteți culorile pixelilor actualizate la hardware.
// Définition données String PM03 = String (data.particles_03um); String PM05 = String (data.particles_05um); String PM10 = String (data.particles_10um); String PM25 = String (data.particles_25um); String PM50 = String (data.particles_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); String Temps = String (temps);
// Ecriture des données dans le fichier texte
Date fișier = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps + "" + PM03 + "" + PM05 + "" + PM10 + "" + PM25 + "" + PM50 + "" + PM100 + "" + PMS10 + "" + PMS25 + "" + PMS100 + ""); data.close (); }
}
readPMSdata boolean (Stream * s) {
if (! s-> available ()) {return false; } // Citiți câte un octet până când ajungem la startul-octet special „0x42” dacă (s-> peek ()! = 0x42) {s-> read (); returnează fals; }
// Acum citiți toți cei 32 de octeți
if (s-> available () readBytes (buffer, 32);
// pregătește suma de verificare
for (uint8_t i = 0; i <30; i ++) {sum + = buffer ; }
/ * depanare
pentru (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (tampon , HEX); Serial.print (","); } Serial.println (); * / // Datele vin în endian'd, acest lucru le rezolvă astfel încât să funcționeze pe toate platformele uint16_t buffer_u16 [15]; for (uint8_t i = 0; i <15; i ++) {buffer_u16 = buffer [2 + i * 2 + 1]; buffer_u16 + = (buffer [2 + i * 2] << 8); }
// pune-l într-o structură frumoasă:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
if (sum! = data.checksum) {
Serial.println ("Checksum failure"); returnează fals; } // succes! întoarce-te adevărat; }
// 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"; cazul 1: returnează „LUN”; cazul 2: returnează „MAR”; caz 3: returnează „MER”; cazul 4: returnează „JEU”; caz 5: returnează „VEN”; caz 6: returnează „SAM”; implicit: returnează ""; }}
// 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 ()) + "/" + Șir (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 (""); Date fișier = 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 ("dată"); 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);
întârziere (500);
}
// permet d'afficher les nombres sur deux chiffres
String Vers2Chiffres (byte nombre) {String result = ""; if (nombre <10) rezultat = "0"; return result + = String (nombre, DEC); }
Pasul 3: Programul MIT App Inventor 2
acesta este blocul de cod al inventatorului aplicației MIT
Pasul 4: REZULTATUL
iată videoclipul rezultatului
Recomandat:
Afișaj LED pentru starea calității aerului PurpleAir: 4 pași
Afișaj LED pentru starea calității aerului PurpleAir: Odată cu incendiile recente din California, calitatea aerului din San Francisco a fost foarte afectată. Ne-am trezit verificând harta PurpleAir de mai multe ori pe telefoanele sau laptopurile noastre, încercând să vedem când aerul era suficient de sigur pentru a deschide victoria
Monitorizare simplă a calității aerului cu afișaj LCD TFT - Ameba Arduino: 3 pași
Monitorizare simplă a calității aerului cu afișaj LCD TFT - Ameba Arduino: Introducere Acum, când majoritatea oamenilor rămân acasă pentru a evita contactul strâns cu potențialul purtător de virus COVID-19, calitatea aerului devine un factor important pentru bunăstarea oamenilor, în special în țările tropicale unde utilizarea aerului condiționat este o necesitate pe durata
Airduino: Monitorul calității aerului mobil: 5 pași
Airduino: Monitor de calitate a aerului mobil: Bine ați venit la proiectul meu, Airduino. Numele meu este Robbe Breens. Studiez tehnologia multimedia și a comunicațiilor la Howest din Kortrijk, Belgia. La sfârșitul celui de-al doilea semestru, trebuie să facem un dispozitiv IoT, care este o modalitate excelentă de a aduce toate
Harta CEL pentru poluarea aerului (modificată): 7 pași
Harta CEL pentru poluarea aerului (modificată): Poluarea aerului este o problemă globală în societatea actuală, este cauza a numeroase boli și provoacă disconfort. Acesta este motivul pentru care am încercat să construim un sistem care să poată urmări atât locația GPS, cât și poluarea aerului în acel loc exact, pentru a fi apoi
Monitorizarea calității aerului utilizând fotonul de particule: 11 pași (cu imagini)
Monitorizarea calității aerului utilizând fotonul de particule: în acest proiect, senzorul de particule PPD42NJ este utilizat pentru a măsura calitatea aerului (PM 2.5) prezentă în aer cu fotonul de particule. Nu numai că afișează datele de pe consola Particle și dweet.io, ci indică și calitatea aerului folosind LED-ul RGB, schimbându-l