Բովանդակություն:

Մասնիկների կեղտոտման համար օդի որակի վերահսկման համակարգ `4 քայլ
Մասնիկների կեղտոտման համար օդի որակի վերահսկման համակարգ `4 քայլ

Video: Մասնիկների կեղտոտման համար օդի որակի վերահսկման համակարգ `4 քայլ

Video: Մասնիկների կեղտոտման համար օդի որակի վերահսկման համակարգ `4 քայլ
Video: Deutsch Lernen mit Dialogen B2 2024, Հուլիսի
Anonim
Մանր մասնիկներով աղտոտման համար օդի որակի վերահսկման համակարգ
Մանր մասնիկներով աղտոտման համար օդի որակի վերահսկման համակարգ
Մանր մասնիկներով աղտոտման համար օդի որակի վերահսկման համակարգ
Մանր մասնիկներով աղտոտման համար օդի որակի վերահսկման համակարգ

ՆԵՐԱՈԹՅՈՆ:

1 Այս նախագծում ես ցույց եմ տալիս, թե ինչպես կարելի է կառուցել մասնիկների դետեկտոր `տվյալների ցուցադրմամբ, տվյալների պահուստավորում SD քարտի և IOT- ի միջոցով: Տեսողականորեն neopixels- ի մատանի էկրանը ցույց է տալիս օդի որակը:

2 Օդի որակը այսօր ավելի ու ավելի է մտահոգում: կան փոշու մակարդակը չափելու համակարգեր, բայց դրանք շատ թանկ են: Շուկայում կան էժան, բարձրորակ մասնիկների դետեկտորներ, ինչպես ցույց են տվել որոշ ուսումնասիրություններ:

օրինակ:

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

3 Հետևաբար, ես որոշեցի կառուցել մի սարք, որը կարող է չափել մասնիկների քանակը ըստ չափերի դասերի (0.5 մկմ մինչև 10 մկմ), տեսողականորեն արդյունքի պարզ ցուցադրմամբ (neo պիքսելային մատանի), ավելի մանրամասն ցուցադրում TFT էկրանին և ժամանակին կնքված պահուստավորում SD քարտի վրա:

4 Բացի այդ, ես ավելացրել եմ bluetooth հաղորդակցության մոդուլ, որպեսզի կարողանամ շփվել android հավելվածի հետ և դրանով իսկ արդյունքները հրապարակել IOT սերվերի վրա:

5 Ամբողջական ընդհանուր արժեքը չի գերազանցում 60 € -ը

Պարագաներ

-Ardduino uno R3

-Ardduino նախատիպի վահան

-TFT էկրան ST7735

-Նեոպիքսել մատանի 24 լեդ

-Plantower PMS5003

-HC-06 bluetooth մոդուլ

Քայլ 1: Բաղադրիչների միացում

Բաղադրիչների միացում
Բաղադրիչների միացում

տարբեր բաղադրիչները միացված են ըստ վերևի դիագրամի

Քայլ 2. Գրադարան և Arduino ծրագիր

1 գրադարանը

TFT էկրանի համար

github.com/adafruit/Adafruit-GFX-Library

neo pixel մատանու համար

github.com/adafruit/Adafruit_NeoPixel

sd քարտի համար

github.com/arduino-libraries/SD

2 arduino ուրվագիծը

#ներառել #ներառել // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #ներառում

// Arduino- ի ո՞ր քորոցը միացված է NeoPixels- ին:

#սահմանեք PIN 6 // Trinket- ում կամ Gemma- ում, առաջարկեք փոխել այն 1 -ի

// Քանի՞ NeoPixel է կցված Arduino- ին:

#սահմանել NUMPIXELS 24 // Հանրաճանաչ NeoPixel մատանի չափը Adafruit_NeoPixel պիքսել (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = պիքսել: Գույն (0, 250, 0); uint32_t նարնջագույն = պիքսել: Գույն (250, 250, 0); uint32_t rouge = պիքսել: Գույն (255, 0, 0);

Softwareրագրային ապահովումՍերիալ pmsSerial (2, 3);

#սահմանել cs 10 #սահմանել dc 9 #սահմանել առաջին 8 // սա կարող եք նաև միացնել Arduino- ի վերակայմանը

#ներառել // Հիմնական գրաֆիկական գրադարան

#ներառել // Սարքավորման համար հատուկ գրադարան #ներառել #ներառել const int cs_sd = 4; int ջերմաստիճան; // temps d'acquisition կրկնակի tempsInit; // initialisation du timer au démarrage du loop ()

#եթե սահմանված է (_ SAM3X8E_)

#undef _FlashStringHelper:: F (string_literal) #սահմանել F (string_literal) string_literal #endif

// Տարբերակ 1. Օգտագործեք ցանկացած կապում, բայց մի փոքր ավելի դանդաղ

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

// Տարբերակ 2. Պետք է օգտագործել ապարատային SPI կապում

// (UNO- ի համար դա sclk = 13 և sid = 11) և 10 -րդ կապը պետք է լինեն // ելք: Սա շատ ավելի արագ է. Նաև պահանջվում է, եթե ցանկանում եք // օգտագործել microSD քարտը (տես նկարի գծագրության օրինակը) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // Initialise la liaison I2C Wire.begin (); // Initialise le module RTC RTC. սկսել (); Serial.print ("init SD"); ուշացում (1000); եթե (! SD.begin (cs_sd)) // Պայման vérifiant si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); վերադարձ; } Serial.print ("Carte SD OK");

Ֆայլի տվյալներ = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"

data.println (""); data.println («Démarrage ձեռքբերում»); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // սկզբնականացնել ST7735S չիպ, սև ներդիր Serial.println («init»); // մեր վրիպազերծման ելքը tft.fillScreen (ST7735_BLACK); // սենսորային բաուդ արագությունը 9600 pmsSerial.begin (9600);

pixels.begin (); // ՍԿՍԵԼՆԵԼ NeoPixel շերտի օբյեկտ (ՊԱՐՏԱԴԻՐ)

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 մասնիկներ_03um, մասնիկներ_05um, մասնիկներ_10um, մասնիկներ_25um, մասնիկներ_50um, մասնիկներ_100um; uint16_t չօգտագործված; uint16_t ստուգիչ գումար; };

struct pms5003 տվյալների տվյալները; void loop () {pixels.clear (); // Բոլոր պիքսելային գույները սահմանել «անջատված» DateTime now = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (այժմ);

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

if (կարդալPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("nbre մասեր/ 0.1 լ");

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.ft միկրոգ/մ 3 »);

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 մասեր/ 0.1 լ");

// 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 մկմ»); Serial.print (data.particles_100um); Serial.println (""); nombre_leds = int (((float (data.particles_03um)/65535)*24)); // nombre_leds = (8); Serial.println (nombre_leds);

եթե ((nombre_leds = 1)) {

pixels.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixels.fill (նարնջագույն, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {

pixels.fill (vert, 0, 8); պիքսելներ. լրացնել (նարնջագույն, 8, 8); pixels.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } pixels.show (); // Ուղարկեք պիքսելների թարմացված գույները ապարատին:

// Définition données String PM03 = Լար (data.particles_03um); Լար PM05 = Լար (data.particles_05um); Լարային PM10 = լարային (data.particles_10um); Լարային PM25 = լարային (data.particles_25um); Լարային PM50 = լարային (data.particles_50um); Լար PM100 = Լար (data.particles_100um); Լարային PMS10 = Լարային (data.pm10_standard); Լարային PMS25 = Լարային (data.pm25_standard); Լարային PMS100 = Լարային (data.pm100_standard); Լարային ջերմաստիճան = Լար (տեմպեր);

// Ecriture des données dans le fichier texte

Ֆայլի տվյալներ = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }

}

բուլյան ընթերցում PMS տվյալներ (հոսք *ներ) {

եթե (! s-> մատչելի ()) {վերադարձը կեղծ է; } // Միաժամանակ կարդացեք բայթ, մինչև չհասնենք «0x42» հատուկ մեկնարկային բայթին, եթե (s-> նայել ()! = 0x42) {s-> կարդալ (); վերադարձնել կեղծ; }

// Այժմ կարդացեք բոլոր 32 բայթերը

if (s-> հասանելի () readBytes (բուֆեր, 32);

// պատրաստեք ստուգման գումարը

for (uint8_t i = 0; i <30; i ++) {sum+= բուֆեր ; }

/* կարգաբերում

for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (բուֆեր , HEX); Serial.print (","); } Serial.println (); */ // Տվյալները գալիս են վերջնականապես, սա լուծում է այն, այնպես որ այն աշխատում է բոլոր հարթակներում uint16_t buffer_u16 [15]; for (uint8_t i = 0; i <15; i ++) {buffer_u16 = բուֆեր [2 + i*2 + 1]; buffer_u16 + = (բուֆեր [2 + i*2] << 8); }

// դրեք գեղեցիկ կառուցվածքի մեջ:)

memcpy ((անվավեր *) & տվյալներ, (անվավեր *) buffer_u16, 30);

եթե (գումար! = data.checksum) {

Serial.println («Չեկի գումարի ձախողում»); վերադարձնել կեղծ; } // հաջողություն! վերադարձնել ճշմարիտ; }

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

Լար donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; դեպք 1. վերադարձ «LUN»; դեպք 2. վերադարձ «MAR»; դեպք 3. վերադարձ «MER»; դեպք 4. վերադարձ «JEU»; դեպք 5. վերադարձ «VEN»; դեպք 6. վերադարձ «SAM»; կանխադրված `վերադարձ" "; }}

// 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 ()) + "/" + Լարային (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 (""); Ֆայլի տվյալներ = 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 («ամսաթիվ»); 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);

ուշացում (500);

}

// permet d'afficher les nombres sur deux chiffres

Լար Vers2Chiffres (բայթ nombre) {String resultat = ""; if (nombre <10) resultat = "0"; վերադարձի արդյունքը += լարային (nombre, DEC); }

Քայլ 3. MIT հավելվածի գյուտարար 2 ծրագիր

MIT հավելվածի գյուտարար 2 ծրագիր
MIT հավելվածի գյուտարար 2 ծրագիր

սա MIT հավելվածի գյուտարար կոդի բլոկն է

Քայլ 4. ԱՐԴՅՈՆՔ

ահա արդյունքի տեսանյութը

Խորհուրդ ենք տալիս: