Obsah:
- Zásoby
- Krok 1: Připojení komponent
- Krok 2: Knihovna a program Arduino
- Krok 3: Program MIT App Inventor 2
- Krok 4: VÝSLEDEK
Video: Systém monitorování kvality ovzduší pro znečištění částicemi: 4 kroky
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:21
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
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
toto je blok kódu vynálezce aplikace MIT
Krok 4: VÝSLEDEK
zde je video s výsledkem
Doporučuje:
Detekce znečištění ovzduší + filtrace vzduchu: 4 kroky
Detekce znečištění ovzduší + filtrace vzduchu: Studenti (Aristobulus Lam, Victor Sim, Nathan Rosenzweig a Declan Loges) z German Swiss International School spolupracovali s pracovníky společnosti MakerBay na vytvoření integrovaného systému měření znečištění ovzduší a účinnosti filtrace vzduchu. Tento
Monitorování kvality ovzduší pomocí fotonu částic: 11 kroků (s obrázky)
Monitorování kvality ovzduší pomocí částicového fotonu: V tomto projektu je senzor částic PPD42NJ používán k měření kvality vzduchu (PM 2,5) přítomné ve vzduchu pomocí částicového fotonu. Nejenže zobrazuje data na konzole Particle a dweet.io, ale také mění kvalitu vzduchu pomocí RGB LED změnou
AirCitizen - monitorování kvality ovzduší: 11 kroků (s obrázky)
AirCitizen - Monitorování kvality ovzduší: Ahoj všichni! Dnes vás naučíme reprodukovat náš projekt: AirCitizen týmem AirCitizenPolytech!-Pocházíte z 'OpenAir / Jaký je váš vzduch?' Projekty, projekt AirCitizen, má za cíl umožnit občanům aktivně hodnotit kvalitu
Postavte detektor znečištění částicemi LoRa: 8 kroků
Postavte detektor znečištění částicemi LoRa: Postavíme detektor pevných částic pomocí senzoru kvality vzduchu PM2.5, modulu ESP32, UNO a LoRa. Částicové znečištění, také známé jako částicová hmota, je směsí různých velikostí pevných látek a kapalin nacházejících se ve vzduchu. Některé z těchto p
Monitorování znečištění ovzduší - IoT-Data Viz-ML: 3 kroky (s obrázky)
Monitorování znečištění ovzduší | IoT-Data Viz-ML: Jedná se tedy v podstatě o kompletní aplikaci IoT, která obsahuje hardwarovou i softwarovou část. V tomto tutoriálu uvidíte, jak nastavit zařízení IoT a jak ho monitorovat různé druhy znečišťujících plynů přítomných ve vzduchu