Translate

Monitoring Kadar Gas Amonia (NH₃) Berbasis ESP32 IOT BLYNK

Monitoring Kadar Gas Amonia (NH₃) Berbasis ESP32 IOT BLYNK 
 
 
Berikut deskripsi alat dan sistem kerja yang sesuai dengan koding ESP32 Monitor Amonia menggunakan sensor MQ-137, OLED, dan Blynk.

Deskripsi Alat

Alat ini merupakan sistem monitoring kadar gas amonia (NH₃) berbasis ESP32 yang digunakan untuk mendeteksi dan memantau konsentrasi gas amonia di udara. Sensor utama yang digunakan adalah MQ-137, sedangkan ESP32 berfungsi sebagai pusat pengolah data.

Nilai hasil pembacaan sensor diproses menjadi nilai konsentrasi amonia dalam satuan ppm (parts per million). Hasil pengukuran kemudian ditampilkan secara langsung pada OLED SH1106 128 × 64 pixel dan dikirim melalui jaringan Wi-Fi ke aplikasi Blynk, sehingga pengguna dapat melakukan pemantauan secara lokal maupun melalui perangkat yang terhubung ke Blynk.

Sistem membagi kondisi kadar amonia menjadi tiga kategori, yaitu:

Kadar AmoniaStatus
< 10 ppm    AMAN
10 sampai < 30 ppm    WASPADA
≥ 30 ppm     BAHAYA

Komponen utama yang digunakan pada alat ini adalah ESP32, sensor MQ-137, OLED SH1106 I2C, jaringan Wi-Fi, dan platform Blynk IoT.

Sistem Kerja Alat

Saat alat dinyalakan, ESP32 melakukan inisialisasi terhadap sensor MQ-137, OLED, komunikasi I2C, komunikasi serial, jaringan Wi-Fi, dan koneksi ke server Blynk. OLED menggunakan komunikasi I2C melalui pin SDA GPIO 21 dan SCL GPIO 22, sedangkan output analog sensor MQ-137 dibaca ESP32 melalui GPIO 34.

Setelah sistem aktif, alat melakukan kalibrasi awal sensor. OLED menampilkan pesan “KALIBRASI SENSOR” dan “Jangan beri gas”. Program memberi waktu awal sekitar 5 detik sebelum proses pengambilan data kalibrasi dilakukan.

Selama proses kalibrasi, ESP32 membaca nilai resistansi sensor sebanyak 30 kali. Nilai tersebut kemudian dirata-ratakan untuk mendapatkan nilai R0 sebagai nilai referensi sensor pada kondisi udara awal atau kondisi tanpa paparan gas yang ingin diukur.

Pada proses pengukuran, ESP32 membaca keluaran analog MQ-137 sebanyak 50 kali dalam satu siklus. Pengambilan data berulang ini digunakan untuk mendapatkan nilai rata-rata ADC sehingga pembacaan lebih stabil.

Nilai ADC kemudian dikonversi menjadi tegangan menggunakan persamaan:

Selanjutnya program menghitung resistansi sensor Rs menggunakan:

dengan nilai RL = 500 yang telah ditentukan dalam program.

Setelah nilai Rs diperoleh, program membandingkannya dengan nilai R0 hasil kalibrasi. Jika nilai Rs lebih besar atau sama dengan R0, program menetapkan konsentrasi amonia sebesar 0 ppm.

Jika Rs lebih kecil dari R0, program menghitung perubahan resistansi menggunakan:

Kemudian nilai tersebut dikonversi menjadi ppm menggunakan persamaan dalam program:

Setelah mendapatkan nilai ppm, ESP32 menentukan status kondisi udara. Nilai di bawah 10 ppm dinyatakan AMAN, nilai 10 sampai kurang dari 30 ppm dinyatakan WASPADA, sedangkan nilai 30 ppm atau lebih dinyatakan BAHAYA.

Hasil pembacaan kemudian ditampilkan pada OLED dalam bentuk nilai konsentrasi amonia dan statusnya, misalnya:

MONITOR AMONIA

15.2 ppm

STATUS: WASPADA

ESP32 juga mengirimkan data ke aplikasi Blynk setiap 2 detik. Data yang dikirim terdiri dari:

Virtual Pin BlynkData
V0Nilai kadar amonia dalam ppm
V1Nilai resistansi sensor Rs
V2Status AMAN, WASPADA, atau BAHAYA

Dengan demikian, alur utama kerja alat adalah:

MQ-137 mendeteksi gas amonia → ESP32 membaca sinyal analog → menghitung Rs → membandingkan Rs dengan R0 → menghitung nilai ppm → menentukan status → menampilkan data pada OLED → mengirim data ke Blynk melalui Wi-Fi.

Catatan penting: rumus konversi ppm pada program ini menggunakan pendekatan persentase × 3. Jadi nilai ppm tersebut merupakan hasil pendekatan berdasarkan logika program, bukan kurva kalibrasi resmi MQ-137. Jika alat digunakan untuk pengukuran yang membutuhkan akurasi tinggi, sebaiknya kalibrasi dan persamaan ppm disesuaikan dengan datasheet sensor atau menggunakan gas referensi dengan konsentrasi yang diketahui.

 

1. Skema

 

2. Flowchart

 


3. Program Arduino IDE

 #define BLYNK_TEMPLATE_ID "TMPL6DEb3TXXX"
#define BLYNK_TEMPLATE_NAME "monitor amoniak"
#define BLYNK_AUTH_TOKEN "7bm6F-WExr0KU8pvXgTFZWh0w4hSjXXX"

#include <WiFi.h>
#include <BlynkSimpleEsp32.h>

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>

//================ WIFI =================

char ssid[] = "hotspothpku";
char pass[] = "1234567879";

//================ OLED =================
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C

Adafruit_SH1106G display(
SCREEN_WIDTH,
SCREEN_HEIGHT,
&Wire,
-1
);

//================ MQ137 =================

#define MQ137_PIN 34

float RL = 500.0;

float R0 = 0;

BlynkTimer timer;

//=======================================
// BACA RS SENSOR
//=======================================

float bacaRs()
{

long total = 0;

for(int i=0;i<50;i++)
{

total += analogRead(MQ137_PIN);

delay(5);

}

float adc = total / 50.0;

float voltage = adc * 3.3 / 4095.0;

if(voltage <= 0)
{
return 0;
}

float Rs = ((5.0 / voltage)-1)* RL;

return Rs;

}

//=======================================
// AUTO KALIBRASI
//=======================================

void kalibrasiAwal()
{

display.clearDisplay();

display.setTextColor(
SH110X_WHITE);

display.setTextSize(1);

display.setCursor(10,10);

display.println("KALIBRASI SENSOR");

display.setCursor(10,30);

display.println("Jangan beri gas");

display.display();

delay(5000);

float total = 0;

for(int i=30;i>0;i--)
{

float Rs = bacaRs();

total += Rs;

display.clearDisplay();

display.setCursor(10,15);

display.println("Kalibrasi...");

display.setCursor(45,35);

display.print(i);

display.println(" s");

display.display();

delay(1000);

}

R0 =total / 30.0;

Serial.print("R0 = ");

Serial.println(R0);

}

//=======================================
// HITUNG PPM
//=======================================

float hitungPPM(float Rs)
{

if(Rs >= R0)
{

return 0;

}

float persen = ((R0-Rs)/R0)*100;

float ppm =
persen * 3;

return ppm;

}

//=======================================
// STATUS
//=======================================

String statusGas(float ppm)
{

if(ppm < 10)
{
return "AMAN";
}

else if(ppm < 30)
{
return "WASPADA";
}

else
{
return "BAHAYA";
}

}

//=======================================
// OLED
//=======================================

void tampilOLED(
float ppm,
String status
)
{

display.clearDisplay();

display.setTextColor(
SH110X_WHITE);

display.setTextSize(1);

display.setCursor(15,0);

display.println(
"MONITOR AMONIA");

display.drawLine(0,12,128,12,SH110X_WHITE);

display.setTextSize(2);

display.setCursor(5,25);

display.print(
ppm,1);

display.setTextSize(1);

display.print(
" ppm");

display.setCursor(0,55);

display.print(
"STATUS:");

display.print(
status);

display.display();

}

//=======================================
// UPDATE SENSOR
//=======================================

void kirimData()
{

float Rs =
bacaRs();

float ppm =
hitungPPM(Rs);

String status =
statusGas(ppm);

Serial.println("================");

Serial.print("R0 : ");
Serial.println(R0);

Serial.print("Rs : ");
Serial.println(Rs);

Serial.print("PPM : ");
Serial.println(ppm);

tampilOLED(
ppm,
status);

Blynk.virtualWrite(
V0,
ppm);

Blynk.virtualWrite(
V1,
Rs);

Blynk.virtualWrite(V2,status);

}

//=======================================
// SETUP
//=======================================

void setup()
{

Serial.begin(115200);

analogReadResolution(12);

pinMode(MQ137_PIN,INPUT);

Wire.begin(21,22);

display.begin(
OLED_ADDR,
true);

display.clearDisplay();

Blynk.begin(
BLYNK_AUTH_TOKEN,
ssid,
pass
);

// lakukan kalibrasi otomatis

kalibrasiAwal();

timer.setInterval(
2000,
kirimData
);

}

//=======================================
// LOOP
//=======================================

void loop()
{

Blynk.run();

timer.run();

}

 

4. VIDEO HASILNYA


No comments:

Post a Comment