Tahkete osakeste reostuse õhukvaliteedi jälgimise süsteem: 4 sammu
Tahkete osakeste reostuse õhukvaliteedi jälgimise süsteem: 4 sammu
Anonim
Tahkete osakeste reostuse õhukvaliteedi jälgimise süsteem
Tahkete osakeste reostuse õhukvaliteedi jälgimise süsteem
Tahkete osakeste reostuse õhukvaliteedi jälgimise süsteem
Tahkete osakeste reostuse õhukvaliteedi jälgimise süsteem

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

Komponentide ühendamine
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

Programm MIT App Inventor 2
Programm MIT App Inventor 2

see on MIT rakenduse leiutaja koodiplokk

4. samm: TULEMUS

siin on video tulemusest