Mündəricat:

Havanın Keyfiyyətini Çirkləndirən Nəzarət Sistemi: 4 Addım
Havanın Keyfiyyətini Çirkləndirən Nəzarət Sistemi: 4 Addım

Video: Havanın Keyfiyyətini Çirkləndirən Nəzarət Sistemi: 4 Addım

Video: Havanın Keyfiyyətini Çirkləndirən Nəzarət Sistemi: 4 Addım
Video: Ən yaxşının ən yaxşısı???. Radioqəbuledici TECSUN PL680 FULL İNCELE!!! #tecsun 2024, Noyabr
Anonim
Çirklənməni hissəciklər üçün hava keyfiyyətinin monitorinqi sistemi
Çirklənməni hissəciklər üçün hava keyfiyyətinin monitorinqi sistemi
Çirklənməni hissəciklər üçün hava keyfiyyətinin monitorinqi sistemi
Çirklənməni hissəciklər üçün hava keyfiyyətinin monitorinqi sistemi

GİRİŞ:

1 Bu layihədə, məlumatların göstərilməsi, SD kartda məlumat ehtiyatı və IOT ilə bir hissəcik detektorunun necə qurulacağını göstərirəm. Vizual olaraq neopiksel üzük ekranı havanın keyfiyyətini göstərir.

2 Hava keyfiyyəti bu gün getdikcə daha çox əhəmiyyət kəsb edir. toz nisbətini ölçən sistemlər var, lakin çox bahalıdır. Bəzi araşdırmaların göstərdiyi kimi, bazarda aşağı qiymətli, yüksək keyfiyyətli hissəcik detektorları mövcuddur.

misal üçün:

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

3 Buna görə də, hissələrin sayını ölçmə qabiliyyətinə görə (0.5µm -dən 10 µm -ə qədər) ölçə bilən, nəticənin sadə göstərilməsi (neo piksel üzük), TFT ekranında və bir SD kartda möhürlənmiş ehtiyat nüsxəsi.

4 Əlavə olaraq bir Android tətbiqi ilə ünsiyyət qurmaq və nəticəni IOT serverində dərc etmək üçün bluetooth ünsiyyət modulu əlavə etdim.

5 Ümumi dəyəri 60 € -dan çox deyil

Təchizat

-Arduino uno R3

-Arduino proto qalxanı

-TFT ekran ST7735

-Neopixel üzük 24 led

-Plantower PMS5003

-HC-06 bluetooth modulu

Addım 1: Komponentləri birləşdirin

Komponentlərin birləşdirilməsi
Komponentlərin birləşdirilməsi

müxtəlif komponentlər yuxarıdakı sxemə görə bağlanır

Addım 2: Kitabxana və Arduino Proqramı

1 kitabxana

TFT ekranı üçün

github.com/adafruit/Adafruit-GFX-Library

neo piksel üzük üçün

github.com/adafruit/Adafruit_NeoPixel

sd kartı üçün

github.com/arduino-libraries/SD

2 arduino eskizi

#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #daxil edin

// Arduino -da hansı pin NeoPixel -ə bağlıdır?

#define PIN 6 // Trinket və ya Gemma -da bunu 1 -ə dəyişməyi təklif edin

// Arduino -ya neçə NeoPixel qoşulub?

#define NUMPIXELS 24 // Populyar NeoPixel üzük ölçüsü Adafruit_NeoPixel pikselləri (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = piksel. Color (0, 250, 0); uint32_t narıncı = piksel. Rəng (250, 250, 0); uint32_t rouge = piksel. Rəng (255, 0, 0);

SoftwareSerial pmsSerial (2, 3);

#define cs 10 #define dc 9 #define rst 8 // bunu da Arduino sıfırlamasına qoşa bilərsiniz

#include // Əsas qrafik kitabxanası

#include // Hardware-xüsusi kitabxana #include #include const int cs_sd = 4; int temps; // temps d'acquisition ikiqat tempsInit; // timer au démarrage du loop başlatma ()

#təyin olunarsa (_ SAM3X8E_)

#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif

// Seçim 1: hər hansı bir sancaqdan istifadə edin, ancaq bir qədər yavaş

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

// Seçim 2: hardware SPI sancaqlarından istifadə etməlidir

// (UNO üçün sclk = 13 və sid = 11) və pin 10 // bir çıxış olmalıdır. Bu daha sürətli - microSD kartdan istifadə etmək istəsəniz də lazımdır (şəkil çəkmə nümunəsinə baxın) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; void setup () {Serial.begin (9600); // I2C Wire.begin () ilə əlaqə qurun; // RTC RTC.begin () modulunu başladın; Serial.print ("init SD"); gecikmə (1000); əgər (! SD.begin (cs_sd)) // Vəzifə şərtləri SD karta əlavə olunsa {Serial.print ("Defaut SD"); qayıtmaq; } Serial.print ("Carte SD OK");

Fayl məlumatları = SD.open ("donnees.txt", FILE_WRITE); // Oğlan le fichier "donnees.txt"

data.println (""); data.println ("Démarrage alınması"); // Fixier data.close (); tft.initR (INITR_GREENTAB); // ST7735S çipini, qara nişanı Serial.println ("init") işə salın; // hata ayıklama çıxışımız tft.fillScreen (ST7735_BLACK); // sensorun ötürmə sürəti 9600 pmsSerial.begin (9600);

piksel.begin (); // NeoPixel zolaq obyektini İNTİTİAL EDİN (TƏLƏBLİ)

piksel.setBrightness (2);

}

struktur pms5003data {

uint16_t çərçivə; uint16_t pm10_standart, pm25_standart, pm100_standart; uint16_t pm10_env, pm25_env, pm100_env; uint16_t hissəciklər_03um, hissəciklər_05um, hissəciklər_10um, hissəciklər_25um, hissəciklər_50um, hissəciklər_100um; uint16_t istifadə olunmur; uint16_t checksum; };

struktur pms5003data məlumatları; void loop () {piksel.clear (); // Bütün piksel rənglərini 'off' olaraq təyin edin DateTime now = RTC.now (); // Récupère l'heure et le date courante // affiche_date_heure (indi);

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

əgər (readPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("nbre hissələri/ 0.1 l");

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) " mikrog/m3 ");

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 ("mikrog/m)

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 (" mikrogram)

tft.setCursor (10, 5);

tft.setTextColor (ST7735_AĞ, ST7735_BLACK); tft.setTextSize (1); tft.println ("nbre hissələri/ 0.1 l");

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

əgər ((nombre_leds = 1)) {

piksel.fill (vert, 0, nombre_leds); } else if ((nombre_leds = 8)) {piksel.fill (vert, 0, 8); piksel.fill (narıncı, 8, ((nombre_leds) -8)); } başqa əgər (nombre_leds> 16) {

piksel doldurun (vert, 0, 8); piksel doldurun (narıncı, 8, 8); piksel.fill (rouge, 16, ((nombre_leds) -16)); } else if (nombre_leds <= 1) {piksel.fill (vert, 0, 1); } piksel.şou (); // Yenilənmiş piksel rənglərini aparata göndərin.

// Dnfinition String PM03 = String (data.particles_03um); String PM05 = String (data.particles_05um); String PM10 = String (data.particles_10um); String PM25 = String (data.particles_25um); String PM50 = String (data.particles_50um); String PM100 = String (data.particles_100um); String PMS10 = String (data.pm10_standard); String PMS25 = String (data.pm25_standard); String PMS100 = String (data.pm100_standard); String Temps = String (temps);

// Müqəddəs Yazılar

Fayl məlumatları = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps+""+PM03+""+PM05+""+PM10+""+PM25+""+PM50+""+PM100+""+PMS10+""+PMS25+""+PMS100+""); data.close (); }

}

boolean readPMSdata (Axın *lar) {

if (! s-> available ()) {return false; } // Xüsusi '0x42' başlanğıc baytına çatana qədər bir anda bir bayt oxuyun, əgər (s-> peek ()! = 0x42) {s-> read (); saxta qayıtmaq; }

// İndi bütün 32 baytı oxuyun

if (s-> available () readBytes (bufer, 32);

// çek məbləğini hazırlayın

for (uint8_t i = 0; i <30; i ++) {sum+= tampon ; }

/* ayıklama

for (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (tampon , HEX); Serial.print (","); } Serial.println (); */ // Məlumatlar indian'd gəlir, bu onu həll edir, beləliklə bütün platformalarda işləyir uint16_t buffer_u16 [15]; for (uint8_t i = 0; i <15; i ++) {buffer_u16 = tampon [2 + i*2 + 1]; buffer_u16 + = (tampon [2 + i*2] << 8); }

// gözəl bir quruluşa qoyun:)

memcpy ((void *) & data, (void *) buffer_u16, 30);

if (sum! = data.checksum) {

Serial.println ("Sağlama məbləği uğursuzluğu"); saxta qayıtmaq; } // uğurlar! doğru qayıtmaq; }

// Gündəlik jurnalını çevir /! / La semaine un dimanche başlayır

Donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; hal 1: "LUN" qaytarın; hal 2: "MAR" qaytarın; hal 3: "MER" qaytarın; hal 4: "JEU" qaytarın; hal 5: "VEN" i qaytarın; hal 6: "SAM" ı qaytarın; default: qayıt ""; }}

// affiche la date et l'heure sur l'écran

void affiche_date_heure (DateTime datetime) {// Tarix String jurnal = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + String (datetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());

Serial. çap (jurnal); Serial.print (""); Serial. çap (heure); //Serial.print (""); Fayl məlumatları = SD.open ("donnees.txt", FILE_WRITE); data.print (jurnal + "" + heure + ""); data.close ();

tft.setCursor (2, 120);

tft.setTextColor (ST7735_GREEN); tft.setTextSize (1); tft.print ("tarix"); 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);

gecikmə (500);

}

// permet d'afficher les nombres sur deux chiffres

Str2 Vers2Chiffres (bayt adı) {String resultat = ""; if (nomre <10) resultat = "0"; return resultat += String (nombre, DEC); }

Addım 3: MIT App Inventor 2 Proqramı

MIT App Inventor 2 Proqramı
MIT App Inventor 2 Proqramı

bu MIT tətbiqinin ixtiraçı kod blokudur

Addım 4: NƏTİCƏ

nəticənin videosu burada

Tövsiyə: