Obsah:

Systém monitorovania kvality ovzdušia pre znečistenie časticami: 4 kroky
Systém monitorovania kvality ovzdušia pre znečistenie časticami: 4 kroky

Video: Systém monitorovania kvality ovzdušia pre znečistenie časticami: 4 kroky

Video: Systém monitorovania kvality ovzdušia pre znečistenie časticami: 4 kroky
Video: Woori Juntos - Harris County Commissioner Court 2024, Júl
Anonim
Systém monitorovania kvality ovzdušia pre znečistenie časticami
Systém monitorovania kvality ovzdušia pre znečistenie časticami
Systém monitorovania kvality ovzdušia pre znečistenie časticami
Systém monitorovania kvality ovzdušia pre znečistenie časticami

ÚVOD:

1 V tomto projekte uvádzam, ako postaviť detektor častíc so zobrazením údajov, zálohovaním údajov na kartu SD a IOT. Kruhový displej neopixelov vizuálne indikuje kvalitu vzduchu.

2 Kvalita ovzdušia je v dnešnej dobe stále dôležitejším problémom. existujú systémy na meranie prašnosti, ale sú veľmi drahé. Ako ukazujú niektoré štúdie, na trhu sú lacné a vysokokvalitné detektory častíc.

napríklad:

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

3 Rozhodol som sa preto zostrojiť zariadenie schopné merať počet častíc podľa veľkostných tried (0,5 µm až 10 µm), vizuálne s jednoduchým zobrazením výsledku (neo pixel pixel ring), podrobnejším zobrazením na TFT obrazovke a zálohovanie s časovou pečiatkou na SD kartu.

4 Okrem toho som pridal komunikačný modul bluetooth, aby mohol komunikovať s aplikáciou pre Android, a tak publikovať výsledky na serveri IOT.

5 Celkové náklady na celok nepresahujú 60 €

Zásoby

-Arduino uno R3

-Arduino proto štít

-TFT obrazovka ST7735

-Neopixelový krúžok 24 LED

-Plantower PMS5003

-HC-06 bluetooth modul

Krok 1: Pripojenie komponentov

Pripojenie komponentov
Pripojenie komponentov

rôzne komponenty sú spojené podľa vyššie uvedeného diagramu

Krok 2: Program Knižnica a Arduino

1 knižnica

pre obrazovku TFT

github.com/adafruit/Adafruit-GFX-Library

pre neo pixelový prsteň

github.com/adafruit/Adafruit_NeoPixel

pre 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; #zahrnúť

// Ktorý pin na Arduine je pripojený k NeoPixels?

#define PIN 6 // Na Trinket alebo Gemma navrhnite zmeniť toto číslo na 1

// Koľko NeoPixelov je pripojených k Arduinu?

#define NUMPIXELS 24 // Obľúbená veľkosť prsteňa NeoPixel Adafruit_NeoPixel pixelov (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pixely. Farba (0, 250, 0); uint32_t oranžová = pixely. Farba (250, 250, 0); uint32_t rouge = pixely. Color (255, 0, 0);

SoftwareSériový pmsSériový (2, 3);

#define cs 10 #define dc 9 #define rst 8 // toto môžete tiež pripojiť k resetovaniu Arduino

#include // Základná grafická knižnica

#include // Knižnica špecifická pre hardvér #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // inicializácia časovača demarrage du loop ()

definované #if (_ SAM3X8E_)

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

// Možnosť 1: použite akékoľvek špendlíky, ale trochu pomalšie

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

// Možnosť 2: musí používať hardvérové piny SPI

// (pre UNO to je sclk = 13 a sid = 11) a pin 10 musí byť // výstup. Je to oveľa rýchlejšie - vyžaduje sa to aj vtedy, ak chcete // použiť kartu microSD (pozri príklad kresby na obrázku) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Inicializácia spojenia I2C Wire.begin (); // Inicializácia modulu RTC RTC.begin (); Serial.print ("init SD"); oneskorenie (1000); if (! SD.begin (cs_sd)) // Podmienka výberu si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); návrat; } Serial.print („Karta SD v poriadku“);

Údaje o súbore = SD.open ("donnees.txt", FILE_WRITE); // Úvahy o "donnees.txt"

data.println (""); data.println („akvizícia demarragu“); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inicializácia čipu ST7735S, čierna záložka Serial.println ("init"); // náš ladiaci výstup tft.fillScreen (ST7735_BLACK); // prenosová rýchlosť senzora je 9600 pmsSerial.begin (9600);

pixely.begin (); // INICIALIZUJTE objekt 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 častice_03um, častice_05um, častice_10um, častice_25um, častice_50um, častice_100um; uint16_t nepoužitý; uint16_t kontrolný súčet; };

dátové údaje štruktúry pms5003; void loop () {pixelov.clear (); // Nastaviť všetky farby pixelov na 'vypnuté' DateTime teraz = 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 diely/ 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 diely/ 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)) {pixelov.fill (vert, 0, 8); pixelov.fill (oranžová, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {

pixelov.fill (vert, 0, 8); pixelov.fill (oranžová, 8, 8); pixely.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixelov.fill (vert, 0, 1); } pixelov.show (); // Odošlite aktualizované farby pixelov na hardvér.

// Definícia darovania Reťazec PM03 = Reťazec (data.particles_03um); Reťazec PM05 = Reťazec (data.particles_05um); Reťazec PM10 = Reťazec (data.particles_10um); Reťazec PM25 = Reťazec (data.particles_25um); Reťazec PM50 = Reťazec (data.particles_50um); Reťazec PM100 = Reťazec (data.particles_100um); Reťazec PMS10 = Reťazec (data.pm10_standard); Reťazec PMS25 = Reťazec (data.pm25_standard); Reťazec PMS100 = Reťazec (data.pm100_standard); String Temps = String (temps);

// Ecriture des données dans le fichier texte

Údaje o súbore = 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; } // Čítajte bajt naraz, kým sa nedostaneme k špeciálnemu štartovaciemu bajtu '0x42' if (s-> peek ()! = 0x42) {s-> read (); return false; }

// Teraz prečítajte všetkých 32 bajtov

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

// pripravte si kontrolný súčet

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

/* ladenie

pre (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (buffer , HEX); Serial.print (","); } Serial.println (); */ // Dáta prichádzajú v endian'd, čím sa to vyrieši, takže funguje na všetkých platformách uint16_t buffer_u16 [15]; pre (uint8_t i = 0; i <15; i ++) {buffer_u16 = buffer [2 + i*2 + 1]; buffer_u16 + = (buffer [2 + i*2] << 8); }

// daj to do peknej struktury:)

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

if (sum! = data.checksum) {

Serial.println ("Zlyhanie kontrolného súčtu"); return false; } // úspech! návrat true; }

// Previesť počet dní do žurnálu /! / La semaine začať bez dimanche

Reťazec donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; prípad 1: návrat „LUN“; prípad 2: návrat „MAR“; prípad 3: návrat „MER“; prípad 4: vrátiť „JEU“; prípad 5: vrátiť "VEN"; prípad 6: vrátiť "SAM"; predvolené: vrátiť ""; }}

// affiche la date et l'heure sur l'écran

neplatné affiche_date_heure (DateTime datetime) {// Date String jour = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + Reťazec (datetime.year (), DEC); // heure Reťazec heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());

Serial.print (jour); Serial.print (""); Serial.print (heure); //Serial.print (""); Údaje o súbore = 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);

oneskorenie (500);

}

// permet d'afficher les nombres sur deux chiffres

Reťazec Vers2Chiffres (počet bajtov) {String resultat = ""; if (nombre <10) resultat = "0"; vrátiť resultat += reťazec (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álezcu aplikácie MIT

Krok 4: VÝSLEDOK

tu je video s výsledkom

Odporúča: