#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); }