Përmbajtje:

Sistemi për Monitorimin e Cilësisë së Ajrit për Ndotjen e Grimcave: 4 Hapa
Sistemi për Monitorimin e Cilësisë së Ajrit për Ndotjen e Grimcave: 4 Hapa

Video: Sistemi për Monitorimin e Cilësisë së Ajrit për Ndotjen e Grimcave: 4 Hapa

Video: Sistemi për Monitorimin e Cilësisë së Ajrit për Ndotjen e Grimcave: 4 Hapa
Video: Webinar ‘Energy transition and air quality: solutions and good practices’ (27/04/2023) + Subtitles 2024, Nëntor
Anonim
Sistemi për monitorimin e cilësisë së ajrit për ndotjen e grimcave
Sistemi për monitorimin e cilësisë së ajrit për ndotjen e grimcave
Sistemi për monitorimin e cilësisë së ajrit për ndotjen e grimcave
Sistemi për monitorimin e cilësisë së ajrit për ndotjen e grimcave

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

Lidhja e Komponentëve
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

Programi MIT App Inventor 2
Programi MIT App Inventor 2

ky është blloku i kodit të shpikësit të aplikacionit MIT

Hapi 4: REZULTATI

ja video e rezultatit

Recommended: