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
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: