#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <TM1637Display.h>
#include "DHT.h"
#include <Wire.h>
#include <RTClib.h>
// Constants
#define DHTPIN 21 // DHT22 data pin
#define DHTTYPE DHT22 // DHT22 sensor type
#define CLK_PIN 27 // TM1637 clock pin
#define DIO_PIN 26 // TM1637 data pin
#define RTC_PIN 4 // RTC data pin
#define BUTTON_PIN_JAM 14 // Jam button pin
#define BUTTON_PIN_MENIT 12 // Menit button pin
#define BUTTON_PIN_ALARM 13 // Alarm button pin
// Initialize DHT sensor
DHT dht(DHTPIN, DHTTYPE);
// Initialize RTC
RTC_DS3231 rtc;
// Initialize TM1637
TM1637Display display(CLK_PIN, DIO_PIN);
// Initialize NTP client
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 25200);
// Variables
int jam = 0;
int menit = 0;
int alarm_jam = 0;
int alarm_menit = 0;
int suhu = 0;
int kelembaban = 0;
bool alarm_on = false;
void setup() {
// Initialize serial communication
Serial.begin(115200);
// Connect to WiFi network
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
// Initialize NTP client
timeClient.begin();
// Initialize DHT sensor
dht.begin();
// Initialize RTC
Wire.begin();
rtc.begin();
// Set initial time (from NTP server)
configTime(25200, 0, "pool.ntp.org");
timeClient.update();
rtc.adjust(DateTime(timeClient.getEpochTime()));
// Set initial display
display.setBrightness(0x0f);
display.showNumberDec(jam * 100 + menit);
// Initialize button inputs
pinMode(BUTTON_PIN_JAM, INPUT_PULLUP);
pinMode(BUTTON_PIN_MENIT, INPUT_PULLUP);
pinMode(BUTTON_PIN_ALARM, INPUT_PULLUP);
// Set up interrupt service routine for buttons
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_JAM), interruptHandlerJam, FALLING);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_MENIT), interruptHandlerMenit, FALLING);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN_ALARM), interruptHandlerAlarm, FALLING);
}
void loop() {
// Update time (from NTP server)
timeClient.update();
rtc.adjust(DateTime(timeClient.getEpochTime()));
// Get current time
DateTime now = rtc.now();
jam = now.hour();
menit = now.minute();
// Get temperature and humidity
suhu = dht.readTemperature();
kelembaban = dht.readHumidity();
// Check if alarm time has been reached
if (alarm_on && jam == alarm_jam && menit == alarm_menit) {
Serial.println("Alarm on!");
// Add alarm behavior here
}
// Display current time and temperature
display.showNumberDec(jam * 100 + menit);
delay(1000);
display.showNumberDec(suhu);
delay(1000);
display.showNumberDec(kelembaban);
delay(1000);
}
// Interrupt service routine for changing hour
void interruptHandlerJam() {
if (jam == 23) {
jam = 0;
} else {
jam++;
}
display.showNumberDec(jam * 100 + menit);
}
// Interrupt service routine for changing minute
void interruptHandlerMenit() {
if (menit == 59) {
menit = 0;
} else {
menit++;
}
display.showNumberDec(jam * 100 + menit);
}
// Interrupt service routine for setting alarm
void interruptHandlerAlarm() {
alarm_on = !alarm_on;
if (alarm_on) {
// Set alarm time to current time
alarm_jam = jam;
alarm_menit = menit;
Serial.println("Alarm set for " + String(alarm_jam) + ":" + String(alarm_menit));
} else {
Serial.println("Alarm off");
}
}