Buat Pengamanan Kualitas Udara Berbasis Arduino dengan Sensor Debu DSM501A
Komponen dan perlengkapan
Arduino Nano R3
×
1
Modul Sensor Debu DSM501A
×
1
LCD Alphanumerik, 16 x 2
×
1
Kit Kipas 40mm
×
1
LED (umum)
×
5
Resistor 221 ohm
×
1
Potensiometer Satu Putaran - 10k ohm
×
1
Alat dan mesin yang diperlukan
Solder (umum)
Aplikasi dan layanan online
Arduino IDE
Tentang proyek ini
Pemantauan kualitas udara adalah ilmu yang terkenal dan established yang dimulai pada tahun 80-an. Pada saat itu, teknologi cukup terbatas, dan solusi yang digunakan untuk mengukur polusi udara kompleks, memberatkan, dan sangat mahal.
Untungnya, saat ini, dengan teknologi modern terbaru, solusi yang digunakan untuk pemantauan kualitas udara menjadi tidak hanya lebih akurat, tetapi juga lebih cepat dalam pengukuran. Perangkat menjadi lebih kecil, dan biaya jauh lebih terjangkau dari sebelumnya. Perangkat yang disajikan menggunakan sensor debu Samyoung "DSM501A" yang merupakan salah satu sensor termurah di pasar dan dapat dibeli di AliExpress dengan beberapa dolar. Sensor ini mampu mendeteksi partikel PM2.5 serta PM10.
Pada gambar di bawah ini, Anda dapat melihat tata letak pin, tetapi jangan memperhatikan warna kabel karena mungkin berbeda.
Rangkaian sangat sederhana:
Vout1 (PM2.5) dari sensor terhubung ke D2 Arduino, Vout2 (PM10) ke D3, Vcc ke Arduino +5V, dan GND ke pin GND Arduino. Dioda LED terhubung ke pin analog A1 hingga A5 Arduino yang didefinisikan sebagai output dalam kode. Tampilan LCD dengan karakter 16x2 kompatibel dengan Hitachi HD44780. Ini menampilkan konsentrasi partikel PM10 dalam pcs/0.01cf, dan 5 status kualitas udara:
- Bersih
- Baik
- Dapat diterima
- Tinggi
- Berbahaya
Konsentrasi PM10 dan PM2.5 dapat dipantau pada serial monitor Arduino. Tergantung pada tingkat kontaminasi (PM10), LED warna tertentu akan menyala untuk memungkinkan pembacaan hasil yang cepat dan mudah. Saya tidak memiliki banyak pengalaman dalam menulis kode, jadi mungkin kode dapat ditingkatkan. Sangat penting untuk ditekankan bahwa dengan memasang kipas yang menarik udara keluar dari sensor, secara signifikan meningkatkan karakteristik di area nilai puncak yang tidak diinginkan. Seluruh perangkat dirangkaian dalam kotak plastik untuk instalasi listrik.
Di masa depan, saya berencana menguji beberapa sensor debu murah lainnya sehingga Anda dapat menemukan hasilnya dalam salah satu proyek saya selanjutnya.
Kode
kode
kodeArduino
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); int pin2 = 3; int pin1 = 2; unsigned long duration1; unsigned long duration2; unsigned long starttime; unsigned long sampletime_ms = 3000;//sampe 1s ; unsigned long lowpulseoccupancy1 = 0; unsigned long lowpulseoccupancy2 = 0; float ratio1 = 0; float ratio2 = 0; float concentration1 = 0; float concentration2 = 0; int wLed = A1; int gLed = A2; int yLed = A3; int rLed = A4; int bLed = A5; void setup() { Serial.begin(9600); pinMode(2,INPUT); pinMode(3,INPUT); pinMode(wLed,OUTPUT); pinMode(gLed,OUTPUT); pinMode(yLed,OUTPUT); pinMode(rLed,OUTPUT); pinMode(bLed,OUTPUT); starttime = millis();//get the current time; lcd.begin(16, 2); } void loop() { duration1 = pulseIn(pin1, LOW); duration2 = pulseIn(pin2, LOW); lowpulseoccupancy1 = lowpulseoccupancy1+duration1; lowpulseoccupancy2 = lowpulseoccupancy2+duration2; if ((millis()-starttime) > sampletime_ms)//if the sampel time == 30s { ratio1 = lowpulseoccupancy1/(sampletime_ms*10.0); // Integer percentage 0=>100 concentration1 = 1.1*pow(ratio1,3)-3.8*pow(ratio1,2)+520*ratio1+0.62; // using spec sheet curve ratio2 = lowpulseoccupancy2/(sampletime_ms*10.0); // Integer percentage 0=>100 concentration2 = 1.1*pow(ratio2,3)-3.8*pow(ratio2,2)+520*ratio2+0.62; // lcd.setCursor(0, 0); lcd.print("PM10 "); lcd.setCursor(6, 0); lcd.print(concentration1,3); Serial.print("concentration1 = "); Serial.print(concentration1); Serial.print(" pcs/0.01cf - "); Serial.print("concentration2 = "); Serial.print(concentration2); Serial.print(" pcs/0.01cf - "); if (concentration1 < 1000) { lcd.setCursor (0, 1); for (int i = 0; i < 16; ++i) { lcd.write(' '); } lcd.setCursor(4, 1); lcd.print("CLEAN"); digitalWrite(wLed, HIGH); digitalWrite(gLed, LOW); digitalWrite(yLed, LOW); digitalWrite(rLed, LOW); digitalWrite(bLed, LOW); } if (concentration1 > 1000 && concentration1 < 10000) { lcd.setCursor (0, 1); for (int i = 0; i < 16; ++i) { lcd.write(' '); } lcd.setCursor(4, 1); lcd.print("GOOD"); digitalWrite(wLed, LOW); digitalWrite(gLed, HIGH); digitalWrite(yLed, LOW); digitalWrite(rLed, LOW); digitalWrite(bLed, LOW); } if (concentration1 > 10000 && concentration1 < 20000) { lcd.setCursor (0, 1); for (int i = 0; i < 16; ++i) { lcd.write(' '); } lcd.setCursor(4, 1); lcd.print("ACCEPTABLE"); digitalWrite(wLed, LOW); digitalWrite(gLed, LOW); digitalWrite(yLed, HIGH); digitalWrite(rLed, LOW); digitalWrite(bLed, LOW); } if (concentration1 > 20000 && concentration1 < 50000) { lcd.setCursor (0, 1); for (int i = 0; i < 16; ++i) { lcd.write(' '); } lcd.setCursor(4, 1); lcd.print("HEAVY"); digitalWrite(wLed, LOW); digitalWrite(gLed, LOW); digitalWrite(yLed, LOW); digitalWrite(rLed, HIGH); digitalWrite(bLed, LOW); } if (concentration1 > 50000 ) { lcd.setCursor (0, 1); for (int i = 0; i < 16; ++i) { lcd.write(' '); } lcd.setCursor(4, 1); lcd.print("HAZARD"); digitalWrite(wLed, LOW); digitalWrite(gLed, LOW); digitalWrite(yLed, LOW); digitalWrite(rLed, LOW); digitalWrite(bLed, HIGH); } lowpulseoccupancy1 = 0; lowpulseoccupancy2 = 0; starttime = millis(); } }