#include <Wire.h>
#include <RTClib.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
RTC_DS3231 rtc;
DHT dht(7, DHT22); // Pin data 7 untuk sensor DHT22
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C dan ukuran LCD 20x4
const int startButtonPin = 2; // Pin untuk tombol start
const int backButtonPin = 3; // Pin untuk tombol back
const int viewTimeButtonPin = 4; // Pin untuk tombol melihat waktu
const int buzzerPin = 8; // Pin untuk buzzer
enum DisplayMode {
SENSOR_DATA,
MONITORING_DATA
};
DateTime startTime; // Variabel untuk menyimpan waktu awal
const long interval = 16 * 60 * 60; // Waktu interval 16 jam dalam detik
bool isMonitoring = false;
bool buzzerActive = false;
DisplayMode currentMode = SENSOR_DATA;
void setup() {
pinMode(startButtonPin, INPUT_PULLUP);
pinMode(backButtonPin, INPUT_PULLUP);
pinMode(viewTimeButtonPin, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
Serial.begin(9600);
lcd.begin(20, 4);
lcd.backlight();
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
dht.begin();
}
void loop() {
int startButtonState = digitalRead(startButtonPin);
int backButtonState = digitalRead(backButtonPin);
int viewTimeButtonState = digitalRead(viewTimeButtonPin);
if (viewTimeButtonState == LOW) {
Serial.println("View time button pressed");
currentMode = SENSOR_DATA;
displayData();
delay(2000); // Tampilkan data untuk sementara waktu sebelum kembali ke mode awal
}
if (startButtonState == LOW && !isMonitoring) {
Serial.println("Start button pressed");
startMonitoring();
}
if (backButtonState == LOW) {
Serial.println("Back button pressed");
switchMode();
}
if (isMonitoring) {
DateTime currentTime = rtc.now();
long elapsedTime = currentTime.unixtime() - startTime.unixtime();
if (elapsedTime >= interval) {
Serial.println("Monitoring completed");
buzzerActive = true;
isMonitoring = false; // Menghentikan monitoring setelah 16 jam
switchMode(); // Kembali ke mode awal setelah monitoring selesai
}
}
if (buzzerActive) {
activateBuzzer();
}
displayData();
delay(1000); // Delay agar tidak terlalu sering menampilkan waktu
}
void startMonitoring() {
isMonitoring = true;
startTime = rtc.now(); // Set waktu awal
buzzerActive = false;
currentMode = MONITORING_DATA;
}
void activateBuzzer() {
Serial.println("Buzzer activated");
digitalWrite(buzzerPin, HIGH);
delay(1000);
digitalWrite(buzzerPin, LOW);
buzzerActive = false;
}
void switchMode() {
if (currentMode == SENSOR_DATA) {
currentMode = MONITORING_DATA;
} else {
currentMode = SENSOR_DATA;
}
}
void displayData() {
lcd.clear();
if (currentMode == SENSOR_DATA) {
displaySensorData();
} else {
displayMonitoringData();
}
}
void displaySensorData() {
lcd.setCursor(0, 0);
lcd.print("S: ");
lcd.print(dht.readTemperature());
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("P: ");
lcd.print(dht.readHumidity());
lcd.print("%");
}
void displayMonitoringData() {
DateTime currentTime = rtc.now();
DateTime endTime = startTime + TimeSpan(0, 16, 0, 0);
lcd.setCursor(0, 0);
lcd.print("S: ");
lcd.print(dht.readTemperature());
lcd.print("C");
lcd.setCursor(8, 0);
lcd.print("P: ");
lcd.print(dht.readHumidity());
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Now: ");
lcd.print(currentTime.hour(), DEC);
lcd.print(':');
lcd.print(currentTime.minute(), DEC);
lcd.setCursor(0, 3);
lcd.print("End: ");
lcd.print(endTime.hour(), DEC);
lcd.print(':');
lcd.print(endTime.minute(), DEC);
}