#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <ESP32Servo.h> // Library untuk motor servo
#include <OneWire.h>
#include <DallasTemperature.h>
// Inisialisasi pin untuk sensor DS18B20
#define ONE_WIRE_BUS 4 // Tentukan pin data DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Inisialisasi keypad
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {32, 33, 25, 26};
byte colPins[COLS] = {27, 14, 12, 13};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Pin untuk buzzer
const int buzzerPin = 5;
// Inisialisasi Servo
Servo servoMotor;
const int servoPin = 18; // Pin GPIO untuk servo
int servoPos = 0; // Posisi awal servo
bool isInitialMessageDisplayed = false;
unsigned long previousMillis = 0;
const long displayDelay = 1000;
// Variabel input suhu
String suhuInput = "";
int suhuTarget = 80; // Default suhu yang diinginkan
bool inputSuhuSelesai = false;
// Variabel input timer
String timerInput = "";
int timer = 10;
bool inputTimerSelesai = false;
// Variabel untuk countdown timer
unsigned long countdownStartMillis = 0;
bool countdownActive = false;
void setup() {
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Pengering");
lcd.setCursor(0, 1);
lcd.print("Maggot BSF");
previousMillis = millis();
// Inisialisasi pin buzzer sebagai output
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin, LOW);
// Inisialisasi motor servo
servoMotor.attach(servoPin);
servoMotor.write(servoPos); // Posisi awal servo
// Inisialisasi sensor DS18B20
sensors.begin();
}
void loop() {
if (!isInitialMessageDisplayed && millis() - previousMillis >= displayDelay) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input Suhu (");
lcd.print((char)223);
lcd.print("C):");
lcd.setCursor(0, 1);
lcd.print("Default: 80");
isInitialMessageDisplayed = true;
}
// Input suhu
if (isInitialMessageDisplayed && !inputSuhuSelesai) {
char key = keypad.getKey();
if (key) {
if (key == '#') {
if (suhuInput == "") {
suhuTarget = 80;
} else {
suhuTarget = suhuInput.toInt();
}
if (suhuTarget >= 1 && suhuTarget <= 120) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input Timer (m):");
lcd.setCursor(0, 1);
lcd.print("Default: 10");
inputSuhuSelesai = true;
} else {
lcd.setCursor(0, 1);
lcd.print("Invalid! (1-120)");
suhuInput = "";
}
} else if (key == '*') {
suhuInput = "";
lcd.setCursor(0, 1);
lcd.print(" ");
} else if (key >= '0' && key <= '9') {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
suhuInput += key;
lcd.print(suhuInput);
}
}
}
// Input timer
if (inputSuhuSelesai && !inputTimerSelesai) {
char key = keypad.getKey();
if (key) {
if (key == '#') {
if (timerInput == "") {
timer = 10;
} else {
timer = timerInput.toInt();
}
if (timer >= 0 && timer <= 999) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Konfirm: #Y *N:");
lcd.setCursor(0, 1);
lcd.print(suhuTarget);
lcd.print((char)223);
lcd.print("C");
lcd.print("|");
lcd.print(timer);
lcd.print(" menit");
inputTimerSelesai = true;
} else {
lcd.setCursor(0, 1);
lcd.print("Invalid! (0-999)");
timerInput = "";
}
} else if (key == '*') {
timerInput = "";
lcd.setCursor(0, 1);
lcd.print(" ");
} else if (key >= '0' && key <= '9') {
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
timerInput += key;
lcd.print(timerInput);
}
}
}
// Konfirmasi input suhu dan timer
if (inputTimerSelesai) {
char key = keypad.getKey();
if (key == '#') {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(suhuTarget);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Timer: ");
lcd.print(timer);
lcd.print(" menit");
countdownStartMillis = millis();
countdownActive = true;
} else if (key == '*') {
// Reset input suhu dan timer
suhuInput = "";
timerInput = "";
inputSuhuSelesai = false;
inputTimerSelesai = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input Suhu (");
lcd.print((char)223);
lcd.print("C):");
lcd.setCursor(0, 1);
lcd.print("Default: 80");
}
}
// Countdown timer dengan pembacaan suhu
if (countdownActive) {
unsigned long currentMillis = millis();
int elapsedMinutes = (currentMillis - countdownStartMillis) / 60000;
int remainingMinutes = timer - elapsedMinutes;
// Baca suhu dari sensor DS18B20
sensors.requestTemperatures(); // Meminta pembacaan suhu
float suhuAktual = sensors.getTempCByIndex(0); // Membaca suhu dalam Celsius
if (remainingMinutes <= 0) {
countdownActive = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Timer selesai!");
// Matikan servo setelah countdown selesai
servoMotor.write(0); // Servo kembali ke posisi awal
} else {
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(suhuAktual); // Tampilkan suhu aktual
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Timer: ");
lcd.print(remainingMinutes);
lcd.print(" menit");
// Logika servo menyala atau mati berdasarkan suhu aktual
if (suhuAktual < suhuTarget) {
servoMotor.write(90); // Nyalakan servo (posisi 90 derajat)
} else {
servoMotor.write(0); // Matikan servo (posisi 0 derajat)
}
}
}
}