Sisukord:
- Tarvikud
- Samm: komponentide ühendamine
- Samm: raamatukogu ja Arduino programm
- Samm: programm MIT App Inventor 2
- 4. samm: TULEMUS
Video: Tahkete osakeste reostuse õhukvaliteedi jälgimise süsteem: 4 sammu
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:47
SISSE:
1 Selles projektis näitan, kuidas ehitada osakeste detektorit, millel on andmete kuvamine, andmete varundamine SD -kaardile ja IOT. Visuaalselt näitab neopikselite rõngasekraan õhukvaliteeti.
2 Õhu kvaliteet on tänapäeval üha olulisem probleem. tolmukiiruse mõõtmiseks on olemas süsteemid, kuid need on väga kallid. Nagu mõned uuringud on näidanud, on turul odavaid ja kvaliteetseid osakeste detektoreid.
näiteks:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Seetõttu otsustasin ehitada seadme, mis oleks võimeline mõõtma osakeste arvu suurusklasside järgi (0,5 µm kuni 10 µm), visuaalselt, lihtsa tulemuse kuvamisega (neopikslirõngas), üksikasjalikuma ekraaniga TFT -ekraanil ja ajatempliga varukoopia SD-kaardile.
4 Lisaks olen lisanud bluetooth -suhtlusmooduli, et saaksin androidrakendusega suhelda ja seega tulemused IOT -serveris avaldada.
5 Kogu maksumus ei ületa 60 €
Tarvikud
-Arduino uno R3
-Arduino proto kilp
-TFT ekraan ST7735
-Neopikselrõngas 24 led
-Plantower PMS5003
-HC-06 bluetooth moodul
Samm: komponentide ühendamine
erinevad komponendid on ühendatud vastavalt ülaltoodud skeemile
Samm: raamatukogu ja Arduino programm
1 raamatukogu
TFT -ekraani jaoks
github.com/adafruit/Adafruit-GFX-Library
neopikslite rõnga jaoks
github.com/adafruit/Adafruit_NeoPixel
sd -kaardi jaoks
github.com/arduino-libraries/SD
2 arduino visand
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #kaasake
// Milline Arduino tihvt on NeoPixelitega ühendatud?
#define PIN 6 // Trinketis või Gemmas soovitage see muuta 1 -ks
// Mitu NeoPikslit on Arduino külge kinnitatud?
#define NUMPIXELS 24 // Populaarne NeoPixeli rõnga suurus Adafruit_NeoPixel pikslid (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pikslid. Värv (0, 250, 0); uint32_t oranž = pikslid. Värv (250, 250, 0); uint32_t rouge = pikslid. Värv (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // saate selle ühendada ka Arduino lähtestamisega
#include // Põhigraafika kogu
#include // Riistvaraspetsiifiline raamatukogu #include #include const int cs_sd = 4; int temp; // temps d'acquisition double tempsInit; // Initialization du timer au démarrage du loop ()
#if määratletud (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// Valik 1: kasutage mis tahes tihvte, kuid veidi aeglasemalt
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Valik 2: peab kasutama riistvara SPI tihvte
// (UNO puhul on see sclk = 13 ja sid = 11) ja tihvt 10 peab olema // väljund. See on palju kiirem - vajalik ka siis, kui soovite // kasutada microSD -kaarti (vt pildi joonistamise näidet) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Initsialiseeri la liaison I2C Wire.begin (); // Initsialiseeri moodul RTC RTC.begin (); Serial.print ("init SD"); viivitus (1000); if (! SD.begin (cs_sd)) // Seisund verefiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); tagasipöördumine; } Serial.print ("Carte SD OK");
Faili andmed = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println ("Demarrage'i omandamine"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // lähtestada ST7735S kiip, must sakk Serial.println ("init"); // meie silumisväljund tft.fillScreen (ST7735_BLACK); // anduri edastuskiirus on 9600 pmsSerial.begin (9600);
pixels.begin (); // ALGATUS NeoPixel riba objekt (VAJALIK)
pixels.setBrightness (2);
}
structure pms5003data {
uint16_t framelen; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t osakesed_03um, osakesed_05um, osakesed_10um, osakesed_25um, osakesed_50um, osakesed_100um; uint16_t kasutamata; uint16_t kontrollsumma; };
struktuuri pms5003andmete andmed; void loop () {pixels.clear (); // Määra kõik pikslivärvid 'välja' DateTime now = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (praegu);
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 osad/ 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 (andmed.osakesed_03um); tft.print ("");
tft.setCursor (10, 29);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("0,5 um"); tft.print (andmed.osakesed_05um); tft.print ("");
tft.setCursor (10, 41);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("1,0 um"); tft.print (andmed.osakesed_10um); tft.print ("");
tft.setCursor (10, 53);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("2,5 um"); tft.print (andmed.osakesed_25um); tft.print ("");
tft.setCursor (10, 65);
tft.setTextColor (ST7735_GREEN, ST7735_BLACK); tft.setTextSize (1); tft.print ("5,0 um"); tft.print (andmed.osakesed_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 osad/ 0,1 l");
// Serial.print (temps);
// Seeria.print (""); Serial.print ("#"); Serial.print ("03µm"); Serial.print (andmed.osakesed_03um); Serial.print (""); Serial.print ("05µm"); Serial.print (andmed.osakesed_05um); Serial.print (""); Serial.print ("1µm"); Serial.print (andmed.osakesed_10um); Serial.print (""); Seeriatrükk ("25µm"); Serial.print (andmed.osakesed_25um); Serial.print (""); Seeriatrükk ("50µm"); Serial.print (andmed.osakesed_50um); Serial.print (""); Seeriatrükk ("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);
kui ((nombre_leds = 1)) {
pixels.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixels.fill (oranž, 8, ((nombre_leds) -8)); } muu, kui (nombre_leds> 16) {
pixels.fill (vert, 0, 8); pixels.fill (oranž, 8, 8); pixels.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Uuendatud pikslivärvide saatmine riistvarale.
// Définition données String PM03 = String (andmed.osakesed_03um); String PM05 = String (andmed.osakesed_05um); String PM10 = String (andmed.osakesed_10um); String PM25 = String (andmed.osakesed_25um); String PM50 = String (andmed.osakesed_50um); String PM100 = String (andmed.osakesed_100um); String PMS10 = String (andmed.pm10_standard); String PMS25 = String (andmed.pm25_standard); String PMS100 = String (andmed.pm100_standard); String Temps = String (temps);
// Ecriture des données dans le fichier texte
Faili andmed = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }
}
boolean readPMSdata (voog *) {
if (! s-> available ()) {return false; } // Lugege baiti korraga, kuni jõuame erilise '0x42' algusbaitini, kui (s-> peek ()! = 0x42) {s-> read (); tagastama vale; }
// Lugege nüüd kõiki 32 baiti
kui (s-> saadaval () readBytes (puhver, 32);
// saada kontrollsumma valmis
jaoks (uint8_t i = 0; i <30; i ++) {summa+= puhver ; }
/* silumine
jaoks (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (puhver , HEX); Serial.print (","); } Serial.println (); */ // Andmed tulevad endian'd, see lahendab selle, nii et see töötab kõigil platvormidel uint16_t buffer_u16 [15]; jaoks (uint8_t i = 0; i <15; i ++) {buffer_u16 = puhver [2 + i*2 + 1]; puhver_u16 + = (puhver [2 + i*2] << 8); }
// pane see kenasse struktuuri:)
memcpy ((tühine *) & andmed, (tühine *) puhver_u16, 30);
if (summa! = data.checksum) {
Serial.println ("Kontrollsumma rike"); tagastama vale; } // edu! tagastama tõene; }
// Konverteeri 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"; juhtum 1: tagastage "LUN"; juhtum 2: tagasta "MAR"; juhtum 3: tagastage "HTM"; juhtum 4: tagastada "JEU"; juhtum 5: tagastada "VEN"; juhtum 6: tagastage "SAM"; vaikimisi: tagasta ""; }}
// affiche la date et l'heure sur l'écran
void affiche_date_heure (DateTime datetime) {// Kuupäeva 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); //Seria.print (""); Faili andmed = 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 ("kuupäev"); 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);
viivitus (500);
}
// permet d'afficher les nombres sur deux chiffres
String Vers2Chiffres (bait nombre) {String tulemus = ""; if (nombre <10) resultat = "0"; return resultat += string (nombre, DEC); }
Samm: programm MIT App Inventor 2
see on MIT rakenduse leiutaja koodiplokk
4. samm: TULEMUS
siin on video tulemusest
Soovitan:
Raspberry Pi sisekliima jälgimise ja kontrollimise süsteem: 6 sammu
Raspberry Pi sisekliima jälgimise ja kontrollimise süsteem: inimesed tahavad oma majas mugavalt tunda. Kuna meie piirkonna kliima ei pruugi meile sobida, kasutame tervisliku sisekeskkonna säilitamiseks paljusid seadmeid: kütteseadet, õhujahutit, niisutajat, õhukuivatit, puhastit jne. Tänapäeval on see
Liidese Sensirion, SPS-30, tahkete osakeste andur Arduino Duemilanove abil, kasutades I2C režiimi: 5 sammu
Interfacing Sensirion, SPS-30, tahkete osakeste andur Arduino Duemilanove abil, kasutades I2C režiimi: Kui uurisin SPS30 andurite liidestamist, mõistsin, et enamik allikaid on mõeldud Raspberry Pi jaoks, kuid mitte nii palju Arduino jaoks. Kulutan natuke aega, et andur Arduinoga tööle saada, ja otsustasin oma kogemuse siia postitada, et see saaks
Õhukvaliteedi jälgimine osakeste footoniga: 11 sammu (piltidega)
Õhukvaliteedi jälgimine osakeste footonite abil: Selles projektis kasutatakse PPD42NJ tahkete osakeste andurit, et mõõta õhu kvaliteeti (PM 2,5) koos osakeste footoniga. See mitte ainult ei näita andmeid osakeste konsoolil ja dweet.io -l, vaid näitab ka õhukvaliteeti RGB LED -i abil, muutes seda
Tahkete osakeste õhukvaliteedi monitor: 7 sammu
Tahkete osakeste õhukvaliteedi monitor: Õhu kvaliteet. Arvatavasti mõtlete sellele nüüd rohkem, kui meie puhas õhk on muutunud taevalaotuses püsivaks uduseks. Yuck. Üks asi, mida saate kontrollida, on teie kodu õhukvaliteet. Selles õpetuses näitan teile, kuidas õhku ehitada
LoRa osakeste reostuse detektori loomine: 8 sammu
LoRa tahkete osakeste saasteanduri ehitamine: ehitame tahkete osakeste detektori, kasutades PM2.5 õhukvaliteedi andurit, ESP32, UNO ja LoRa moodulit. Tahkete osakeste saaste, mida tuntakse ka kui tahkete osakeste ainet, on õhus leiduvate laiaulatuslike tahkete ainete ja vedelike segu. Mõned neist p