Daftar Isi:

Sistem Pemantauan Kualitas Udara untuk Polusi Partikulat: 4 Langkah
Sistem Pemantauan Kualitas Udara untuk Polusi Partikulat: 4 Langkah

Video: Sistem Pemantauan Kualitas Udara untuk Polusi Partikulat: 4 Langkah

Video: Sistem Pemantauan Kualitas Udara untuk Polusi Partikulat: 4 Langkah
Video: Polusi Udara dan Sistem Pemantauan Kualitas Udara di Wilayah Perkotaan 2024, Juli
Anonim
Sistem Pemantauan Kualitas Udara untuk Polusi Partikulat
Sistem Pemantauan Kualitas Udara untuk Polusi Partikulat
Sistem Pemantauan Kualitas Udara untuk Polusi Partikulat
Sistem Pemantauan Kualitas Udara untuk Polusi Partikulat

INTRO:

1 Dalam proyek ini saya menunjukkan bagaimana membangun sebuah detektor partikel dengan tampilan data, backup data pada kartu SD dan IOT. Secara visual tampilan cincin neopiksel menunjukkan kualitas udara.

2 Kualitas udara menjadi perhatian yang semakin penting saat ini. ada sistem untuk mengukur tingkat debu tetapi sangat mahal. Ada detektor partikel murah dan berkualitas tinggi di pasaran, seperti yang ditunjukkan oleh beberapa penelitian.

Misalnya:

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

3 Oleh karena itu saya memutuskan untuk membuat perangkat yang mampu mengukur jumlah partikel berdasarkan kelas ukuran (0,5µm hingga 10 m), secara visual dengan tampilan hasil yang sederhana (cincin neo piksel), tampilan yang lebih detail pada layar TFT dan pencadangan bercap waktu pada kartu SD.

4 Selain itu saya telah menambahkan modul komunikasi bluetooth untuk dapat berkomunikasi dengan aplikasi android dan dengan demikian mempublikasikan hasilnya di server IOT.

5 Biaya keseluruhan tidak melebihi 60 €

Perlengkapan

-Arduino uno R3

-Perisai proto Arduino

-Layar TFT ST7735

-Neopixel ring 24 led

-Plantower PMS5003

-Modul bluetooth HC-06

Langkah 1: Menghubungkan Komponen

Menghubungkan Komponen
Menghubungkan Komponen

komponen yang berbeda terhubung sesuai dengan diagram di atas

Langkah 2: Perpustakaan dan Program Arduino

1 perpustakaan

untuk layar TFT

github.com/adafruit/Adafruit-GFX-Library

untuk cincin neo piksel

github.com/adafruit/Adafruit_NeoPixel

untuk kartu sd

github.com/arduino-libraries/SD

2 sketsa arduino

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

// Pin mana di Arduino yang terhubung ke NeoPixels?

#define PIN 6 // Pada Trinket atau Gemma, sarankan untuk mengubahnya menjadi 1

// Berapa banyak NeoPixels yang terpasang ke Arduino?

#define NUMPIXELS 24 // Ukuran cincin NeoPixel Populer Adafruit_NeoPixel piksel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); uint32_t vert = piksel. Warna (0, 250, 0); uint32_t oranye = piksel. Warna(250, 250, 0); uint32_t rouge = piksel. Warna(255, 0, 0);

Perangkat LunakSerial pmsSerial(2, 3);

#define cs 10 #define dc 9 #define rst 8 // Anda juga dapat menghubungkan ini ke reset Arduino

#include // Pustaka grafis inti

#include // Pustaka khusus perangkat keras #include #include const int cs_sd=4; int suhu; // temps d'acquisition double tempsInit; // inisialisasi du timer au démarrage du loop()

#jika ditentukan(_SAM3X8E_)

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

// Opsi 1: gunakan pin apa saja tetapi sedikit lebih lambat

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

// Opsi 2: harus menggunakan pin SPI perangkat keras

// (untuk UNO itu sclk = 13 dan sid = 11) dan pin 10 harus // sebuah output. Ini jauh lebih cepat - juga diperlukan jika Anda ingin // menggunakan kartu microSD (lihat contoh gambar gambar) Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst); float nombre_leds=0; void setup() { Serial.begin(9600); // Inisialisasi penghubung I2C Wire.begin(); // Inisialisasi file modul RTC RTC.begin(); Serial.print("init SD"); penundaan (1000); if(!SD.begin(cs_sd)) //Kondisi vérifiant si la carte SD est présente dans l'appareil { Serial.print("Defaut SD"); kembali; } Serial.print("Carte SD OK");

Data berkas = SD.open("donnees.txt", FILE_WRITE); // Ouvre le fichier "donnees.txt"

data.println(""); data.println("Akuisisi Démarrage"); // Ecrit dans ce fichier data.close(); tft.initR(INITR_GREENTAB); // inisialisasi chip ST7735S, tab hitam Serial.println("init"); // keluaran debug kami tft.fillScreen(ST7735_BLACK); // laju baud sensor adalah 9600 pmsSerial.begin(9600);

piksel.mulai(); // INISIALISASI objek strip NeoPixel (DIPERLUKAN)

piksel.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 partikel_03um, partikel_05um, partikel_10um, partikel_25um, partikel_50um, partikel_100um; uint16_t tidak digunakan; uint16_t checksum; };

struktur data pms5003data; void loop() { piksel.clear(); // Setel semua warna piksel ke 'mati' DateTime now=RTC.now(); //Recupère l'heure et le date courante //affiche_date_heure(sekarang);

temps = ((millis() - tempsInit))/1000; // Demarrage du chrono

if (readPMSdata(&pmsSerial)) { // tft.fillScreen(ST7735_BLACK); tft.setCursor(10, 5); tft.setTextColor(ST7735_WHITE); tft.println(" jumlah bagian/ 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(" mikrog/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(" mikrog/m3 ");

tft.setCursor(10, 5);

tft.setTextColor(ST7735_WHITE, ST7735_BLACK); tft.setTextSize(1); tft.println(" jumlah bagian/ 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);

jika ((nombre_leds=1)){

pixels.fill(vert, 0, nombre_leds); } else if ((nombre_leds=8)) { pixels.fill(vert, 0, 8); piksel.isi(oranye, 8, ((nombre_leds)-8)); } else if (nombre_leds>16) {

piksel.isi(vert, 0, 8); piksel.isi(oranye, 8, 8); pixels.fill(rouge, 16, ((nombre_leds)-16)); } else if (nombre_leds<=1) { pixels.fill(vert, 0, 1); } piksel.tampilan(); // Kirim warna piksel yang diperbarui ke perangkat keras.

// Definisi données 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 Temp=String(temps);

//Ecriture des données dans le fichier texte

File data=SD.open("donnees.txt", FILE_WRITE); data.println(Suhu + " " + PM03+ " " + PM05 +" " +PM10+" " +PM25+" "+PM50+" " +PM100+" "+PMS10+" "+PMS25+" "+PMS100+" "); data.tutup(); }

}

boolean readPMSdata(Stream *s) {

if (! s->available()) { return false; } // Baca satu byte pada satu waktu sampai kita mendapatkan byte awal '0x42' khusus if (s->peek() != 0x42) { s->read(); kembali salah; }

// Sekarang baca semua 32 byte

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

// siapkan checksum

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

/* debug

for (uint8_t i=2; i<32; i++) { Serial.print("0x"); Serial.print(penyangga, HEX); Serial.print(", "); } Serial.println(); */ // Data datang dalam endian'd, ini menyelesaikannya sehingga berfungsi di semua platform uint16_t buffer_u16[15]; for (uint8_t i=0; i<15; i++) { buffer_u16 = buffer[2 + i*2 + 1]; buffer_u16 += (penyangga[2 + i*2] << 8); }

// masukkan ke dalam struct yang bagus:)

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

if (jumlah != data.checksum) {

Serial.println("Checksum gagal"); kembali salah; } // kesuksesan! kembali benar; }

//Konversikan angka de jour en jour /!\ la semaine start un dimanche

String donne_jour_semaine(uint8_t j){ switch(j){ case 0: kembalikan "DIM"; kasus 1: kembalikan "LUN"; kasus 2: kembalikan "MAR"; kasus 3: kembalikan "MER"; kasus 4: kembalikan "JEU"; kasus 5: kembalikan "VEN"; kasus 6: kembalikan "SAM"; default: kembalikan " "; } }

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

void affiche_date_heure(DateTime datetime){ // String Tanggal jour = 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.print(jurnal); Serial.print(""); Serial.print(heure); //Serial.print(" "); File data=SD.open("donnees.txt", FILE_WRITE); data.print(jurnal + " " + heure+" "); data.tutup();

tft.setCursor(2, 120);

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

penundaan (500);

}

//permet d'afficher les nombres sur deux chiffres

String Vers2Chiffres(byte nombre) { String resultat = ""; if(nombre < 10) resultat = "0"; return resultat += String(nombre, DEC); }

Langkah 3: Program MIT App Inventor 2

Program MIT App Inventor 2
Program MIT App Inventor 2

ini adalah blok kode penemu aplikasi MIT

Langkah 4: HASILNYA

ini video hasilnya

Direkomendasikan: