Innholdsfortegnelse:

System for overvåking av luftkvalitet for forurensning av partikler: 4 trinn
System for overvåking av luftkvalitet for forurensning av partikler: 4 trinn

Video: System for overvåking av luftkvalitet for forurensning av partikler: 4 trinn

Video: System for overvåking av luftkvalitet for forurensning av partikler: 4 trinn
Video: ZEITGEIST: MOVING FORWARD | OFFICIAL RELEASE | 2011 2024, Juli
Anonim
System for overvåking av luftkvalitet for forurensning av partikler
System for overvåking av luftkvalitet for forurensning av partikler
System for overvåking av luftkvalitet for forurensning av partikler
System for overvåking av luftkvalitet for forurensning av partikler

INTRO:

1 I dette prosjektet viser jeg hvordan jeg bygger en partikkeldetektor med datavisning, sikkerhetskopiering av data på SD -kort og IOT. Visuelt indikerer en ringeskjerm i neopiksler luftkvaliteten.

2 Luftkvaliteten er en stadig viktigere bekymring i dag. Det er systemer for å måle støvhastigheten, men de er veldig dyre. Det er billige partikeldetektorer av høy kvalitet på markedet, som vist av noen studier.

for eksempel:

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

3 Jeg bestemte meg derfor for å bygge en enhet som kan måle antall partikler etter størrelsesklasser (0,5 um til 10 um), visuelt med en enkel visning av resultatet (neo pixel ring), en mer detaljert visning på en TFT -skjerm og en tidsstemplet sikkerhetskopiering på et SD-kort.

4 I tillegg har jeg lagt til en Bluetooth -kommunikasjonsmodul for å kunne kommunisere med en Android -applikasjon og dermed publisere resultatene på en IOT -server.

5 Den totale kostnaden for det hele overstiger ikke 60 €

Rekvisita

-Arduino uno R3

-Arduino proto skjold

-TFT -skjerm ST7735

-Neopixel ring 24 led

-Plantower PMS5003

-HC-06 Bluetooth-modul

Trinn 1: Koble til komponentene

Koble til komponentene
Koble til komponentene

de forskjellige komponentene er koblet i henhold til diagrammet ovenfor

Trinn 2: Bibliotek og Arduino -program

1 biblioteket

for TFT -skjermen

github.com/adafruit/Adafruit-GFX-Library

for neo pikselringen

github.com/adafruit/Adafruit_NeoPixel

for sd -kortet

github.com/arduino-libraries/SD

2 arduino -skissen

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

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

#define PIN 6 // På Trinket eller Gemma, foreslår du å endre dette til 1

// Hvor mange NeoPixels er festet til Arduino?

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

SoftwareSerial pmsSerial (2, 3);

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

#include // Core grafikkbibliotek

#include // Maskinvarespesifikt bibliotek #include #include const int cs_sd = 4; int vikarer; // temps d'acquisition dobbel tempsInit; // initialisering du timer au démarrage du loop ()

#if definert (_ SAM3X8E_)

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

// Alternativ 1: bruk noen pins, men litt tregere

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

// Alternativ 2: må bruke maskinvarens SPI -pinner

// (for UNO det er sclk = 13 og sid = 11) og pin 10 må være // en utgang. Dette er mye raskere - også påkrevd hvis du vil // bruke microSD -kortet (se bildetegningseksemplet) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; ugyldig oppsett () {Serial.begin (9600); // Initialise la liaison I2C Wire.begin (); // Initialiser modulen 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"); komme tilbake; } Serial.print ("Carte SD OK");

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

data.println (""); data.println ("Démarrage -oppkjøp"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // initialiser en ST7735S -brikke, svart fane Serial.println ("init"); // vår feilsøkingsutgang tft.fillScreen (ST7735_BLACK); // sensor baud rate er 9600 pmsSerial.begin (9600);

pixels.begin (); // INITIALISER NeoPixel stripeobjekt (påkrevd)

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 ubrukt; uint16_t kontrollsum; };

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

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 ("nbre deler/ 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 deler/ 0,1 l");

// Serial.print (vikarer);

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

piksler.fyll (vert, 0, nombre_leds); } annet hvis ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); piksler.fyll (oransje, 8, ((nombre_leds) -8)); } annet hvis (nombre_leds> 16) {

piksler. fyll (vert, 0, 8); piksler. fyll (oransje, 8, 8); piksler.fyll (rød, 16, ((nombre_leds) -16)); } annet hvis (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } piksler.vis (); // Send de oppdaterte pikselfargene til maskinvaren.

// 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-> tilgjengelig ()) {return false; } // Les en byte om gangen til vi kommer til den spesielle '0x42' start-byte hvis (s-> peek ()! = 0x42) {s-> read (); return falsk; }

// Les nå alle 32 byte

hvis (s-> tilgjengelig () readBytes (buffer, 32);

// gjør sjekksummen klar

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

/* feilsøking

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 slik at det fungerer på alle plattformer 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); }

// sette det inn i en fin struktur:)

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

if (sum! = data.checksum) {

Serial.println ("Feil i kontrollsummen"); return falsk; } // suksess! returner sant; }

// 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"; sak 1: returner "LUN"; sak 2: returner "MAR"; sak 3: returner "MER"; sak 4: returner "JEU"; sak 5: returner "VEN"; sak 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 ("date"); 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 = ""; if (nombre <10) resultat = "0"; returresultat += String (nombre, DEC); }

Trinn 3: MIT App Inventor 2 Program

MIT App Inventor 2 Program
MIT App Inventor 2 Program

dette er MIT -appens oppfinnerkodeblokk

Trinn 4: RESULTATET

her er videoen av resultatet

Anbefalt: