Kazalo:

Sistem za spremljanje kakovosti zraka za onesnaževanje z delci: 4 koraki
Sistem za spremljanje kakovosti zraka za onesnaževanje z delci: 4 koraki

Video: Sistem za spremljanje kakovosti zraka za onesnaževanje z delci: 4 koraki

Video: Sistem za spremljanje kakovosti zraka za onesnaževanje z delci: 4 koraki
Video: Meeting #5 - 4/29/2022 | ETF team meeting and dialogue 2024, Julij
Anonim
Sistem za spremljanje kakovosti zraka za onesnaževanje z delci
Sistem za spremljanje kakovosti zraka za onesnaževanje z delci
Sistem za spremljanje kakovosti zraka za onesnaževanje z delci
Sistem za spremljanje kakovosti zraka za onesnaževanje z delci

INTRO:

1 V tem projektu sem pokazal, kako zgraditi detektor delcev s prikazom podatkov, varnostno kopijo podatkov na kartici SD in IOT. Vizualno neopiksni prstan prikazuje kakovost zraka.

2 Kakovost zraka je danes vse pomembnejša skrb. obstajajo sistemi za merjenje stopnje prahu, vendar so zelo dragi. Na trgu so poceni in kakovostni detektorji delcev, kar kažejo nekatere študije.

na primer:

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

3 Zato sem se odločil za izdelavo naprave, ki bi lahko merila število delcev po velikostnih razredih (0,5 µm do 10 µm), vizualno s preprostim prikazom rezultata (neo pikselni obroč), podrobnejšim prikazom na zaslonu TFT in časovno označena varnostna kopija na kartici SD.

4 Poleg tega sem dodal komunikacijski modul bluetooth, s katerim lahko komuniciram z aplikacijo android in tako objavim rezultate na strežniku IOT.

5 Skupni stroški celote ne presegajo 60 €

Zaloge

-Arduino uno R3

-Arduino proto ščit

-TFT zaslon ST7735

-Neopixel obroč 24 led

-Plantower PMS5003

-HC-06 modul bluetooth

1. korak: Povezovanje komponent

Priključitev komponent
Priključitev komponent

različne komponente so povezane v skladu z zgornjim diagramom

2. korak: Knjižnica in program Arduino

1 knjižnica

za zaslon TFT

github.com/adafruit/Adafruit-GFX-Library

za neo piksel obroč

github.com/adafruit/Adafruit_NeoPixel

za sd kartico

github.com/arduino-libraries/SD

2 skica arduino

#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #vključi

// Kateri pin na Arduinu je povezan z NeoPixels?

#define PIN 6 // Pri Trinket ali Gemma predlagajte, da to spremenite v 1

// Koliko NeoPixels je priključenih na Arduino?

#define NUMPIXELS 24 // Priljubljena velikost obroča NeoPixel Adafruit_NeoPixel slikovnih pik (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = slikovne pike. Barva (0, 250, 0); uint32_t oranžna = slikovnih pik. Barva (250, 250, 0); uint32_t rouge = slikovne pike. Barva (255, 0, 0);

Programska opremaSerial pmsSerial (2, 3);

#define cs 10 #define dc 9 #define rst 8 // to lahko povežete tudi s ponastavitvijo Arduina

#include // Osnovna grafična knjižnica

#include // Strojna knjižnica #include #include const int cs_sd = 4; int temps; // temps d'acquisition double tempsInit; // inicializacija du timer au démarrage du loop ()

#if definirano (_ SAM3X8E_)

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

// 1. možnost: uporabite vse zatiče, vendar nekoliko počasneje

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

// Možnost 2: uporabiti morate zatiče strojne opreme SPI

// (za UNO je to sclk = 13 in sid = 11) in pin 10 mora biti // izhod. To je veliko hitreje - potrebno tudi, če želite // uporabljati kartico microSD (glejte primer risbe slike) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Začetek povezave I2C Wire.begin (); // Inicializiramo modul RTC RTC.begin (); Serial.print ("init SD"); zamuda (1000); if (! SD.begin (cs_sd)) // Pogoj preverjen s SD kartico est présente dans l'appareil {Serial.print ("Privzeta SD"); vrnitev; } Serial.print ("Carte SD OK");

Datotečni podatki = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"

data.println (""); data.println ("pridobitev Démarragea"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // inicializiramo čip ST7735S, črni zavihek Serial.println ("init"); // naš izhod za odpravljanje napak tft.fillScreen (ST7735_BLACK); // hitrost prenosa senzorja je 9600 pmsSerial.begin (9600);

pixels.begin (); // INICIALIZE NeoPixel strip object (POTREBNO)

pixels.setBrightness (2);

}

struct pms5003data {

uint16_t framelen; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t delci_03um, delci_05um, delci_10um, delci_25um, delci_50um, delci_100um; uint16_t neuporabljeno; uint16_t kontrolna vsota; };

podatkovni podatki struct pms5003; void loop () {pixels.clear (); // Zdaj nastavite vse barve slikovnih pik na 'off' DateTime = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (zdaj);

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 deli/ 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 ("PM 1.0"); 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 deli/ 0,1 l");

// Serial.print (temps);

// Serial.print (""); Serial.print ("#"); Serial.print ("03µm"); Serial.print (data.particles_03um); Serial.print (""); Serial.print ("05µm"); Serial.print (data.particles_05um); Serial.print (""); Serial.print ("1 μm"); Serial.print (data.particles_10um); Serial.print (""); Serial.print ("25µm"); Serial.print (data.particles_25um); Serial.print (""); Serial.print ("50 µm"); Serial.print (data.particles_50um); Serial.print (""); Serial.print ("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);

if ((nombre_leds = 1)) {

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

pikslov.fill (vert, 0, 8); pikslov.polnilo (oranžno, 8, 8); pixels.fill (rouge, 16, (((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pikslov.show (); // Pošlji posodobljene barve slikovnih pik strojni opremi.

// Opredelitev données String PM03 = String (data.particles_03um); Niz PM05 = Niz (data.particles_05um); Niz PM10 = Niz (data.particles_10um); Niz PM25 = Niz (data.particles_25um); Niz PM50 = Niz (data.particles_50um); Niz PM100 = Niz (podatki.delcev_100um); Niz PMS10 = Niz (data.pm10_standard); Niz PMS25 = Niz (data.pm25_standard); Niz PMS100 = Niz (data.pm100_standard); String Temps = niz (temps);

// Ecriture des données dans le fichier texte

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

}

boolean readPMSdata (tok *s) {

if (! s-> available ()) {return false; } // Beremo po en bajt, dokler ne pridemo do posebnega začetnega bajta '0x42' if (s-> peek ()! = 0x42) {s-> read (); return false; }

// Zdaj preberite vseh 32 bajtov

če (s-> na voljo () readBytes (medpomnilnik, 32);

// pripravimo kontrolno vsoto

za (uint8_t i = 0; i <30; i ++) {vsota+= pufer ; }

/* odpravljanje napak

for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (vmesnik , HEX); Serial.print (","); } Serial.println (); */ // Podatki so v endian'd -u, to jih reši, tako da deluje na vseh platformah uint16_t buffer_u16 [15]; for (uint8_t i = 0; i <15; i ++) {buffer_u16 = medpomnilnik [2 + i*2 + 1]; medpomnilnik_u16 + = (medpomnilnik [2 + i*2] << 8); }

// damo v lepo strukturo:)

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

if (vsota! = data.checksum) {

Serial.println ("Napaka kontrolne vsote"); return false; } // uspeh! vrni true; }

// Converti le numéro de jour en jour /! / La semaine begin un dimanche

Niz donne_jour_semaine (uint8_t j) {stikalo (j) {primer 0: vrne "DIM"; primer 1: vrnite "LUN"; primer 2: vrnitev "MAR"; primer 3: vrnite "MER"; primer 4: vrnite "JEU"; primer 5: vrnite "VEN"; primer 6: vrnite "SAM"; privzeto: return ""; }}

// 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 ()) + "/" + Niz (datetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());

Serial.print (jour); Serial.print (""); Serial.print (heure); //Serial.print (""); Datotečni podatki = 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 ("datum"); 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);

zamuda (500);

}

// permet d'afficher les nombres sur deux chiffres

Niz Vers2Chiffres (število bajtov) {String resultat = ""; if (nombre <10) resultat = "0"; povratni rezultat += niz (nombre, DEC); }

3. korak: Program MIT App Inventor 2

Program MIT App Inventor 2
Program MIT App Inventor 2

to je kodni blok izumitelja aplikacij MIT

4. korak: REZULTAT

tukaj je videoposnetek rezultata

Priporočena: