#include <WiFi.h>
#include <WiFiUdp.h>
#include <TM1637Display.h>
#include <time.h>
// Set your network credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
#define REMIND_H 21
#define REMIND_M 30
#define RESET_H 0
#define RESET_M 0
// TM1637 connections
#define CLK 4 // GPIO 4 for CLK
#define DIO 5 // GPIO 5 for DIO
TM1637Display display(CLK, DIO);
// Reminder flag
bool reminderActive = false;
void setup() {
Serial.begin(115200);
delay(100);
Serial.println();
Serial.println("Starting up...");
display.setBrightness(0x0f); // Brightness: 0x00 (dim) to 0x0f (bright)
display.showNumberDec(8888); // Show something on display for a second
delay(1000);
Serial.print("Connecting to Wi-Fi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
attempts++;
if (attempts > 20) {
Serial.println("\nWi-Fi connection failed.");
return;
}
}
Serial.println("\nWi-Fi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Get time from NTP server
configTime(0, 0, "pool.ntp.org", "time.nist.gov");
setenv("TZ", "IST-2IDT,M3.4.4/26,M10.5.0", 1); // Israel DST rule
tzset();
Serial.println("Waiting for NTP time sync...");
while (time(nullptr) < 100000) {
delay(500);
Serial.print("#");
}
Serial.println("\nTime synchronized!");
reminderActive = false;
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
int hour = p_tm->tm_hour; // Use 24-hour format for comparison
int minute = p_tm->tm_min;
// Check for reminder trigger at 7:30 PM (19:30)
if (hour == REMIND_H && minute == REMIND_M && !reminderActive) {
reminderActive = true;
Serial.println("Reminder triggered!");
}
// Reset reminder at midnight
if (hour == RESET_H && minute == RESET_M && reminderActive) {
reminderActive = false;
Serial.println("Reminder flag reset.");
}
// Prepare display (12-hour format)
int displayHour = p_tm->tm_hour % 12;
if (displayHour == 0) displayHour = 12;
// Prepare digit array
uint8_t data[4];
if (displayHour < 10) {
data[0] = 0x00; // blank first digit
data[1] = display.encodeDigit(displayHour);
} else {
data[0] = display.encodeDigit(displayHour / 10);
data[1] = display.encodeDigit(displayHour % 10);
}
data[2] = display.encodeDigit(minute / 10);
data[3] = display.encodeDigit(minute % 10);
// Turn on colon
data[1] |= 0b10000000;
// Handle display based on reminder state
if (reminderActive) {
// Flash display by toggling on/off every 500ms
if (millis() % 1000 < 500) {
display.setSegments(data); // Show time
} else {
display.clear(); // Blank display
}
} else {
display.setSegments(data); // Show time normally
}
// Serial debug
Serial.printf("Current time: %d:%02d, Reminder: %s\n", displayHour, minute, reminderActive ? "ON" : "OFF");
delay(100);
}