Author : Ila MulyandiNo comments
Membuat Alat Pendeteksi Kebocoran Gas dengan Notifikasi SMS dan Eksternal ALARM / Lampu Tanda Bahaya
A.Bahan dan Module yang dibutuhkan
-1Unit Arduino Nano Atmega168 (alternatif menggunakan Arduino Nano Atmega328)
-1Unit LCD 1602 dengan i2C connection
-1 Unit Relay Module 5V 1channel
-1 Unit Sensor Gas MQ-xx (Seri MQ sensor tergantung jenis Gas yang ingin anda pantau)
-1 Unit Module GSM SIM800L Ver.2 (atau SIM800L Ver.1+Stepdown)
-1 Unit Active Buzzer
-1 Unit Tombol Push Button
-3 Pcs LED 5mm (merah, kuning , hijau)
-3 Pcs Resistor 100-220Ohm
-Kabel Jumper secukupnya
-Untuk Box bisa sesuai kreatifitas masing-masing
Note : klik www.tokopedia.com/rajacell untuk mendapatkan semua kebutuhan module dalam project ini
Jenis Sensor Gas MQ Series :
Sample Datasheet Sensor MQ-5
B.Wiring
1.Wiring i2C LCD dengan Arduino Nano
i2C <--> Nodemcu
* VCC : Pin +5V
* GND : Pin GND
* SDA : Pin A4
* SCL : Pin A5
2.Wiring Module Relay 1Ch dengan Arduino Nano
* IN : Pin D11
* GND : Pin GND
* VCC : Pin +5V
3.Wiring Module GSM SIM800L V2 dengan Arduino Nano
* TX : Pin D2
* TR : Pin D3
* GND : Pin GND
* VCC : Pin +5V
4.Wiring Sensor MQ-xx dengan Arduino Nano
* GND : Pin GND
* VCC : Pin +5V
* AO (Analog Out) : Pin A0
* DO (Digital Out) : Tidak digunakan
5.Wiring Push Button dengan Arduino Nano
* Kaki 1 : Pin A0
* Kaki 2 : Pin GND
6.Wiring Active Buzzer dengan Arduino Nano
* Kaki + : Pin D12
* Kaki - : Pin GND
Untuk Wiring LED silahkan lihat digambar, pada gambar wiring saya menggunakan Resistor 150Ohm menuju LED, anda bisa merubah nilai Resistor ini untuk mengatur kecerahan nyala LED dengan nilai Resistansi antara 100-220 Ohm, apabila anda menggunakan LED 3mm (kecil) anda bisa menggunakan resistor 220-560Ohm.
Pastikan wiring sesuai gambar dibawah ini :
Biasanya i2C LCD1602/2004 memiliki address default 0x3F untuk keluaran baru, atau 0x27 untuk keluaran lama.Pastikan anda menyesuaikan i2C address pada coding sesuai i2C address LCD anda.
Apabila LCD tidak menampilkan text bisa saja anda salah dalam menentukan address dari i2C LCD nya atau belum setting contrast,untuk setting contrast text putar VR/trimpot yang berada dibelakan i2C board dengan obeng+ dan atur sampai text terlihat dengan sempurna.
C.Library
-Library LiquidCrystal_I2C silahkan download disini.
*Pastikan anda sudah install Board ESP8266 pada arduino ide anda
karena beberapa library yang dibutuhkan inclued ke dalam file Board ESP8266
Bagaimana cara menambahkan Board ESP8266 ke Arduino IDE silahkan lihat tutorial pada link berikut : http://www.belajarduino.com/2016/06/iot-nonemcu-esp8266-with-arduino-ide.html
Setelah melakukan download semua library yang dibutuhkan (Liquid Crystal i2C) kemudian ekstract menggunakan aplikasi Winrar/Winzip dan copy master folder yang ada di dalamnya ke dalam folder 'libraries' yang ada pada directory installer Arduino IDE.
Secara default ada di lokasi :
Windows 64bit = C:\Program Files (x86)\Arduino\libraries
Windows 32bit = C:\Program Files \Arduino\libraries
D.Sourch Code
Copy paste coding dibawah ini ke dalam Arduino IDE anda dan Upload ke Board Arduino Anda :
//Skecth program ini dibuat oleh raje-illlectronic untuk www.RAJENDROID.BLOGSPOT.com //Silahkan pergunakan coding ini secara free dan mohon untuk tidak menghapus marking ini //sebagai bentuk apresiasi atas free sharing program ini. //Untuk kebutuhan Module dan Board Arduino silahkan bisa dibeli di : //https://www.tokopedia.com/illlectronic/ #include <SoftwareSerial.h> //komunikasi dengan module GSM SIM800L #include <Wire.h> // i2C Conection Library #include <LiquidCrystal_I2C.h> //Memanggil i2C LCD Library #define ON 0 // Relay ON #define OFF 1 //Relay OFF //Sesuaikan address pada inisialisasi dibawah ini dengan address LCD anda.. LiquidCrystal_I2C lcd(0x3F, 16, 2); //Pin software Serial untuk komunikasi dengan module SIM800L SoftwareSerial SIM800L(2, 3); // RX | TX const int SensorPin = A0; // Gas Sensor Here const int TestPin = A1; //Tombol Test const int WarningPin = 11; //Out Digital To Emergency Lamp or Sirine drive with Relay const int BuzzerPin = 12; //Active Buzzer const int LedPin = 13; //LED Indicator Sensor //https://www.tokopedia.com/illlectronic/etalase/arduino-board-module float ppmGas; //Gas dalam 'ppm'->perkiraan float GasPercent; //Gas dalam 'Percent' const int GasMax = 50; //Persentase Maximal Gas uint8_t SmsCount = 0; // SMS Count Variable const int SmsMax = 3; //Maksimal SMS yang akan Dikirim const long intervalSMS = 10; //Interval pengiriman setiap sms dalam detik unsigned long previousMillis = 0; String gasStat; //https://www.tokopedia.com/illlectronic/ int ledState = LOW; unsigned long previousMillis2 = 0; long interval = 1000; void setup() { // put your setup code here, to run once: pinMode (A1,INPUT_PULLUP); pinMode (11,OUTPUT); digitalWrite (11, OFF); pinMode (12,OUTPUT); pinMode (13,OUTPUT); lcd.begin(); // memulai koneksi i2c dengan LCD Serial.begin(9600); SIM800L.begin(9600); //https://www.tokopedia.com/illlectronic/etalase/arduino-board-module lcd.setCursor (0,0); lcd.print(F("Sensor Kebocoran")); lcd.setCursor (0,1); lcd.print(F(" Gas LPG ")); delay (2000); lcd.clear(); } //Skecth program ini dibuat oleh raje-illlectronic untuk www.RAJENDROID.BLOGSPOT.com //Silahkan pergunakan coding ini secara free dan mohon untuk tidak menghapus marking ini //sebagai bentuk apresiasi atas free sharing program ini. //Untuk kebutuhan Module dan Board Arduino silahkan bisa dibeli di : //https://www.tokopedia.com/illlectronic/ void loop() { // put your main code here, to run repeatedly: GasPercent = map(analogRead(SensorPin),0,1023,0,100); ppmGas = map(analogRead(SensorPin),0,1023,0,10000); interval = map(analogRead(SensorPin),0,1023,1000,10); Serial.print (GasPercent ); Serial.println (" %"); Serial.print (ppmGas,0); Serial.println (" ppm"); lcd.setCursor (0,0); lcd.print ("P.Gas:"); lcd.print (GasPercent,1); lcd.print ("%"); lcd.print (" "); lcd.setCursor (0,1); lcd.print ("C.Gas:"); lcd.print (ppmGas,0); lcd.print ("ppm"); lcd.print (" "); //https://www.tokopedia.com/illlectronic/ if( GasPercent>GasMax || digitalRead(TestPin) == LOW ){ digitalWrite(BuzzerPin,HIGH); digitalWrite(WarningPin, ON); gasStat = "Hi"; if(SmsCount<SmsMax){ //lcd.backlight(); unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= (intervalSMS*1000)) { previousMillis = currentMillis; kirimSMS(); SmsCount=SmsCount+1; //https://www.tokopedia.com/illlectronic/etalase/arduino-board-module } } } else { digitalWrite(BuzzerPin,LOW); digitalWrite(WarningPin, OFF); gasStat = "Lo"; SmsCount=0; //Reset hitungan SMS //lcd.noBacklight(); } blinkingLed (interval); //delay scanning sensor delay(100); } //Skecth program ini dibuat oleh raje-illlectronic untuk www.RAJENDROID.BLOGSPOT.com //Silahkan pergunakan coding ini secara free dan mohon untuk tidak menghapus marking ini //sebagai bentuk apresiasi atas free sharing program ini. //Untuk kebutuhan Module dan Board Arduino silahkan bisa dibeli di : //https://www.tokopedia.com/illlectronic/ void kirimSMS () { int tes = 0; if(digitalRead(TestPin) == LOW){tes=1;} String PesanSMS = ("Terjadi Kebocoran Gas LPG dengan konsentrasi Gas ")+String(GasPercent)+("% ")+String(ppmGas)+(" ppm"); lcd.clear(); lcd.setCursor (0,0); if(tes==0){lcd.print (" WARNING!!! ");} if(tes==1){lcd.print (" TESTING!!! ");} lcd.setCursor (0,1); lcd.print ("Send SMS."); Serial.println("Menyiapkan Pesan Text"); SIM800L.write("AT+CMGF=1\r\n"); delay(500); lcd.print ("."); delay(500); Serial.println("Set SMS ke Nomor Tujuan"); //Tulis nomor tujuan SMS pada perintah dibawah ini SIM800L.write("AT+CMGS=\"085642265456\"\r\n"); delay(500); lcd.print ("."); delay(500); lcd.print ("."); Serial.println("Mengirim pesan SMS"); //Tulis pesan SMS pada baris perintah dibawah ini SIM800L.print(PesanSMS); Serial.println(PesanSMS); //https://www.tokopedia.com/illlectronic/ delay(500); lcd.print ("."); delay(500); lcd.print ("."); Serial.println("Mengakhiri SMS"); SIM800L.write((char)26); delay(500); lcd.print (".."); Serial.println("SMS Selesai Dikirim!"); delay(500); lcd.setCursor(0,1); lcd.print (" SMS SENT!! "); delay(500); lcd.clear(); } //Skecth program ini dibuat oleh raje-illlectronic untuk www.RAJENDROID.BLOGSPOT.com //Silahkan pergunakan coding ini secara free dan mohon untuk tidak menghapus marking ini //sebagai bentuk apresiasi atas free sharing program ini. //Untuk kebutuhan Module dan Board Arduino silahkan bisa dibeli di : //https://www.tokopedia.com/illlectronic/ void blinkingLed (long in ) { unsigned long currentMillis2 = millis(); if (currentMillis2 - previousMillis2 >= in) { previousMillis2 = currentMillis2; if (ledState == LOW) { //https://www.tokopedia.com/illlectronic/ ledState = HIGH; } else { ledState = LOW; } digitalWrite(LedPin, ledState); lcd.setCursor (14,0); lcd.print (gasStat); } } /* ┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌┌┌█████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌┌███████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌███┌┌┌██┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌██┌┌┌┌██┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌███┌┌┌┌███┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌███┌┌┌┌███┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌██┌┌┌┌┌███┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌███┌┌┌┌┌███┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌┌███┌┌┌┌┌████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌┌┌██┌┌┌┌┌┌████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌┌┌███┌┌┌┌┌┌┌███┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌┌┌┌███┌┌┌┌┌┌┌███┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌┌┌┌███┌┌┌┌┌┌┌┌███┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌┌┌┌┌██┌┌┌┌┌┌┌┌┌┌███┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌███┌███┌┌┌┌┌┌┌┌┌┌██┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌████████████┌┌┌┌┌┌┌┌┌┌┌███┌┌┌┌┌┌┌┌┌┌ ┌┌████████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌███┌┌┌┌┌┌┌┌┌ ┌███┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌█████████┌┌ ███┌┌┌┌█████████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌█████┌ ██┌┌┌███████┌████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌███┌ ██┌┌┌┌███┌┌┌┌┌┌┌███┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌██┌ ███┌┌┌┌┌┌┌┌┌┌┌█████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌██┌ ┌███┌┌┌┌┌┌┌████████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌██┌ ┌┌████████████┌┌┌████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌██┌ ┌███┌██████┌┌┌┌┌┌┌████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌██┌ ┌███┌┌┌┌┌┌┌┌┌┌┌██████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌██┌ ┌┌████┌████┌██████████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌██┌ ┌┌┌████████████┌┌┌┌┌███┌┌┌┌┌┌┌┌┌┌┌┌┌███┌ ┌┌┌┌██┌┌┌┌┌┌┌┌┌┌┌███████┌┌┌┌┌┌┌███████┌┌ ┌┌┌┌████┌┌┌┌┌┌████████┌┌┌┌┌┌┌┌████████┌┌ ┌┌┌┌┌████████████┌┌┌███┌┌┌┌┌███┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌███┌█┌█┌┌┌┌┌┌███┌┌┌███┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌███┌┌┌┌┌┌█████┌┌█████┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌██████████████████┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌┌██████████████┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ ┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌ */
NB: Tolong Rubah Nomor Tujuan SMS pada Koding diatas dengan Nomor Hp anda masing-masing
artinya kalau di set dalam angka 50 alarm akan active jika kadar gas diudara diatas 50% (misal 51%)
SmsMax adalah batas jumlah SMS yang akan dikirim ,kita menggunakan variable ini untuk membatasi jumlah pengiriman SMS apabila status GasMax tidak turun dibawah batas minimal dalam jangka waktu tertentu.
Artinya jika terjadi trigger oleh GasMax maka SMS hanya akan dikirim sebanyak nilai SmsMax (bisa diset 0-255).setelah jumlah sms yang dikirim sudah mencapai batas SmsMax maka sistem akan berhenti mengirimkan notifikasi SMS.
Hitungan jumlah SMS terkirim juga akan otomatis Reset ke 0 apabila belum mencapai batas SmsMax dan Kadar gas diudara sudah dibawah GasMax (misal dibawah 50%)
interv adalah interval pengiriman SMS (dalam satuan detik).Yaitu waktu jeda antara pengiriman sebuah SMS notifikasi dengan pengiriman SMS berikutnya selama belum mencapai jumlah SmsMax.
interv tidak menggunakan delay() jadi saat fase interv terjadi sistem masih bekerja memantau kondisi gas di udara.
E.Cara kerja
Berikut adalah variable yang harus disetting manual untuk menentukan Warning AlarmGasMax = 50; //Persentase Maximal Gas SmsMax = 3; //Maksimal SMS yang akan Dikirim interv = 10; //Interval pengiriman setiap sms dalam detik
GasMax adalah batas 'trigger' minimal, value antara 0-100 (dalam satuan %)artinya kalau di set dalam angka 50 alarm akan active jika kadar gas diudara diatas 50% (misal 51%)
SmsMax adalah batas jumlah SMS yang akan dikirim ,kita menggunakan variable ini untuk membatasi jumlah pengiriman SMS apabila status GasMax tidak turun dibawah batas minimal dalam jangka waktu tertentu.
Artinya jika terjadi trigger oleh GasMax maka SMS hanya akan dikirim sebanyak nilai SmsMax (bisa diset 0-255).setelah jumlah sms yang dikirim sudah mencapai batas SmsMax maka sistem akan berhenti mengirimkan notifikasi SMS.
Hitungan jumlah SMS terkirim juga akan otomatis Reset ke 0 apabila belum mencapai batas SmsMax dan Kadar gas diudara sudah dibawah GasMax (misal dibawah 50%)
interv adalah interval pengiriman SMS (dalam satuan detik).Yaitu waktu jeda antara pengiriman sebuah SMS notifikasi dengan pengiriman SMS berikutnya selama belum mencapai jumlah SmsMax.
interv tidak menggunakan delay() jadi saat fase interv terjadi sistem masih bekerja memantau kondisi gas di udara.
Posted On : Sunday, February 5, 2017Time : 10:36 PM