Turinys:
- Prekės
- 1 žingsnis: komponentų prijungimas
- 2 veiksmas: biblioteka ir „Arduino“programa
- 3 žingsnis: programa „MIT App Inventor 2“
- 4 žingsnis: REZULTATAS
Video: Kietųjų dalelių užteršto oro kokybės stebėjimo sistema: 4 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:46
ĮVADAS:
1 Šiame projekte parodysiu, kaip sukurti dalelių detektorių su duomenų rodymu, duomenų atsargine kopija SD kortelėje ir IOT. Vizualiai neopikselių žiedo ekranas rodo oro kokybę.
2 Oro kokybė šiandien tampa vis svarbesniu susirūpinimu. Yra dulkių greičio matavimo sistemų, tačiau jos yra labai brangios. Rinkoje yra nebrangių, aukštos kokybės dalelių detektorių, kaip rodo kai kurie tyrimai.
pavyzdžiui:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Todėl nusprendžiau sukurti prietaisą, galintį išmatuoti dalelių skaičių pagal dydžių klases (0,5–10 µm), vizualiai, paprastai parodant rezultatą (neo pikselių žiedas), išsamesnį ekraną TFT ekrane ir atsarginę kopiją laiko kortelėje SD kortelėje.
4 Be to, pridėjau „Bluetooth“ryšio modulį, kad galėčiau bendrauti su „Android“programa ir taip paskelbti rezultatus IOT serveryje.
5 Bendra kaina neviršija 60 eurų
Prekės
-Arduino uno R3
-Arduino proto skydas
-TFT ekranas ST7735
-Neopikselio žiedas 24 led
-Plantower PMS5003
-HC-06 „Bluetooth“modulis
1 žingsnis: komponentų prijungimas
skirtingi komponentai yra prijungti pagal aukščiau pateiktą schemą
2 veiksmas: biblioteka ir „Arduino“programa
1 biblioteka
TFT ekranui
github.com/adafruit/Adafruit-GFX-Library
neo pikselių žiedui
github.com/adafruit/Adafruit_NeoPixel
už SD kortelę
github.com/arduino-libraries/SD
2 arduino eskizas
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le modul RTC RTC_DS1307 RTC; #įtraukti
// Kuris „Arduino“kaištis yra prijungtas prie „NeoPixels“?
#define PIN 6 // „Trinket“ar „Gemma“pasiūlykite tai pakeisti į 1
// Kiek „NeoPixels“pridedama prie „Arduino“?
#define NUMPIXELS 24 // Populiarus „NeoPixel“žiedo dydis „Adafruit_NeoPixel“pikseliai (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pikseliai. Spalva (0, 250, 0); uint32_t orange = pikseliai. Spalva (250, 250, 0); uint32_t rouge = pikseliai. Spalva (255, 0, 0);
SoftwareSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // tai taip pat galite prijungti prie „Arduino“atstatymo
#include // Pagrindinė grafikos biblioteka
#include // Techninės įrangos biblioteka #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // Initialization du timer au démarrage du loop ()
#if apibrėžta (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// 1 variantas: naudokite bet kokius kaiščius, bet šiek tiek lėčiau
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// 2 variantas: turi naudoti aparatinės įrangos SPI kaiščius
// (UNO atveju tai yra sclk = 13 ir sid = 11) ir 10 kaištis turi būti // išvestis. Tai daug greičiau - taip pat būtina, jei norite // naudoti „microSD“kortelę (žr. Paveikslėlio piešimo pavyzdį) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); plūdė nombre_leds = 0; void setup () {Serial.begin (9600); // Inicijuoti ryšį I2C Wire.begin (); // Inicijuoti modulį RTC RTC.begin (); Serial.print („init SD“); vėlavimas (1000); if (! SD.begin (cs_sd)) // Sąlyga kraujifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); grįžti; } Serial.print („Kartelės SD Gerai“);
Failo duomenys = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println („Demarrage“įsigijimas); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inicijuoti ST7735S mikroschemą, juodas skirtukas Serial.println ("init"); // mūsų derinimo išvestis tft.fillScreen (ST7735_BLACK); // jutiklio perdavimo sparta yra 9600 pmsSerial.begin (9600);
pixels.begin (); // INICIALIZUOTI „NeoPixel“juostelės objektą (BŪTINA)
pikseliai.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 dalelės_03um, dalelės_05um, dalelės_10um, dalelės_25um, dalelės_50um, dalelės_100um; uint16_t nenaudojamas; uint16_t kontrolinė suma; };
strukture pms5003data duomenys; void loop () {pixels.clear (); // Nustatykite visas pikselių spalvas kaip „išjungtas“DateTime now = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (dabar);
temps = ((milis () - tempsInit))/1000; // Démarrage du chrono
if (skaitytiPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("nbre dalys/ 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 dalys/ 0,1 l");
// Serial.print (temps);
// Serial.print (""); Serial.print ("#"); Serijinis atspaudas ("03µm"); Serial.print (data.particles_03um); Serial.print (""); Serijinis atspaudas ("05µm"); Serial.print (data.particles_05um); Serial.print (""); Serijinis atspaudas ("1µm"); Serial.print (data.particles_10um); Serial.print (""); Serijinis atspaudas ("25µm"); Serial.print (data.particles_25um); Serial.print (""); Serijinis atspaudas ("50µm"); Serial.print (data.particles_50um); Serial.print (""); Serijinis atspaudas ("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);
jei ((nombre_leds = 1)) {
pixels.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixels.fill (oranžinė, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {
pixels.fill (vert, 0, 8); pixels.fill (oranžinė, 8, 8); pixels.fill (raudona, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Siųskite atnaujintas pikselių spalvas į aparatūrą.
// Définition données String PM03 = String (data.particles_03um); Eilutė PM05 = Styga (data.particles_05um); Eilutė PM10 = Styga (duomenys.dalelės_10um); Eilutė PM25 = Styga (data.particles_25um); Eilutė PM50 = Styga (data.particles_50um); Eilutė PM100 = Styga (data.particles_100um); Styga PMS10 = Styga (data.pm10_standard); Styga PMS25 = Styga (data.pm25_standard); Styga PMS100 = Styga (data.pm100_standard); String Temps = Styga (temps);
// Ecriture des données dans le fichier texte
Failo duomenys = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }
}
loginis skaitymasPMSdata (srautas *s) {
if (! s-> available ()) {return false; } // Skaitykite baitą vienu metu, kol pateksime į specialų '0x42' pradžios baitą, jei (s-> peek ()! = 0x42) {s-> read (); grąžinti klaidingą; }
// Dabar perskaitykite visus 32 baitus
jei (s-> prieinamas () readBytes (buferis, 32);
// paruoškite kontrolinę sumą
už (uint8_t i = 0; i <30; i ++) {suma+= buferis ; }
/* derinimas
for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serijinis atspaudas (buferis , HEX); Serial.print (","); } Serial.println (); */ // Duomenys pateikiami endian'd, tai išsprendžia juos, todėl jie veikia visose platformose uint16_t buffer_u16 [15]; (uint8_t i = 0; i <15; i ++) {buffer_u16 = buferis [2 + i*2 + 1]; buferis_u16 + = (buferis [2 + i*2] << 8); }
// sudėti į gražią struktūrą:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
if (suma! = data.checksum) {
Serial.println („Kontrolinės sumos gedimas“); grąžinti klaidingą; } // sėkmė! grįžti tiesa; }
// Konvertuoti le numéro de jour en jour /! / La semaine commence un dimanche
Styga donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; 1 atvejis: grąžinkite „LUN“; 2 atvejis: grąžinti „MAR“; 3 atvejis: grąžinti „MER“; 4 atvejis: grąžinti „JEU“; 5 atvejis: grąžinti „VEN“; 6 atvejis: grąžinkite „SAM“; numatytasis: grąžinti ""; }}
// 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 ()) + "/" + Styga (datetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());
Serial.print (jour); Serial.print (""); Serial.print (heure); // Serijos.spaudas (""); Failo duomenys = 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 ("data"); 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);
vėlavimas (500);
}
// permet d'afficher les nombres sur deux chiffres
Styginė Vers2Chiffres (baitų nombre) {Stygos rezultatas = ""; if (nombre <10) resultat = "0"; return resultat += Styga (nombre, DEC); }
3 žingsnis: programa „MIT App Inventor 2“
tai yra MIT programos išradėjo kodo blokas
4 žingsnis: REZULTATAS
čia yra vaizdo įrašas apie rezultatą
Rekomenduojamas:
IOT pagrįsta išmanioji oro ir vėjo greičio stebėjimo sistema: 8 žingsniai
IOT pagrįsta išmanioji oro ir vėjo greičio stebėjimo sistema: sukūrė - Nikhil Chudasma, Dhanashri Mudliar ir Ashita Raj Įvadas Orų stebėjimo svarba egzistuoja įvairiais būdais. Norint išlaikyti žemės ūkio, šiltnamio plėtrą, reikia stebėti oro parametrus
Sąsajos jutiklis, SPS-30, kietųjų dalelių jutiklis su „Arduino Duemilanove“naudojant I2C režimą: 5 žingsniai
Sąsajos „Sensirion“, SPS-30, kietųjų dalelių jutiklis su „Arduino Duemilanove“naudojant I2C režimą: Kai nagrinėjau SPS30 jutiklių sąsajas, supratau, kad dauguma šaltinių yra skirti „Raspberry Pi“, bet ne tiek daug „Arduino“. Aš skiriu šiek tiek laiko, kad jutiklis veiktų su „Arduino“, ir nusprendžiau čia paskelbti savo patirtį, kad ji galėtų
Oro stebėjimo sistema naudojant „NodeMCU“ir „IOT Thingspeak“: 4 žingsniai
Oro stebėjimo sistema naudojant „NodeMCU“ir „IOT Thingspeak“: „ThingSpeak“yra atvirojo kodo daiktų interneto programa ir API, skirta saugoti ir gauti duomenis iš aparatūros įrenginių ir jutiklių. Bendravimui jis naudoja HTTP protokolą internetu arba LAN. Įtraukta MATLAB analizė, skirta analizuoti ir vizualizuoti
Oro kokybės stebėjimas naudojant dalelių fotoną: 11 žingsnių (su nuotraukomis)
Oro kokybės stebėjimas naudojant dalelių fotoną: Šiame projekte PPD42NJ dalelių jutiklis naudojamas matuoti oro kokybę (PM 2,5), esančią ore su dalelių fotonu. Jis ne tik rodo duomenis dalelių konsolėje ir dweet.io, bet ir rodo oro kokybę naudojant RGB šviesos diodą, jį pakeičiant
Dalelių varomas oro kokybės monitorius: 7 žingsniai
Dalelių varomas oro kokybės monitorius: Oro kokybė. Tikriausiai apie tai galvojate dabar, kai mūsų švarus oras danguje virto nuolatine migla. Džiugu. Vienas dalykas, kurį galite kontroliuoti, yra oro kokybė jūsų namuose. Šioje pamokoje aš jums parodysiu, kaip sukurti orą