Բովանդակություն:
- Պարագաներ
- Քայլ 1: Բաղադրիչների միացում
- Քայլ 2. Գրադարան և Arduino ծրագիր
- Քայլ 3. MIT հավելվածի գյուտարար 2 ծրագիր
- Քայլ 4. ԱՐԴՅՈՆՔ
Video: Մասնիկների կեղտոտման համար օդի որակի վերահսկման համակարգ `4 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:47
ՆԵՐԱՈԹՅՈՆ:
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 հավելվածի գյուտարար կոդի բլոկն է
Քայլ 4. ԱՐԴՅՈՆՔ
ահա արդյունքի տեսանյութը
Խորհուրդ ենք տալիս:
Ներքին օդի որակի հաշվիչ `5 քայլ (նկարներով)
Ներքին օդի որակի հաշվիչ. Ձեր տանը օդի որակը ստուգելու պարզ նախագիծ: Քանի որ վերջին շրջանում մենք շատ ենք մնում/աշխատում տնից, գուցե լավ գաղափար լինի վերահսկել օդի որակը և հիշեցնել ինքներդ ձեզ, երբ ժամանակն է բացել պատուհանը և մի քիչ մաքուր օդ ներս մտեք
PurpleAir Օդի որակի կարգավիճակի LED էկրան ՝ 4 քայլ
PurpleAir Օդի որակի կարգավիճակի LED էկրան. Կալիֆոռնիայի վերջին անտառային հրդեհների պատճառով Սան Ֆրանցիսկոյում օդի որակը մեծապես ազդել է: Մենք հայտնվեցինք PurpleAir քարտեզը անընդհատ մեր հեռախոսների կամ նոթբուքերի վրա ՝ փորձելով տեսնել, թե ե՞րբ է օդը բավական ապահով ՝ հաղթանակը բացելու համար
AEROBOT Օդի որակի տվիչ V1.0: 6 քայլ (նկարներով)
AEROBOT Օդի որակի սենսոր V1.0. Այս հրահանգը վերաբերում է AEROBOT անունով էժան և բարձր ճշգրիտ օդի որակի տվիչի պատրաստմանը: Այս նախագիծը ցույց է տալիս ջերմաստիճանը, հարաբերական խոնավությունը, PM 2.5 փոշու խտությունը և ահազանգեր շրջակա միջավայրի օդի որակի մասին: Այն օգտագործում է DHT11 զգայարան
Էլեկտրոնային արագության վերահսկման (ESC) վերահսկման ազդանշանային գեներատոր այլընտրանք. 7 քայլ
CONTROL SIGNAL GENERATOR ALTERNATIVE ELECTRONIC SPEED CONTROL (ESC). Որոշ ժամանակ առաջ ես հրապարակեցի մի տեսանյութ (https://www.youtube.com/watch?v=-4sblF1GY1E) իմ YouTube ալիքում, որտեղ ես ցույց տվեցի, թե ինչպես պատրաստել քամու տուրբին առանց խոզանակի DC շարժիչից: Ես տեսանյութը պատրաստեցի իսպաներենով և այն բացատրեց, որ այս շարժիչը տրված է
Ensգայուն գլխարկ Raspberry Pi օդի որակի և գազի դետեկտորի համար V0.9: 8 քայլ
Sensly գլխարկ Raspberry Pi օդի որակի և գազի դետեկտորի համար. Այս տեղեկատվությունը կարող է ուղղակիորեն սնվել ձեր սմարթֆոնին իրական ժամանակի ձագուկների համար