Cuprins:

Sistem de monitorizare a calității aerului pentru poluarea cu particule: 4 pași
Sistem de monitorizare a calității aerului pentru poluarea cu particule: 4 pași

Video: Sistem de monitorizare a calității aerului pentru poluarea cu particule: 4 pași

Video: Sistem de monitorizare a calității aerului pentru poluarea cu particule: 4 pași
Video: Cine și cum măsoară poluarea aerului în România 2024, Iulie
Anonim
Sistem de monitorizare a calității aerului pentru poluarea cu particule
Sistem de monitorizare a calității aerului pentru poluarea cu particule
Sistem de monitorizare a calității aerului pentru poluarea cu particule
Sistem de monitorizare a calității aerului pentru poluarea cu particule

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

Conectarea componentelor
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

Programul MIT App Inventor 2
Programul MIT App Inventor 2

acesta este blocul de cod al inventatorului aplicației MIT

Pasul 4: REZULTATUL

iată videoclipul rezultatului

Recomandat: