#include <Arduino.h> // ขาเชื่อมต่อ (แนะนำ ADC1) #define MQ2_PIN 34 // ADC1_CH6 (GPIO34) - อ่านค่าได้อย่างเดียว #define LEDRED_PIN 12 #define LEDGREEN_PIN 14 // การตั้งค่า ADC // หากเอาต์พุต MQ-2 = 0–3.3V ให้ใช้ 11dB (อ่านได้ถึง ~3.3V) #define USE_ADC_11DB // ค่ากำหนดแจ้งเตือน (ใช้ hysteresis) #define GAS_TH_HI 2000 // เกินค่านี้ = อันตราย (ประมาณ) #define GAS_TH_LO 1800 // ต่ำกว่านี้ = กลับสภาวะปกติ // การกรองค่า (Moving Average) #define AVG_SAMPLES 10 bool alarmState = false; uint16_t readMQ2Avg() { uint32_t sum = 0; for (int i = 0; i < AVG_SAMPLES; i++) { sum += analogRead(MQ2_PIN); delay(2); } return (uint16_t)(sum / AVG_SAMPLES); } void setup() { Serial.begin(115200); delay(200); #ifdef USE_ADC_11DB analogSetAttenuation(ADC_11db); #else analogSetAttenuation(ADC_6db); // เผื่อใช้บอร์ดที่มีสเกลต่างกัน #endif // ไม่ต้องตั้งความละเอียดก็ได้ (ESP32 ค่าเริ่มต้น 12 บิต 0..4095) // ถ้าจะตั้ง: analogReadResolution(12); pinMode(LEDRED_PIN, OUTPUT); pinMode(LEDGREEN_PIN, OUTPUT); digitalWrite(LEDRED_PIN, LOW); digitalWrite(LEDGREEN_PIN, HIGH); Serial.println("เริ่มต้นใช้งาน MQ-2 Sensor (ESP32 + ADC1)!"); } void loop() { uint16_t gasRaw = readMQ2Avg(); // แสดงผลดิบ (0..4095) Serial.print("Gas Raw: "); Serial.println(gasRaw); // ตัดสินใจด้วย hysteresis if (!alarmState && gasRaw > GAS_TH_HI) { alarmState = true; Serial.println("!! ALERT: ก๊าซ/ควันเกินระดับปลอดภัย (TH_HI) !!"); } else if (alarmState && gasRaw < GAS_TH_LO) { alarmState = false; Serial.println("-- SAFE: ค่ากลับสู่ช่วงปลอดภัย (TH_LO) --"); } // แสดงผล LED digitalWrite(LEDRED_PIN, alarmState ? HIGH : LOW); digitalWrite(LEDGREEN_PIN, alarmState ? LOW : HIGH); delay(200); }
Standard input is empty
#include <Arduino.h>
// ขาเชื่อมต่อ (แนะนำ ADC1)
#define MQ2_PIN 34 // ADC1_CH6 (GPIO34) - อ่านค่าได้อย่างเดียว
#define LEDRED_PIN 12
#define LEDGREEN_PIN 14
// การตั้งค่า ADC
// หากเอาต์พุต MQ-2 = 0–3.3V ให้ใช้ 11dB (อ่านได้ถึง ~3.3V)
#define USE_ADC_11DB
// ค่ากำหนดแจ้งเตือน (ใช้ hysteresis)
#define GAS_TH_HI 2000 // เกินค่านี้ = อันตราย (ประมาณ)
#define GAS_TH_LO 1800 // ต่ำกว่านี้ = กลับสภาวะปกติ
// การกรองค่า (Moving Average)
#define AVG_SAMPLES 10
bool alarmState = false;
uint16_t readMQ2Avg() {
uint32_t sum = 0;
for (int i = 0; i < AVG_SAMPLES; i++) {
sum += analogRead(MQ2_PIN);
delay(2);
}
return (uint16_t)(sum / AVG_SAMPLES);
}
void setup() {
Serial.begin(115200);
delay(200);
#ifdef USE_ADC_11DB
analogSetAttenuation(ADC_11db);
#else
analogSetAttenuation(ADC_6db); // เผื่อใช้บอร์ดที่มีสเกลต่างกัน
#endif
// ไม่ต้องตั้งความละเอียดก็ได้ (ESP32 ค่าเริ่มต้น 12 บิต 0..4095)
// ถ้าจะตั้ง: analogReadResolution(12);
pinMode(LEDRED_PIN, OUTPUT);
pinMode(LEDGREEN_PIN, OUTPUT);
digitalWrite(LEDRED_PIN, LOW);
digitalWrite(LEDGREEN_PIN, HIGH);
Serial.println("เริ่มต้นใช้งาน MQ-2 Sensor (ESP32 + ADC1)!");
}
void loop() {
uint16_t gasRaw = readMQ2Avg();
// แสดงผลดิบ (0..4095)
Serial.print("Gas Raw: ");
Serial.println(gasRaw);
// ตัดสินใจด้วย hysteresis
if (!alarmState && gasRaw > GAS_TH_HI) {
alarmState = true;
Serial.println("!! ALERT: ก๊าซ/ควันเกินระดับปลอดภัย (TH_HI) !!");
} else if (alarmState && gasRaw < GAS_TH_LO) {
alarmState = false;
Serial.println("-- SAFE: ค่ากลับสู่ช่วงปลอดภัย (TH_LO) --");
}
// แสดงผล LED
digitalWrite(LEDRED_PIN, alarmState ? HIGH : LOW);
digitalWrite(LEDGREEN_PIN, alarmState ? LOW : HIGH);
delay(200);
}