fork download
  1. #include <Arduino.h>
  2.  
  3. // ขาเชื่อมต่อ (แนะนำ ADC1)
  4. #define MQ2_PIN 34 // ADC1_CH6 (GPIO34) - อ่านค่าได้อย่างเดียว
  5. #define LEDRED_PIN 12
  6. #define LEDGREEN_PIN 14
  7.  
  8. // การตั้งค่า ADC
  9. // หากเอาต์พุต MQ-2 = 0–3.3V ให้ใช้ 11dB (อ่านได้ถึง ~3.3V)
  10. #define USE_ADC_11DB
  11.  
  12. // ค่ากำหนดแจ้งเตือน (ใช้ hysteresis)
  13. #define GAS_TH_HI 2000 // เกินค่านี้ = อันตราย (ประมาณ)
  14. #define GAS_TH_LO 1800 // ต่ำกว่านี้ = กลับสภาวะปกติ
  15.  
  16. // การกรองค่า (Moving Average)
  17. #define AVG_SAMPLES 10
  18.  
  19. bool alarmState = false;
  20.  
  21. uint16_t readMQ2Avg() {
  22. uint32_t sum = 0;
  23. for (int i = 0; i < AVG_SAMPLES; i++) {
  24. sum += analogRead(MQ2_PIN);
  25. delay(2);
  26. }
  27. return (uint16_t)(sum / AVG_SAMPLES);
  28. }
  29.  
  30. void setup() {
  31. Serial.begin(115200);
  32. delay(200);
  33.  
  34. #ifdef USE_ADC_11DB
  35. analogSetAttenuation(ADC_11db);
  36. #else
  37. analogSetAttenuation(ADC_6db); // เผื่อใช้บอร์ดที่มีสเกลต่างกัน
  38. #endif
  39.  
  40. // ไม่ต้องตั้งความละเอียดก็ได้ (ESP32 ค่าเริ่มต้น 12 บิต 0..4095)
  41. // ถ้าจะตั้ง: analogReadResolution(12);
  42.  
  43. pinMode(LEDRED_PIN, OUTPUT);
  44. pinMode(LEDGREEN_PIN, OUTPUT);
  45. digitalWrite(LEDRED_PIN, LOW);
  46. digitalWrite(LEDGREEN_PIN, HIGH);
  47.  
  48. Serial.println("เริ่มต้นใช้งาน MQ-2 Sensor (ESP32 + ADC1)!");
  49. }
  50.  
  51. void loop() {
  52. uint16_t gasRaw = readMQ2Avg();
  53.  
  54. // แสดงผลดิบ (0..4095)
  55. Serial.print("Gas Raw: ");
  56. Serial.println(gasRaw);
  57.  
  58. // ตัดสินใจด้วย hysteresis
  59. if (!alarmState && gasRaw > GAS_TH_HI) {
  60. alarmState = true;
  61. Serial.println("!! ALERT: ก๊าซ/ควันเกินระดับปลอดภัย (TH_HI) !!");
  62. } else if (alarmState && gasRaw < GAS_TH_LO) {
  63. alarmState = false;
  64. Serial.println("-- SAFE: ค่ากลับสู่ช่วงปลอดภัย (TH_LO) --");
  65. }
  66.  
  67. // แสดงผล LED
  68. digitalWrite(LEDRED_PIN, alarmState ? HIGH : LOW);
  69. digitalWrite(LEDGREEN_PIN, alarmState ? LOW : HIGH);
  70.  
  71. delay(200);
  72. }
Success #stdin #stdout 0.03s 25320KB
stdin
Standard input is empty
stdout
#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);
}