Turinys:

Kietųjų dalelių užteršto oro kokybės stebėjimo sistema: 4 žingsniai
Kietųjų dalelių užteršto oro kokybės stebėjimo sistema: 4 žingsniai

Video: Kietųjų dalelių užteršto oro kokybės stebėjimo sistema: 4 žingsniai

Video: Kietųjų dalelių užteršto oro kokybės stebėjimo sistema: 4 žingsniai
Video: Oras, kuriuo kvėpuojame. 2024, Liepa
Anonim
Kietųjų dalelių užteršto oro kokybės stebėjimo sistema
Kietųjų dalelių užteršto oro kokybės stebėjimo sistema
Kietųjų dalelių taršos oro kokybės stebėjimo sistema
Kietųjų dalelių taršos oro kokybės stebėjimo sistema

Į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

Komponentų prijungimas
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“

Programa „MIT App Inventor 2“
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: