Isi kandungan:

Sistem Pemantauan Kualiti Udara untuk Pencemaran Partikulat: 4 Langkah
Sistem Pemantauan Kualiti Udara untuk Pencemaran Partikulat: 4 Langkah

Video: Sistem Pemantauan Kualiti Udara untuk Pencemaran Partikulat: 4 Langkah

Video: Sistem Pemantauan Kualiti Udara untuk Pencemaran Partikulat: 4 Langkah
Video: Uji Baru Rancang Bangun Sistem Pemantauan Polusi Udara Berbasis Komunikasi Long Range (LoRa) 2024, Julai
Anonim
Sistem Pemantauan Kualiti Udara untuk Pencemaran Partikulat
Sistem Pemantauan Kualiti Udara untuk Pencemaran Partikulat
Sistem Pemantauan Kualiti Udara untuk Pencemaran Partikulat
Sistem Pemantauan Kualiti Udara untuk Pencemaran Partikulat

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

Menyambungkan Komponen
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

Program MIT App Inventor 2
Program MIT App Inventor 2

ini adalah blok kod penemu aplikasi MIT

Langkah 4: KEPUTUSAN

berikut adalah video hasilnya

Disyorkan: