Mündəricat:
- Təchizat
- Addım 1: Komponentləri birləşdirin
- Addım 2: Kitabxana və Arduino Proqramı
- Addım 3: MIT App Inventor 2 Proqramı
- Addım 4: NƏTİCƏ
Video: Havanın Keyfiyyətini Çirkləndirən Nəzarət Sistemi: 4 Addım
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:45
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
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ı
bu MIT tətbiqinin ixtiraçı kod blokudur
Addım 4: NƏTİCƏ
nəticənin videosu burada
Tövsiyə:
FATURA FATURASI VƏ İNŞAAT NƏZARƏT SİSTEMİ: 3 addım
FATURA FATURASI VƏ İNVANSOR KONTROL SİSTEMİ: Bu təlimatlarla, MS Access -dən istifadə edərək, bir Faktura və Envanter idarəetmə sistemi yaratmaq üçün bir fikir verəcəyəm. Çox asandır və daha çox kompüter və ya proqramlaşdırma biliklərinə ehtiyac yoxdur. Giriş, Cədvəllər. formalar və hesabatlar
Səs keyfiyyətini artırmaq üçün xarici dinamik əlavə edin: 5 addım
Səs Keyfiyyətini Təkmilləşdirmək üçün Xarici Dinamik əlavə edin: Bu gözəl kiçik saat radiosunun səs keyfiyyəti dəhşətli idi! Radio ilə əlaqəli hər şey əladır, istifadə rahatlığı, telefon şarjı, ekran və s. Müalicəsi xarici dinamikdən istifadə etməkdir və nə qədər böyük olsa, bir o qədər yaxşıdır
Grafana və Raspberry Pi istifadə edərək hava keyfiyyətini izləyin: 7 addım
Grafana və Raspberry Pi istifadə edərək hava keyfiyyətini izləyin: Kiçik bir IOT layihəsi axtarırdım və bir dostum bu təlimatı nəzərdən keçirməyi tövsiyə etdi: https: //dzone.com/articles/raspberry-pi-iot-sensor .. monitorinq üçün bir Raspberry Pi qurarkən davam etmək üçün təlimatı izləməyi tövsiyə edin
Hava keyfiyyətini ölçün: 17 addım
Hava Keyfiyyətini Ölçün: Hava keyfiyyəti və incə hissəciklər: Asılmış hissəciklər ("hissəcikli maddələr" üçün "PM" ilə ifadə olunur) ümumiyyətlə hava tərəfindən daşınan incə bərk hissəciklərdir (Vikipediya). İncə hissəciklər ağciyərlərə dərin nüfuz edir. Səbəb ola bilərlər
MQTT üzərində Uzaqdan Nəzarət və Foto Nəzarət: 8 Addım
MQTT üzərində Uzaqdan Nəzarət və Foto Nəzarəti: Salam.Bu gün qaraj qapılarını, işıqlandırmanı, istiliyi, təzyiqi idarə etməyi, temperaturu və bir çoxunu idarə etmək üçün istifadə edilə bilən uzaqdan idarəetmə və izləmə sisteminin necə qurulacağından danışmaq istərdim. parametrlər. Ancaq əsas xüsusiyyət