Isi kandungan:
- Bekalan
- Langkah 1: Menyambungkan Komponen
- Langkah 2: Program Perpustakaan dan Arduino
- Langkah 3: Program MIT App Inventor 2
- Langkah 4: KEPUTUSAN
Video: Sistem Pemantauan Kualiti Udara untuk Pencemaran Partikulat: 4 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:08
INTRO:
1 Dalam projek ini saya menunjukkan cara membina pengesan zarah dengan paparan data, sandaran data pada kad SD dan IOT. Secara visual paparan cincin neopixels menunjukkan kualiti udara.
2 Kualiti udara menjadi perhatian yang semakin penting pada masa kini. ada sistem untuk mengukur kadar habuk tetapi sangat mahal. Terdapat pengesan zarah kos rendah dan berkualiti tinggi di pasaran, seperti yang ditunjukkan oleh beberapa kajian.
sebagai contoh:
www.atmos-meas-tech.net/11/4823/2018/amt-1…
3 Oleh itu, saya memutuskan untuk membina peranti yang mampu mengukur bilangan zarah mengikut kelas ukuran (0.5µm hingga 10 µm), secara visual dengan paparan hasil yang ringkas (cincin neo pixel), paparan yang lebih terperinci pada skrin TFT dan sandaran yang dicop masa pada kad SD.
4 Di samping itu saya telah menambahkan modul komunikasi bluetooth untuk dapat berkomunikasi dengan aplikasi android dan dengan demikian menerbitkan hasilnya di pelayan IOT.
5 Kos keseluruhan keseluruhan tidak melebihi 60 €
Bekalan
-Arduino uno R3
-Arduino perisai proto
-TFT skrin ST7735
-Cincin Neopixel 24 led
-Penanam PMS5003
-HC-06 modul bluetooth
Langkah 1: Menyambungkan Komponen
komponen yang berlainan dihubungkan mengikut rajah di atas
Langkah 2: Program Perpustakaan dan Arduino
1 perpustakaan
untuk skrin TFT
github.com/adafruit/Adafruit-GFX-Library
untuk cincin piksel neo
github.com/adafruit/Adafruit_NeoPixel
untuk kad sd
github.com/arduino-libraries/SD
2 lakaran arduino
#include #include // Bibliothèque pour l'I2C #include "RTClib.h" // Bibliothèque pour le module RTC RTC_DS1307 RTC; #sertakan
// Pin mana di Arduino yang disambungkan ke NeoPixels?
#define PIN 6 // Pada Trinket atau Gemma, cadangkan ubah ini menjadi 1
// Berapa banyak NeoPixels yang dilekatkan pada Arduino?
#define NUMPIXELS 24 // Ukuran cincin NeoPixel popular Adafruit_NeoPixel piksel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = piksel. Warna (0, 250, 0); uint32_t oren = piksel. Warna (250, 250, 0); uint32_t rouge = piksel. Warna (255, 0, 0);
PerisianSerial pmsSerial (2, 3);
#define cs 10 #define dc 9 #define rst 8 // anda juga boleh menyambungkannya ke tetapan semula Arduino
#masuk // Perpustakaan grafik teras
#include // Perpustakaan khusus perkakasan #include #include const int cs_sd = 4; int sementara; // temps d'acquisition double tempsInit; // inisialisasi du timer au démarrage du loop ()
#jika ditakrifkan (_ SAM3X8E_)
#undef _FlashStringHelper:: F (string_literal) #define F (string_literal) string_literal #endif
// Pilihan 1: gunakan pin apa pun tetapi sedikit lebih perlahan
// Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, mosi, sclk, rst);
// Pilihan 2: mesti menggunakan pin SPI perkakasan
// (untuk UNO thats sclk = 13 dan sid = 11) dan pin 10 mestilah // output. Ini jauh lebih pantas - juga diperlukan jika anda ingin // menggunakan kad microSD (lihat contoh gambar gambar) Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst); float nombre_leds = 0; batal persediaan () {Serial.begin (9600); // Memulakan hubungan dengan Wire.begin I2C (); // Memulakan le modul RTC RTC.begin (); Serial.print ("init SD"); kelewatan (1000); if (! SD.begin (cs_sd)) // Keadaan yang baik si la carte SD est présente dans l'appareil {Serial.print ("Defaut SD"); kembali; } Serial.print ("Carte SD OK");
Data fail = SD.open ("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"
data.println (""); data.println ("Pemerolehan Démarrage"); // Ecrit dans ce fichier data.close (); tft.initR (INITR_GREENTAB); // memulakan cip ST7735S, tab hitam Serial.println ("init"); // output penyahpepijatan kami tft.fillScreen (ST7735_BLACK); // kadar baud sensor ialah 9600 pmsSerial.begin (9600);
piksel.begin (); // MEMULAKAN objek jalur NeoPixel (DIPERLUKAN)
piksel.setBrightness (2);
}
struct pms5003data {
uint16_t bingkai; uint16_t pm10_standard, pm25_standard, pm100_standard; uint16_t pm10_env, pm25_env, pm100_env; uint16_t partikel_03um, zarah_05um, zarah_10um, zarah_25um, zarah_50um, zarah_100um; uint16_t tidak digunakan; uint16_t checksum; };
data struct pms5003data; gelung kosong () {pixels.clear (); // Tetapkan semua warna piksel ke 'mati' DateTime sekarang = RTC.sekarang (); // Récupère l'heure et le date courante // affiche_date_heure (sekarang);
temps = ((milis () - tempsInit)) / 1000; // Démarrage du chrono
jika (bacaPMSdata (& pmsSerial)) {// tft.fillScreen (ST7735_BLACK); tft.setCursor (10, 5); tft.setTextColor (ST7735_WHITE); tft.println ("bahagian nbre / 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); tft.print (" 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 ("microg / m3");
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 ("microg / m3");
tft.setCursor (10, 5);
tft.setTextColor (ST7735_WHITE, ST7735_BLACK); tft.setTextSize (1); tft.println ("bahagian nbre / 0.1 l");
// Serial.print (temps);
// Serial.print (""); Serial.print ("#"); Serial.print ("03µm"); Serial.print (data.particles_03um); Cetakan bersiri (""); Serial.print ("05µm"); Serial.print (data.particles_05um); Cetakan bersiri (""); Serial.print ("1µm"); Serial.print (data.particles_10um); Cetakan bersiri (""); Serial.print ("25µm"); Serial.print (data.particles_25um); Cetakan bersiri (""); Serial.print ("50µm"); Serial.print (data.particles_50um); Cetakan bersiri (""); 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);
jika ((nombre_leds = 1)) {
pixels.fill (vert, 0, nombre_leds); } lain jika ((nombre_leds = 8)) {pixels.fill (vert, 0, 8); pixels.fill (oren, 8, ((nombre_leds) -8)); } lain jika (nombre_leds> 16) {
pixel.fill (vert, 0, 8); piksel. isi (oren, 8, 8); pixels.fill (rouge, 16, ((nombre_leds) -16)); } lain jika (nombre_leds <= 1) {pixels.fill (vert, 0, 1); } piksel.tunjukkan (); // Hantar warna piksel yang dikemas kini ke perkakasan.
// Définition données String PM03 = String (data.particles_03um); Rentetan PM05 = Rentetan (data.particles_05um); Rentetan PM10 = Rentetan (data.particles_10um); String PM25 = String (data.particles_25um); Rentetan PM50 = Rentetan (data.particles_50um); Rentetan PM100 = Rentetan (data.particles_100um); Rentetan PMS10 = Rentetan (data.pm10_standard); Rentetan PMS25 = Rentetan (data.pm25_standard); Rentetan PMS100 = Rentetan (data.pm100_standard); String Temps = String (temps);
// Ecriture des données dans le fichier texte
Data fail = SD.open ("donnees.txt", FILE_WRITE); data.println (Temps + "" + PM03 + "" + PM05 + "" + PM10 + "" + PM25 + "" + PM50 + "" + PM100 + "" + PMS10 + "" + PMS25 + "" + PMS100 + ""); data.tutup (); }
}
boolean readPMSdata (Strim * s) {
jika (! s-> tersedia ()) {return false; } // Baca satu bait pada satu masa sehingga kita sampai ke bait permulaan '0x42' jika (s-> mengintip ()! = 0x42) {s-> baca (); kembali palsu; }
// Sekarang baca semua 32 bait
jika (s-> tersedia () readBytes (buffer, 32);
// siapkan checksum
untuk (uint8_t i = 0; i <30; i ++) {sum + = penyangga ; }
/ * penyahpepijatan
untuk (uint8_t i = 2; i <32; i ++) {Serial.print ("0x"); Serial.print (penyangga , HEX); Cetakan bersiri (","); } Bersiri.println (); * / // Data datang dalam endian'd, ini menyelesaikannya sehingga berfungsi di semua platform uint16_t buffer_u16 [15]; untuk (uint8_t i = 0; i <15; i ++) {buffer_u16 = penyangga [2 + i * 2 + 1]; buffer_u16 + = (penyangga [2 + i * 2] << 8); }
// masukkan ke dalam struktur yang bagus:)
memcpy ((void *) & data, (void *) buffer_u16, 30);
jika (jumlah! = data.checksum) {
Serial.println ("Kegagalan Checksum"); kembali palsu; } // kejayaan! kembali benar; }
// Converti le numéro de jour en jour /! / La semaine bermula dimanche
Rentetan donne_jour_semaine (uint8_t j) {switch (j) {case 0: return "DIM"; kes 1: mengembalikan "LUN"; kes 2: mengembalikan "MAR"; kes 3: mengembalikan "MER"; kes 4: mengembalikan "JEU"; kes 5: mengembalikan "VEN"; kes 6: mengembalikan "SAM"; lalai: kembali ""; }}
// affiche la date et l'heure sur l'écran
void affiche_date_heure (DateTime datetime) {// String Tarikh jour = donne_jour_semaine (datetime.dayOfTheWeek ()) + "" + Vers2Chiffres (datetime.day ()) + "/" + Vers2Chiffres (datetime.month ()) + "/" + Rentetan (datetime.year (), DEC); // heure String heure = ""; heure = Vers2Chiffres (datetime.hour ()) + ":" + Vers2Chiffres (datetime.minute ()) + ":" + Vers2Chiffres (datetime.second ());
Serial.print (jour); Cetakan bersiri (""); Serial.print (heure); //Serial.print (""); Data fail = SD.open ("donnees.txt", FILE_WRITE); data.print (jour + "" + heure + ""); data.tutup ();
tft.setCursor (2, 120);
tft.setTextColor (ST7735_GREEN); tft.setTextSize (1); tft.print ("date"); 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);
kelewatan (500);
}
// permet d'afficher les nombres sur deux chiffres
String Vers2Chiffres (byte nombre) {String resultat = ""; jika (nombre <10) resultat = "0"; return resultat + = Rentetan (nombre, DEC); }
Langkah 3: Program MIT App Inventor 2
ini adalah blok kod penemu aplikasi MIT
Langkah 4: KEPUTUSAN
berikut adalah video hasilnya
Disyorkan:
Pemantauan Kualiti Udara Mudah Dengan Paparan LCD TFT - Ameba Arduino: 3 Langkah
Pemantauan Kualiti Udara Mudah Dengan Paparan LCD TFT - Ameba Arduino: Pengenalan Sekarang kebanyakan orang tinggal di rumah untuk mengelakkan hubungan rapat dengan pembawa virus COVID-19 yang berpotensi, kualiti udara menjadi faktor penting untuk kesejahteraan orang, terutama di negara-negara tropika di mana menggunakan udara-con adalah suatu keharusan semasa da
Pengesanan Pencemaran Udara + Penapisan Udara: 4 Langkah
Pengesanan Pencemaran Udara + Penapisan Udara: Pelajar (Aristobulus Lam, Victor Sim, Nathan Rosenzweig dan Declan Loges) dari Sekolah Antarabangsa Swiss Jerman bekerjasama dengan kakitangan MakerBay untuk menghasilkan sistem pengukuran pencemaran udara dan keberkesanan penapisan udara yang bersepadu. Ini
Pemantauan Kualiti Udara Dengan DSM501A Dengan Nokia LCD: 7 Langkah
Pemantauan Kualiti Udara Dengan DSM501A Dengan Nokia LCD: Halo kawan-kawan! Dalam arahan ringkas ini, saya akan menunjukkan kepada anda cara memantau kualiti udara di rumah anda atau di mana sahaja. Adalah cukup mudah untuk mengumpulkan stesen pemantauan kualiti udara harga bajet ini
Pemantauan Kualiti Udara Menggunakan Foton Zarah: 11 Langkah (dengan Gambar)
Pemantauan Kualiti Udara Menggunakan Partikel Photon: Dalam projek ini sensor partikel PPD42NJ digunakan untuk mengukur kualiti udara (PM 2.5) yang ada di udara dengan Particle Photon. Ia tidak hanya memaparkan data pada konsol Partikel dan dweet.io tetapi juga menunjukkan kualiti udara menggunakan LED RGB dengan mengubahnya
Pemantauan Pencemaran Udara - IoT-Data Viz-ML: 3 Langkah (dengan Gambar)
Pemantauan Pencemaran Udara | IoT-Data Viz-ML: Jadi ini pada dasarnya adalah Aplikasi IoT lengkap yang merangkumi bahagian perkakasan dan juga bahagian perisian. Dalam tutorial ini, anda akan melihat cara memasang peranti IoT dan bagaimana cara kami memantau pelbagai jenis gas pencemaran yang terdapat di udara