#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <driver/ledc.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inisialisasi LCD dengan alamat 0x27 dan ukuran 16x2
const int potPin = 34; // Pin analog untuk potensiometer pada ESP32
const int buzzerPin = 15; // Pin digital untuk buzzer di ESP32 (GPIO15)
const int greenLedPin = 2; // Pin digital untuk LED hijau di ESP32 (GPIO2)
const int redLedPin = 4; // Pin digital untuk LED merah di ESP32 (GPIO4)
const int numReadings = 10; // Jumlah pembacaan untuk averaging
int readings[numReadings]; // Array untuk menyimpan pembacaan
int currentIndex = 0; // Indeks pembacaan saat ini
int total = 0; // Total pembacaan
int safeAngle = 45; // Sudut aman
void setup() {
// Inisialisasi LCD
lcd.init();
// Menampilkan pesan selamat datang
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("TILT SENSOR");
lcd.setCursor(0, 1);
lcd.print("SEN. KEMIRINGAN");
delay(2000);
// Bersihkan LCD
lcd.clear();
// Inisialisasi pembacaan potensiometer
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
// Inisialisasi pin buzzer
pinMode(buzzerPin, OUTPUT);
// Inisialisasi pin LED hijau dan merah
pinMode(greenLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
// Inisialisasi LEDC
ledc_timer_config_t timer_conf;
timer_conf.duty_resolution = LEDC_TIMER_13_BIT;
timer_conf.freq_hz = 5000;
timer_conf.speed_mode = LEDC_HIGH_SPEED_MODE;
timer_conf.timer_num = LEDC_TIMER_0;
ledc_timer_config(&timer_conf);
ledc_channel_config_t ledc_conf;
ledc_conf.channel = LEDC_CHANNEL_0;
ledc_conf.duty = 0;
ledc_conf.gpio_num = 4; // GPIO 4
ledc_conf.speed_mode = LEDC_HIGH_SPEED_MODE;
ledc_conf.timer_sel = LEDC_TIMER_0;
ledc_channel_config(&ledc_conf);
// Inisialisasi komunikasi serial dengan baud rate 9600
Serial.begin(9600);
}
void loop() {
total = total - readings[currentIndex]; // Kurangi nilai pembacaan yang akan di-overwrite
readings[currentIndex] = analogRead(potPin); // Baca nilai potensiometer
total = total + readings[currentIndex]; // Tambahkan nilai baru ke total
currentIndex = (currentIndex + 1) % numReadings; // Pindah ke indeks berikutnya, dengan pembulatan jika mencapai batas
int average = total / numReadings; // Hitung rata-rata pembacaan
// Balik nilai potensiometer (0-4095) menjadi sudut (0-90)
int Angle = map(average, 0, 4095, 90, 0); // Konversi nilai potensiometer ke sudut (ESP32 menggunakan ADC 12-bit)
int angle = 90 - Angle; // Balik nilai sudut
// Tampilkan informasi sudut pada LCD
lcd.setCursor(0, 0);
lcd.print("Sudut: ");
lcd.print(angle);
lcd.print(" degree");
// Peringatkan jika sudut melewati batas aman
if (angle > safeAngle) {
lcd.setCursor(0, 1);
lcd.print("Status: Over ");
lcd.print(safeAngle);
lcd.print(" degree");
// Bunyikan buzzer
tone(buzzerPin, 1000); // Bunyikan buzzer dengan frekuensi 1000 Hz
// Nyalakan LED merah dan matikan LED hijau
digitalWrite(redLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
// Kirim peringatan bahaya ke Serial Monitor
Serial.println("DANGER: Sudut melewati batas aman!");
} else {
noTone(buzzerPin); // Matikan bunyi jika sudut kembali aman
// Nyalakan LED hijau dan matikan LED merah
digitalWrite(greenLedPin, HIGH);
digitalWrite(redLedPin, LOW);
// Tampilkan status aman
lcd.setCursor(0, 1);
lcd.print("Status: Aman ");
}
// Kirim sudut ke Serial Monitor
Serial.print("Sudut: ");
Serial.print(angle);
Serial.println(" derajat");
delay(100); // Delay untuk stabilitas tampilan
}