Sisukord:

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

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

Video: Tahkete osakeste reostuse õhukvaliteedi jälgimise süsteem: 4 sammu
Video: ⚠️ Оппозитный турбодизель Subaru: это просто мрак? 🤦‍♂️ Что с ним делать и как выбрать нормальный? 2024, November
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

Soovitan: