#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP32Servo.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Pin konfigurasi
const int mq2Pin = 34;
const int ledHijau = 12;
const int ledMerah = 14;
const int servoPin = 27;
Servo myServo;
// Buffer data
const int maxSampel = 60;
int dataSampel[maxSampel]; // Ini "list" atau array
int list = 0; // Sebagai index untuk array
unsigned long waktuMulai = 0;
bool mengukur = false;
void setup() {
Serial.begin(115200);
pinMode(ledHijau, OUTPUT);
pinMode(ledMerah, OUTPUT);
myServo.attach(servoPin);
myServo.write(0); // Posisi awal
// Inisialisasi OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED gagal dimulai");
while (true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Monitoring MQ2");
display.display();
delay(1500);
}
void loop() {
if (!mengukur) {
waktuMulai = millis();
list = 0;
mengukur = true;
Serial.println("Mulai pengambilan data...");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Mengambil data...");
display.display();
}
if (mengukur && millis() - waktuMulai < 10000) {
if (list < maxSampel) {
int nilai12bit = analogRead(mq2Pin); // 0–4095
int nilai10bit = map(nilai12bit, 0, 4095, 0, 1023); // Konversi ke skala 10-bit
dataSampel[list] = nilai10bit;
Serial.print("Sampel "); Serial.print(list); Serial.print(": ");
Serial.println(nilai10bit);
list++;
}
delay(1000);
}
if (mengukur && millis() - waktuMulai >= 10000) {
// Hitung statistik
int total = 0;
int minVal = 1023;
int maxVal = 0;
for (int i = 0; i < list; i++) {
total += dataSampel[i];
if (dataSampel[i] < minVal) minVal = dataSampel[i];
if (dataSampel[i] > maxVal) maxVal = dataSampel[i];
}
int rata2 = total / list;
String status = "";
int sudut = 0;
// Fuzzy Logic (skala 10-bit: 0–1023)
if (rata2 <= 300) {
status = "Baik";
digitalWrite(ledHijau, HIGH);
digitalWrite(ledMerah, LOW);
sudut = 0;
} else if (rata2 <= 600) {
status = "Tidak Disarankan";
digitalWrite(ledHijau, HIGH);
digitalWrite(ledMerah, HIGH); // Kombinasi = oranye
sudut = 90;
} else {
status = "Buruk";
digitalWrite(ledHijau, LOW);
digitalWrite(ledMerah, HIGH);
sudut = 180;
}
// Tampilkan di OLED
display.clearDisplay();
display.setCursor(0, 0);
display.print("Rata2: "); display.println(rata2);
display.print("Min: "); display.println(minVal);
display.print("Max: "); display.println(maxVal);
display.print("Status: "); display.println(status);
display.display();
// Gerakkan servo
myServo.write(sudut);
// Serial output
Serial.println("--- Hasil Analisa ---");
Serial.print("Rata-rata: "); Serial.println(rata2);
Serial.print("Status: "); Serial.println(status);
mengukur = false;
delay(3000); // jeda siklus
}
}