Indholdsfortegnelse:

System til overvågning af luftkvalitet for partikler forurening: 4 trin
System til overvågning af luftkvalitet for partikler forurening: 4 trin

Video: System til overvågning af luftkvalitet for partikler forurening: 4 trin

Video: System til overvågning af luftkvalitet for partikler forurening: 4 trin
Video: 5 Best Air Purifiers You Can Buy In 2023 2024, Juli
Anonim
System til overvågning af luftkvalitet for partikler forurening
System til overvågning af luftkvalitet for partikler forurening
System til overvågning af luftkvalitet for partikler forurening
System til overvågning af luftkvalitet for partikler forurening

INTRO:

1 I dette projekt viser jeg, hvordan man opbygger en partikeldetektor med datavisning, data backup på SD -kort og IOT. Visuelt angiver et neopixels ringdisplay luftkvaliteten.

2 Luftkvaliteten er en stadig vigtigere bekymring i dag. der er systemer til måling af støvhastigheden, men de er meget dyre. Der er billige partikeldetektorer af høj kvalitet på markedet, som det fremgår af nogle undersøgelser.

for eksempel:

www.atmos-meas-tech.net/11/4823/2018/amt-1…

3 Jeg besluttede derfor at bygge en enhed, der er i stand til at måle antallet af partikler efter størrelsesklasser (0,5 µm til 10 µm), visuelt med en simpel visning af resultatet (neo pixel ring), en mere detaljeret visning på en TFT -skærm og en tidsstemplet backup på et SD-kort.

4 Derudover har jeg tilføjet et Bluetooth -kommunikationsmodul for at kunne kommunikere med en Android -applikation og dermed offentliggøre resultaterne på en IOT -server.

5 De samlede omkostninger for det hele overstiger ikke 60 €

Forbrugsvarer

-Arduino uno R3

-Arduino proto skjold

-TFT -skærm ST7735

-Neopixel ring 24 led

-Plantower PMS5003

-HC-06 bluetooth-modul

Trin 1: Tilslutning af komponenterne

Tilslutning af komponenterne
Tilslutning af komponenterne

de forskellige komponenter er forbundet i henhold til diagrammet ovenfor

Trin 2: Bibliotek og Arduino -program

1 biblioteket

til TFT -skærmen

github.com/adafruit/Adafruit-GFX-Library

til neo pixelringen

github.com/adafruit/Adafruit_NeoPixel

til sd -kortet

github.com/arduino-libraries/SD

2 arduino -skitsen

#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #omfatte

// Hvilken pin på Arduino er forbundet til NeoPixels?

#define PIN 6 // På Trinket eller Gemma foreslår du at ændre dette til 1

// Hvor mange NeoPixels er knyttet til Arduino?

#define NUMPIXELS 24 // Populær NeoPixel ringstørrelse Adafruit_NeoPixel pixels (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixels. Farve (0, 250, 0); uint32_t orange = pixels. Farve (250, 250, 0); uint32_t rouge = pixels. Color (255, 0, 0);

SoftwareSerial pmsSerial (2, 3);

#define cs 10 #define dc 9 #define rst 8 // du kan også slutte dette til Arduino reset

#include // Core grafikbibliotek

#include // Hardware-specifikt bibliotek #include #include const int cs_sd = 4; int vikarer; // temps d'acquisition dobbelt tempsInit; // initialisering af timer eller démarrage du loop ()

#if defineret (_ SAM3X8E_)

#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif

// Mulighed 1: brug alle stifter, men lidt langsommere

// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);

// Mulighed 2: skal bruge hardware -SPI -benene

// (for UNO er det sclk = 13 og sid = 11) og pin 10 skal være // en output. Dette er meget hurtigere - også påkrævet, hvis du vil // bruge microSD -kortet (se billedtegningseksemplet) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; ugyldig opsætning () {Serial.begin (9600); // Initialiser la liaison I2C Wire.begin (); // Initialiser modulet RTC RTC.begin (); Serial.print ("init SD"); forsinkelse (1000); if (! SD.begin (cs_sd)) // Condition vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); Vend tilbage; } Serial.print ("Carte SD OK");

Fildata = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"

data.println (""); data.println ("Démarrage -erhvervelse"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // initialiser en ST7735S -chip, sort fane Serial.println ("init"); // vores debugging output tft.fillScreen (ST7735_BLACK); // sensor baud rate er 9600 pmsSerial.begin (9600);

pixels.begin (); // INITIALISER NeoPixel -strimmelobjekt (påkrævet)

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 partikler_03um, partikler_05um, partikler_10um, partikler_25um, partikler_50um, partikler_100um; uint16_t ubrugt; uint16_t kontrolsum; };

struct pms5003data data; void loop () {pixels.clear (); // Indstil alle pixelfarver til 'off' DateTime nu = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (nu);

temps = ((millis () - tempsInit))/1000; // Démarrage du chrono

hvis (readPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("nbre dele/ 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 (" 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 dele/ 0,1 l");

// Serial.print (vikarer);

// Serial.print (""); Serial.print ("#"); Serielt tryk ("03 µm"); Serial.print (data.particles_03um); Serial.print (""); Serial.print ("05 µm"); Serial.print (data.particles_05um); Serial.print (""); Serielt tryk ("1 µm"); Serial.print (data.particles_10um); Serial.print (""); Serielt tryk ("25 µm"); Serial.print (data.particles_25um); Serial.print (""); Serielt tryk ("50 µm"); Serial.print (data.particles_50um); Serial.print (""); Serielt tryk ("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);

hvis ((nombre_leds = 1)) {

pixels.fill (vert, 0, nombre_leds); } ellers hvis ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixels.fill (orange, 8, ((nombre_leds) -8)); } ellers hvis (nombre_leds> 16) {

pixel. udfyldning (vert, 0, 8); pixel. udfyldning (orange, 8, 8); pixels.fill (rouge, 16, ((nombre_leds) -16)); } ellers hvis (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Send de opdaterede pixelfarver til hardwaren.

// 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

Fildata = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }

}

boolsk readPMSdata (Stream *s) {

hvis (! s-> tilgængelig ()) {return false; } // Læs en byte ad gangen, indtil vi kommer til den særlige '0x42' start-byte, hvis (s-> peek ()! = 0x42) {s-> read (); return falsk; }

// Læs nu alle 32 bytes

hvis (s-> tilgængelig () readBytes (buffer, 32);

// gør kontrolsummen klar

for (uint8_t i = 0; i <30; i ++) {sum+= buffer ; }

/* fejlfinding

for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (buffer , HEX); Serial.print (","); } Serial.println (); */ // Dataene kommer i endian'd, dette løser det, så det fungerer på alle platforme 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); }

// sætte det i en flot struktur:)

memcpy ((void *) & data, (void *) buffer_u16, 30);

hvis (sum! = data.checksum) {

Serial.println ("Fejl ved kontrolsum"); return falsk; } // succes! vende tilbage sandt; }

// 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"; sag 1: returner "LUN"; sag 2: returner "MAR"; sag 3: returner "MER"; sag 4: returner "JEU"; sag 5: returner "VEN"; sag 6: returner "SAM"; default: 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 ()) + "/" + String (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 (""); Fildata = 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 ("dato"); 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);

forsinkelse (500);

}

// permet d'afficher les nombres sur deux chiffres

String Vers2Chiffres (byte nombre) {String resultat = ""; hvis (nombre <10) resultat = "0"; returresultat += String (nombre, DEC); }

Trin 3: MIT App Inventor 2 Program

MIT App Inventor 2 -program
MIT App Inventor 2 -program

dette er MIT -appens opfinderkodeblok

Trin 4: RESULTATET

her er videoen af resultatet

Anbefalede: