Satura rādītājs:

Daļiņu piesārņojuma gaisa kvalitātes uzraudzības sistēma: 4 soļi
Daļiņu piesārņojuma gaisa kvalitātes uzraudzības sistēma: 4 soļi

Video: Daļiņu piesārņojuma gaisa kvalitātes uzraudzības sistēma: 4 soļi

Video: Daļiņu piesārņojuma gaisa kvalitātes uzraudzības sistēma: 4 soļi
Video: Air Pollution 2024, Jūlijs
Anonim
Daļiņu piesārņojuma gaisa kvalitātes uzraudzības sistēma
Daļiņu piesārņojuma gaisa kvalitātes uzraudzības sistēma
Daļiņu piesārņojuma gaisa kvalitātes uzraudzības sistēma
Daļiņu piesārņojuma gaisa kvalitātes uzraudzības sistēma

IEVADS:

1 Šajā projektā es parādīšu, kā izveidot daļiņu detektoru ar datu displeju, datu dublēšanu SD kartē un IOT. Vizuāli neopikseļu gredzena displejs norāda uz gaisa kvalitāti.

2 Gaisa kvalitāte mūsdienās kļūst arvien svarīgāka. Ir sistēmas putekļu daudzuma mērīšanai, taču tās ir ļoti dārgas. Tirgū ir lēti, augstas kvalitātes daļiņu detektori, kā liecina daži pētījumi.

piemēram:

www.atmos-meas-tech.net/11/4823/2018/amt-1…

3 Tāpēc es nolēmu izveidot ierīci, kas spēj izmērīt daļiņu skaitu pēc izmēru klasēm (no 0,5 µm līdz 10 µm), vizuāli ar vienkāršu rezultāta parādīšanu (neo pikseļu gredzens), detalizētāku displeju TFT ekrānā un dublējums ar laika zīmogu SD kartē.

4 Turklāt esmu pievienojis Bluetooth sakaru moduli, lai varētu sazināties ar android lietojumprogrammu un tādējādi publicēt rezultātus IOT serverī.

5 Kopējās izmaksas nepārsniedz 60 €

Piegādes

-Arduino uno R3

-Arduino proto vairogs

-TFT ekrāns ST7735

-Neopikselu gredzens 24 led

-Plantower PMS5003

-HC-06 Bluetooth modulis

1. darbība: komponentu savienošana

Komponentu savienošana
Komponentu savienošana

dažādas sastāvdaļas ir savienotas saskaņā ar iepriekš redzamo diagrammu

2. darbība: bibliotēka un Arduino programma

1 bibliotēka

TFT ekrānam

github.com/adafruit/Adafruit-GFX-Library

neo pikseļu gredzenam

github.com/adafruit/Adafruit_NeoPixel

par SD karti

github.com/arduino-libraries/SD

2 arduino skice

#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #iekļaut

// Kura Arduino tapa ir savienota ar NeoPixels?

#define PIN 6 // Vietnē Trinket vai Gemma ieteicams to mainīt uz 1

// Cik NeoPikseļu ir pievienoti Arduino?

#define NUMPIXELS 24 // Populārs NeoPixel gredzena izmērs Adafruit_NeoPixel pikseļi (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = pikseļi. Krāsa (0, 250, 0); uint32_t oranžs = pikseļi. Krāsa (250, 250, 0); uint32_t rouge = pikseļi. Krāsa (255, 0, 0);

SoftwareSerial pmsSerial (2, 3);

#define cs 10 #define dc 9 #define rst 8 // varat to savienot arī ar Arduino atiestatīšanu

#include // Galvenā grafikas bibliotēka

#include // Aparatūrai specifiska bibliotēka #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // Initialization du timer au démarrage du loop ()

#if definēts (_ SAM3X8E_)

#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif

// 1. iespēja: izmantojiet jebkuras tapas, bet nedaudz lēnāk

// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);

// 2. iespēja: jāizmanto aparatūras SPI tapas

// (UNO gadījumā tas ir sclk = 13 un sid = 11) un tapai 10 jābūt // izvadei. Tas ir daudz ātrāk - nepieciešams arī, ja vēlaties // izmantot microSD karti (skatiet attēla zīmēšanas piemēru) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); pludiņš nombre_leds = 0; void setup () {Serial.begin (9600); // Initialise la liaison I2C Wire.begin (); // Inicializēt le moduli RTC RTC.begin (); Serial.print ("init SD"); kavēšanās (1000); if (! SD.begin (cs_sd)) // Nosacījums asinsspiediens si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); atgriešanās; } Serial.print ("Kartes SD OK");

Failu dati = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"

data.println (""); data.println ("Demarāžas iegāde"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inicializēt ST7735S mikroshēmu, melna cilne Serial.println ("init"); // mūsu atkļūdošanas izvade tft.fillScreen (ST7735_BLACK); // sensora pārraides ātrums ir 9600 pmsSerial.begin (9600);

pikseļi.sākas (); // UZSĀKT NeoPixel sloksnes objektu (OBLIGĀTS)

pikseļi.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 daļiņas_03um, daļiņas_05um, daļiņas_10um, daļiņas_25um, daļiņas_50um, daļiņas_100um; uint16_t neizmantots; uint16_t kontrolsumma; };

struk pms5003datu dati; void loop () {pixels.clear (); // Iestatiet visas pikseļu krāsas uz 'izslēgts' DateTime now = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (tagad);

temps = ((milis () - tempsInit))/1000; // Démarrage du chrono

if (readPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("nbre daļas/ 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 daļas/ 0,1 l");

// Serial.print (temps);

// Serial.print (""); Serial.print ("#"); Sērijas nospiedums ("03µm"); Sērijas nospiedums (data.particles_03um); Serial.print (""); Sērijas nospiedums ("05µm"); Sērijas nospiedums (data.particles_05um); Serial.print (""); Sērijas nospiedums ("1µm"); Sērijas nospiedums (data.particles_10um); Serial.print (""); Sērijas nospiedums ("25µm"); Sērijas nospiedums (data.particles_25um); Serial.print (""); Sērijas nospiedums ("50µm"); Sērijas nospiedums (data.particles_50um); Serial.print (""); Sērijas nospiedums ("100µm"); Sērijas nospiedums (data.particles_100um); Serial.println (""); nombre_leds = int (((float (data.particles_03um)/65535)*24)); // nombre_leds = (8); Serial.println (nombre_leds);

ja ((nombre_leds = 1)) {

pixels.fill (vert, 0, nombre_leds); } cits if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixels.fill (oranža, 8, ((nombre_leds) -8)); } cits if (nombre_leds> 16) {

pixels.fill (vert, 0, 8); pixels.fill (oranžs, 8, 8); pixels.fill (sarkans, 16, ((nombre_leds) -16)); } cits if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Nosūtiet aparatūrai atjauninātās pikseļu krāsas.

// Définition données String PM03 = String (data.particles_03um); String PM05 = String (data.particles_05um); String PM10 = String (data.particles_10um); String PM25 = String (data.particles_25um); String PM50 = String (data.particles_50um); String PM100 = String (data.particles_100um); String PMS10 = String (data.pm10_standard); String PMS25 = String (data.pm25_standard); String PMS100 = String (data.pm100_standard); String Temps = String (temps);

// Ecriture des données dans le fichier texte

Failu dati = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }

}

Būla lasījumsPMSdata (straume *s) {

ja (! s-> pieejams ()) {return false; } // Lasiet baitu vienlaikus, līdz nonākam pie īpašā '0x42' sākuma baita, ja (s-> peek ()! = 0x42) {s-> read (); atgriezt nepatiesu; }

// Tagad izlasiet visus 32 baitus

ja (s-> pieejams () readBytes (buferis, 32);

// sagatavojiet kontrolsummu

par (uint8_t i = 0; i <30; i ++) {summa+= buferšķīdums ; }

/* atkļūdošana

par (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Sērijas nospiedums (buferis , HEX); Serial.print (","); } Sērijas.println (); */ // Dati tiek ievadīti endian'd, tas to atrisina, tāpēc tas darbojas visās platformās uint16_t buffer_u16 [15]; par (uint8_t i = 0; i <15; i ++) {buffer_u16 = buferis [2 + i*2 + 1]; buferis_u16 + = (buferis [2 + i*2] << 8); }

// salieciet to jaukā struktūrā:)

memcpy ((void *) & data, (void *) buffer_u16, 30);

ja (summa! = data.checksum) {

Serial.println ("Kontrolsummas kļūme"); atgriezt nepatiesu; } // veiksmi! atgriezties patiesi; }

// Converti 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"; 1. gadījums: atgriezt "LUN"; 2. gadījums: atgriezt "MAR"; 3. gadījums: atdot "MER"; 4. gadījums: atgriezt "JEU"; 5. gadījums: atgriezt "VEN"; 6. gadījums: atgriezt "SAM"; noklusējums: atgriezt ""; }}

// affiche la date et l'heure sur l'écran

void affiche_date_heure (DateTime datetime) {// Datuma virkne 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 ());

Sērijas nospiedums (ceļojums); Serial.print (""); Sērijas nospiedums (heure); //Serial.print (""); Failu dati = 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 ("datums"); 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);

kavēšanās (500);

}

// permet d'afficher les nombres sur deux chiffres

String Vers2Chiffres (baitu nombre) {String resultat = ""; ja (nombre <10) resultat = "0"; atgriešanās rezultāts += virkne (nombre, DEC); }

3. darbība: programma MIT App Inventor 2

Programma MIT App Inventor 2
Programma MIT App Inventor 2

tas ir MIT lietotnes izgudrotāja koda bloks

4. solis: REZULTĀTS

šeit ir video par rezultātu

Ieteicams: