#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definisikan pin analog yang terhubung ke sensor MQ-3
const int mq3Pin = 34;
// Definisikan pin untuk LED
const int led1Pin = 13;
const int led2Pin = 12;
const int led3Pin = 14;
const int led4Pin = 27;
// Definisikan pin untuk suara buzzer
const int buzzerPin = 26;
// Definisikan pin untuk tombol
const int buttonPin = 15;
const int resetButtonPin = 25; // Tombol reset
// Nilai kalibrasi (ubah sesuai hasil kalibrasi Anda)
const float maxSensorValue = 4095.0; // Nilai maksimum dari pembacaan analog (12-bit ADC ESP32)
const float calibrationFactor = 99.0 / maxSensorValue; // Faktor kalibrasi untuk rentang 0% hingga 99%
// Definisikan ukuran OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Definisikan alamat I2C OLED (0x3C atau 0x3D)
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Status program
bool isMeasuring = false;
bool isResetting = false;
void setup() {
// Inisialisasi komunikasi serial
Serial.begin(115200);
// Inisialisasi pin MQ-3 sebagai input
pinMode(mq3Pin, INPUT);
// Inisialisasi pin LED sebagai output
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
pinMode(led4Pin, OUTPUT);
// Inisialisasi pin buzzer sebagai output
pinMode(buzzerPin, OUTPUT);
// Inisialisasi pin tombol sebagai input dengan pull-up resistor
pinMode(buttonPin, INPUT_PULLUP);
pinMode(resetButtonPin, INPUT_PULLUP); // Inisialisasi pin tombol reset
// Inisialisasi OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println(F("Gagal menginisialisasi OLED"));
for(;;);
}
// Tampilkan pesan awal
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Start");
display.display();
}
void loop() {
// Periksa apakah tombol reset ditekan
if (digitalRead(resetButtonPin) == LOW) {
if (!isResetting) {
isResetting = true;
isMeasuring = false;
// Tampilkan pesan awal
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Start");
display.display();
// Matikan semua LED
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, LOW);
digitalWrite(led4Pin, LOW);
// Matikan buzzer
noTone(buzzerPin);
}
// Debounce delay
delay(50);
} else {
isResetting = false;
}
// Periksa apakah tombol ditekan
if (digitalRead(buttonPin) == LOW) {
if (!isMeasuring) {
isMeasuring = true;
// Debounce delay
delay(50);
}
}
// Jika program dalam status pengukuran
if (isMeasuring) {
// Baca nilai analog dari sensor MQ-3
int sensorValue = analogRead(mq3Pin);
// Konversi nilai analog ke tegangan (0 - 3.3V)
float voltage = sensorValue * (3.3 / maxSensorValue);
// Estimasi kadar alkohol berdasarkan nilai kalibrasi
float alcoholConcentration = sensorValue * calibrationFactor;
// Batasi kadar alkohol dalam rentang 0% hingga 99%
if (alcoholConcentration > 99.0) {
alcoholConcentration = 99.0;
} else if (alcoholConcentration < 0.0) {
alcoholConcentration = 0.0;
}
// Tampilkan nilai analog, tegangan, dan kadar alkohol ke Serial Monitor
Serial.print("Nilai sensor: ");
Serial.print(sensorValue);
Serial.print("\tTegangan: ");
Serial.print(voltage);
Serial.print(" V\tKadar Alkohol: ");
Serial.print(alcoholConcentration);
Serial.println(" %");
// Tampilkan nilai pada OLED
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.print("Nilai sensor: ");
display.println(sensorValue);
display.print("Tegangan: ");
display.print(voltage);
display.println(" V");
display.print("Kadar Alkohol: ");
display.print(alcoholConcentration);
display.println(" %");
display.display();
// Kontrol LED berdasarkan kadar alkohol
if (alcoholConcentration >= 55.0) {
digitalWrite(led4Pin, HIGH);
digitalWrite(led3Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led1Pin, LOW);
// Mainkan suara buzzer sangat cepat (frekuensi tinggi)
tone(buzzerPin, 1000); // Ganti frekuensi sesuai kebutuhan
} else if (alcoholConcentration >= 20.0) {
digitalWrite(led4Pin, LOW);
digitalWrite(led3Pin, HIGH);
digitalWrite(led2Pin, LOW);
digitalWrite(led1Pin, LOW);
// Mainkan suara buzzer cepat (frekuensi sedang)
tone(buzzerPin, 500); // Ganti frekuensi sesuai kebutuhan
} else if (alcoholConcentration >= 5.0) {
digitalWrite(led4Pin, LOW);
digitalWrite(led3Pin, LOW);
digitalWrite(led2Pin, HIGH);
digitalWrite(led1Pin, LOW);
// Mainkan suara buzzer sedang (frekuensi rendah)
tone(buzzerPin, 300); // Ganti frekuensi sesuai kebutuhan
} else if (alcoholConcentration >= 1.0) {
digitalWrite(led4Pin, LOW);
digitalWrite(led3Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led1Pin, HIGH);
// Mainkan suara buzzer lambat (frekuensi sangat rendah)
tone(buzzerPin, 100); // Ganti frekuensi sesuai kebutuhan
} else {
digitalWrite(led4Pin, LOW);
digitalWrite(led3Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led1Pin, LOW);
// Matikan suara buzzer jika kadar alkohol < 1%
noTone(buzzerPin);
}
}
}