Obsah:

Systém monitorování kvality ovzduší pro znečištění částicemi: 4 kroky
Systém monitorování kvality ovzduší pro znečištění částicemi: 4 kroky

Video: Systém monitorování kvality ovzduší pro znečištění částicemi: 4 kroky

Video: Systém monitorování kvality ovzduší pro znečištění částicemi: 4 kroky
Video: PirateCon 2018: Znečištění ovzduší a zdraví (Miroslav Šuta) 2024, Červenec
Anonim
Systém monitorování kvality ovzduší pro znečištění částicemi
Systém monitorování kvality ovzduší pro znečištění částicemi
Systém monitorování kvality ovzduší pro znečištění částicemi
Systém monitorování kvality ovzduší pro znečištění částicemi

INTRO:

1 V tomto projektu ukazuji, jak postavit detektor částic se zobrazením dat, zálohováním dat na SD kartu a IOT. Kruhový displej neopixelů vizuálně indikuje kvalitu vzduchu.

2 Kvalita ovzduší je v dnešní době stále důležitějším problémem. existují systémy pro měření rychlosti prachu, ale jsou velmi drahé. Jak ukazují některé studie, na trhu jsou levné a vysoce kvalitní detektory částic.

například:

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

3 Rozhodl jsem se proto vybudovat zařízení schopné měřit počet částic podle velikostních tříd (0,5 µm až 10 µm), vizuálně s jednoduchým zobrazením výsledku (neo pixel ring), podrobnějším zobrazením na TFT obrazovce a záloha s časovým razítkem na SD kartu.

4 Kromě toho jsem přidal komunikační modul bluetooth, abych mohl komunikovat s aplikací pro Android a publikovat výsledky na serveru IOT.

5 Celkové náklady na celek nepřesahují 60 EUR

Zásoby

-Arduino uno R3

-Arduino proto štít

-TFT obrazovka ST7735

-Neopixelový prsten 24 LED

-Plantower PMS5003

-HC-06 bluetooth modul

Krok 1: Připojení komponent

Připojení komponent
Připojení komponent

různé součásti jsou spojeny podle výše uvedeného schématu

Krok 2: Knihovna a program Arduino

1 knihovna

pro obrazovku TFT

github.com/adafruit/Adafruit-GFX-Library

pro prsten neo pixel

github.com/adafruit/Adafruit_NeoPixel

pro sd kartu

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; #zahrnout

// Který pin na Arduinu je připojen k NeoPixelům?

#define PIN 6 // Na Trinketu nebo Gemmě navrhněte změnit toto na 1

// Kolik NeoPixelů je připojeno k Arduinu?

#define NUMPIXELS 24 // Populární velikost prstenu NeoPixel Adafruit_NeoPixel pixely (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixely. Barva (0, 250, 0); uint32_t oranžová = pixely. Barva (250, 250, 0); uint32_t rouge = pixely. Color (255, 0, 0);

SoftwareSerial pmsSerial (2, 3);

#define cs 10 #define dc 9 #define rst 8 // toto můžete také připojit k resetování Arduino

#include // Základní grafická knihovna

#include // Hardwarově specifická knihovna #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // inicializace časovače nebo demarrage du loop ()

definováno #if (_ SAM3X8E_)

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

// Možnost 1: použijte jakékoli kolíky, ale trochu pomaleji

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

// Možnost 2: musí používat hardwarové piny SPI

// (pro UNO to je sclk = 13 a sid = 11) a pin 10 musí být // výstup. To je mnohem rychlejší - také nutné, pokud chcete // použít kartu microSD (viz příklad kresby obrázku) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; neplatné nastavení () {Serial.begin (9600); // Inicializace spojení I2C Wire.begin (); // Inicializace modulu RTC RTC.begin (); Serial.print ("init SD"); zpoždění (1000); if (! SD.begin (cs_sd)) // Podmínkou výběru je SD karta, která se zobrazí v aplikaci {Serial.print ("Výchozí SD"); vrátit se; } Serial.print („Karta SD v pořádku“);

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

data.println (""); data.println („akvizice demarrage“); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inicializace čipu ST7735S, černá záložka Serial.println ("init"); // náš ladicí výstup tft.fillScreen (ST7735_BLACK); // přenosová rychlost senzoru je 9600 pmsSerial.begin (9600);

pixely.begin (); // INICIALIZACE objektu pásu NeoPixel (POVINNÉ)

pixely.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 částice_03um, částice_05um, částice_10um, částice_25um, částice_50um, částice_100um; uint16_t nepoužito; uint16_t kontrolní součet; };

strukturovaná data pms5003; void loop () {pixely.clear (); // Nastavit všechny barvy pixelů na 'off' DateTime now = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (now);

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 díly/ 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 ("mikrog/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 ("mikrog/m3");

tft.setCursor (10, 5);

tft.setTextColor (ST7735_WHITE, ST7735_BLACK); tft.setTextSize (1); tft.println ("nbre díly/ 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)) {

pixely.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixely.vyplnění (oranžová, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {

pixely.vyplnění (vert, 0, 8); pixely.vyplnění (oranžová, 8, 8); pixely.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixelů.show (); // Odeslání aktualizovaných barev pixelů na hardware.

// Definice dárku Řetězec PM03 = Řetězec (data.particles_03um); Řetězec PM05 = Řetězec (data.particles_05um); Řetězec PM10 = Řetězec (data.particles_10um); Řetězec PM25 = Řetězec (data.particles_25um); Řetězec PM50 = Řetězec (data.particles_50um); Řetězec PM100 = Řetězec (data.particles_100um); Řetězec PMS10 = Řetězec (data.pm10_standard); Řetězec PMS25 = Řetězec (data.pm25_standard); Řetězec PMS100 = Řetězec (data.pm100_standard); String Temps = String (temps);

// Ecriture des données dans le fichier texte

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

}

boolean readPMSdata (Stream *s) {

if (! s-> available ()) {return false; } // Číst bajt najednou, dokud se nedostaneme na speciální počáteční bajt '0x42' if (s-> peek ()! = 0x42) {s-> read (); return false; }

// Nyní přečtěte všech 32 bajtů

if (s-> available () readBytes (buffer, 32);

// připravte si kontrolní součet

pro (uint8_t i = 0; i <30; i ++) {součet+= vyrovnávací paměť ; }

/* ladění

pro (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (buffer , HEX); Serial.print (","); } Serial.println (); */ // Data přicházejí v endian'd, tím se to vyřeší, takže to funguje na všech platformách uint16_t buffer_u16 [15]; pro (uint8_t i = 0; i <15; i ++) {buffer_u16 = buffer [2 + i*2 + 1]; buffer_u16 + = (buffer [2 + i*2] << 8); }

// vložte to do pěkné struktury:)

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

if (sum! = data.checksum) {

Serial.println ("Selhání kontrolního součtu"); return false; } // úspěch! return true; }

// Převod čísel do žurnálu /! / La semaine začíná dimanche

Řetězec donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; případ 1: návrat "LUN"; případ 2: návrat „MAR“; případ 3: návrat „MER“; případ 4: návrat „JEU“; případ 5: návrat "VEN"; případ 6: vrátit "SAM"; výchozí: návrat ""; }}

// 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 ()) + "/" + Řetězec (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 (""); Data souboru = 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);

zpoždění (500);

}

// permet d'afficher les nombres sur deux chiffres

Řetězec Vers2Chiffres (byte nombre) {String resultat = ""; if (nombre <10) resultat = "0"; vrátit resultat += String (nombre, DEC); }

Krok 3: Program MIT App Inventor 2

Program MIT App Inventor 2
Program MIT App Inventor 2

toto je blok kódu vynálezce aplikace MIT

Krok 4: VÝSLEDEK

zde je video s výsledkem

Doporučuje: