ნაწილაკების დაბინძურებისათვის ჰაერის ხარისხის მონიტორინგის სისტემა: 4 ნაბიჯი
ნაწილაკების დაბინძურებისათვის ჰაერის ხარისხის მონიტორინგის სისტემა: 4 ნაბიჯი
Anonim
ნაწილაკების დაბინძურებისათვის ჰაერის ხარისხის მონიტორინგის სისტემა
ნაწილაკების დაბინძურებისათვის ჰაერის ხარისხის მონიტორინგის სისტემა
ნაწილაკების დაბინძურებისათვის ჰაერის ხარისხის მონიტორინგის სისტემა
ნაწილაკების დაბინძურებისათვის ჰაერის ხარისხის მონიტორინგის სისტემა

შესავალი:

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 აპლიკაცია გამომგონებელი 2 პროგრამა
MIT აპლიკაცია გამომგონებელი 2 პროგრამა

ეს არის MIT პროგრამის გამომგონებლის კოდის ბლოკი

ნაბიჯი 4: შედეგი

აქ არის შედეგის ვიდეო

გირჩევთ: