Სარჩევი:
- მარაგები
- ნაბიჯი 1: კომპონენტების დაკავშირება
- ნაბიჯი 2: ბიბლიოთეკა და არდუინოს პროგრამა
- ნაბიჯი 3: MIT აპლიკაციის გამომგონებელი 2 პროგრამა
- ნაბიჯი 4: შედეგი
ვიდეო: ნაწილაკების დაბინძურებისათვის ჰაერის ხარისხის მონიტორინგის სისტემა: 4 ნაბიჯი
2024 ავტორი: John Day | [email protected]. ბოლოს შეცვლილი: 2024-01-30 10:17
შესავალი:
1 ამ პროექტში მე ვაჩვენებ, თუ როგორ უნდა ავაშენოთ ნაწილაკების დეტექტორი მონაცემების ჩვენებით, მონაცემთა სარეზერვო ასლი SD ბარათზე და IOT. ვიზუალურად ნეოპიქსელების ბეჭდის ჩვენება მიუთითებს ჰაერის ხარისხზე.
2 ჰაერის ხარისხი დღეს სულ უფრო მნიშვნელოვანი პრობლემაა. არსებობს სისტემები მტვრის მაჩვენებლის გასაზომად, მაგრამ ისინი ძალიან ძვირია. ბაზარზე არის დაბალფასიანი, მაღალი ხარისხის ნაწილაკების დეტექტორები, როგორც ამას ზოგიერთი კვლევა აჩვენებს.
მაგალითად:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 ამიტომ მე გადავწყვიტე ავაშენო მოწყობილობა, რომელსაც შეუძლია ნაწილაკების რაოდენობის გაზომვა ზომის კლასების მიხედვით (0,5μm– დან 10 μm– მდე), ვიზუალურად შედეგის მარტივი ჩვენებით (neo pixel ბეჭედი), უფრო დეტალური ჩვენება TFT ეკრანზე და დროებით ბეჭედური სარეზერვო ასლი SD ბარათზე.
4 გარდა ამისა, მე დავამატე bluetooth საკომუნიკაციო მოდული, რომ შევძლო ანდროიდულ აპლიკაციასთან ურთიერთობა და ამით გამოვაქვეყნო შედეგები IOT სერვერზე.
მთლიანი მთლიანი ღირებულება არ აღემატება 60 € -ს
მარაგები
-არდუინო უნო R3
-არდუინოს პროტო ფარი
-TFT ეკრანი ST7735
-ნეოპიქსელის ბეჭედი 24 led
-Plantower PMS5003
-HC-06 bluetooth მოდული
ნაბიჯი 1: კომპონენტების დაკავშირება
სხვადასხვა კომპონენტები დაკავშირებულია ზემოთ დიაგრამის მიხედვით
ნაბიჯი 2: ბიბლიოთეკა და არდუინოს პროგრამა
1 ბიბლიოთეკა
TFT ეკრანისთვის
github.com/adafruit/Adafruit-GFX-Library
ნეო პიქსელის ბეჭდისთვის
github.com/adafruit/Adafruit_NeoPixel
sd ბარათისთვის
github.com/arduino-libraries/SD
2 არდუინოს ესკიზი
#მოიცავს #მოიცავს // ბიბლიოთეკა დაასხით l'I2C #მოიცავს "RTClib.h" // ბიბლიოთეკა pour le module RTC RTC_DS1307 RTC; #ჩართეთ
// არდუინოს რომელი პინია დაკავშირებული ნეოპიქსელებთან?
#განსაზღვრეთ PIN 6 // Trinket ან Gemma– ზე, გირჩევთ შეცვალოთ იგი 1 – ით
// რამდენი ნეოპიქსელი ერთვის არდუინოს?
#განსაზღვრეთ 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);
პროგრამული უზრუნველყოფა სერიული pms სერიული (2, 3);
#define cs 10 #define dc 9 #define rst 8 // თქვენ ასევე შეგიძლიათ დაუკავშიროთ იგი Arduino გადატვირთვას
#მოიცავს // ძირითადი გრაფიკული ბიბლიოთეკა
#მოიცავს // აპარატურის სპეციფიკური ბიბლიოთეკა #მოიცავს #მოიცავს const int cs_sd = 4; int ტემპები; // temps d'acquisition ორმაგი tempsInit; // ინიციალიზაცია 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 (); // მოდულის ინიციალიზაცია 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 ("მიკროგ/მ 3");
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 ("მიკროგ/მ 3")
tft.setCursor (10, 5);
tft.setTextColor (ST7735_WHITE, ST7735_BLACK); tft.setTextSize (1); tft.println ("nbre ნაწილები/ 0.1 ლ");
// სერიული.ბეჭდი (ტემპები);
// 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);
თუ ((nombre_leds = 1)) {
pixels.fill (ვერტ, 0, nombre_leds); } else if ((nombre_leds = 8)) {pixels.fill (ვერტ, 0, 8); pixels.fill (ნარინჯისფერი, 8, ((nombre_leds) -8)); } else if (nombre_leds> 16) {
pixels.fill (ვერტ, 0, 8); პიქსელები. შევსება (ნარინჯისფერი, 8, 8); pixels.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {pixels.fill (ვერტ, 0, 1); } pixels.show (); // გააგზავნეთ პიქსელის განახლებული ფერები აპარატურაზე.
// განსაზღვრება données სიმებიანი 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+""); მონაცემები. დახურვა (); }
}
ლოგიკური წაკითხვა PMS მონაცემები (ნაკადი *ები) {
if (! s-> ხელმისაწვდომი ()) {დაბრუნება false; } // წაიკითხეთ ბაიტი ერთდროულად, სანამ არ მივაღწევთ სპეციალურ '0x42' სტარ-ბაიტს if (s-> peek ()! = 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 ((void *) & data, (void *) 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 სიმებიანი heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());
სერიული. ბეჭდვა (jour); Serial.print (""); სერიული. ბეჭდვა (heure); // სერიული. ბეჭდვა (""); ფაილის მონაცემები = SD.open ("donnees.txt", FILE_WRITE); data.print (jour + "" + heure + ""); მონაცემები. დახურვა ();
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 (byte nombre) {String resultat = ""; if (nombre <10) resultat = "0"; დაბრუნების resultat += სიმებიანი (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 სენსორს
ჰაერის მონიტორინგის სისტემა NodeMCU და IOT Thingspeak გამოყენებით: 4 ნაბიჯი
ჰაერის მონიტორინგის სისტემა NodeMCU და IOT Thingspeak გამოყენებით: ThingSpeak არის ღია კოდის IoT პროგრამა და API, აპარატურის მოწყობილობებისა და სენსორების მონაცემების შესანახად და მისაღებად. ის იყენებს HTTP პროტოკოლს ინტერნეტით ან LAN მისი კომუნიკაციისთვის. MATLAB ანალიზი შედის ანალიზისა და ვიზუალიზაციის მიზნით
ჰაერის ხარისხის მონიტორინგი ნაწილაკების ფოტონის გამოყენებით: 11 ნაბიჯი (სურათებით)
ჰაერის ხარისხის მონიტორინგი ნაწილაკების ფოტონის გამოყენებით: ამ პროექტში PPD42NJ ნაწილაკების სენსორი გამოიყენება ჰაერის ხარისხის გასაზომად (PM 2.5) ჰაერში არსებული ნაწილაკების ფოტონთან ერთად. ის არა მხოლოდ აჩვენებს მონაცემებს ნაწილაკების კონსოლსა და dweet.io– ზე, არამედ მიუთითებს ჰაერის ხარისხზე RGB LED– ის გამოყენებით მისი შეცვლით