Სარჩევი:

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

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

ვიდეო: ნაწილაკების დაბინძურებისათვის ჰაერის ხარისხის მონიტორინგის სისტემა: 4 ნაბიჯი
ვიდეო: აღმოაჩინეთ, თუ როგორ ახდენს ჯენი ტაილერი რევოლუციას ჯანდაცვის ინდუსტრიაში! 2024, ივლისი
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: შედეგი

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

გირჩევთ: