#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// กำหนดขนาดจอ OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// กำหนดขาอุปกรณ์
const int mq2Pin = 34; // ขาอ่านค่า Analog ของ MQ-2 (ESP32 ADC1 GPIO 34)
const int buzzerPin = 25; // ขาควบคุมลำโพง
void setup() {
Serial.begin(115200);
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
// เริ่มต้นใช้งานจอ OLED (I2C address 0x3C)
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 10);
display.println(F("Initializing MQ-2..."));
display.display();
delay(2000);
}
void loop() {
// อ่านค่า Analog จากเซนเซอร์ MQ-2 (0 - 4095 สำหรับ ESP32)
int rawValue = analogRead(mq2Pin);
// แปลงค่า Analog เป็นเปอร์เซ็นต์ (0 - 100%)
float gasPercent = (float)rawValue / 4095.0 * 100.0;
// แสดงผลออกทาง Serial Monitor
Serial.print("MQ-2 Raw: ");
Serial.print(rawValue);
Serial.print(" | Gas/Smoke: ");
Serial.print(gasPercent);
Serial.println(" %");
// แสดงผลบนจอ OLED
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println(F("MQ-2 Smoke/Gas Monitor"));
display.setCursor(0, 20);
display.setTextSize(2);
display.print(gasPercent, 1);
display.println(F(" %"));
// แสดงสถานะเตือนบนจอและควบคุมลำโพงตามเงื่อนไข (50%, 60%, 70%, 80%, 100%)
display.setTextSize(1);
display.setCursor(0, 50);
if (gasPercent >= 100.0) {
display.println(F("Status: DANGER! (100%)"));
display.display();
digitalWrite(buzzerPin, HIGH); // เสียงดังต่อเนื่องยาวๆ
}
else if (gasPercent >= 80.0) {
display.println(F("Status: HIGH WARNING!"));
display.display();
digitalWrite(buzzerPin, HIGH); // เสียงดังต่อเนื่อง (80% ขึ้นไป)
}
else if (gasPercent >= 70.0) {
display.println(F("Status: Alert 70%"));
display.display();
tone(buzzerPin, 1000, 200); // เสียงไม่ดังมาก (1000Hz นาน 200ms)
delay(500);
}
else if (gasPercent >= 60.0) {
display.println(F("Status: Alert 60%"));
display.display();
tone(buzzerPin, 800, 200); // เสียงไม่ดังมาก (800Hz)
delay(800);
}
else if (gasPercent >= 50.0) {
display.println(F("Status: Alert 50%"));
display.display();
tone(buzzerPin, 600, 200); // เสียงเบาๆ (600Hz)
delay(1000);
}
else {
display.println(F("Status: Normal"));
display.display();
digitalWrite(buzzerPin, LOW); // ปิดเสียง
}
delay(1000); // หน่วงเวลา 1 วินาที
}