#include <WiFi.h>
#include "time.h"
#include <PubSubClient.h>
#include<WiFiClient.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
WiFiClient espclient;
PubSubClient client(espclient);
const char* broker = "test.mosquitto.org";
int port = 1883;
const char* ntpServer1 = "pool.ntp.org";
const char* time_zone = "IST-5:30";
String timestamp;
unsigned long startTime = 0; // Start time of the countdown
unsigned long countdownDuration = 0; // Countdown duration in milliseconds
const char *resetClockTopic = "sanu/resetClock";
const char *setTimerTopic = "sanu/setTimer";
const char *resetTimerTopic = "sanu/resetTimer";
const char *stopTimerTopic = "sanu/stopTimer";
const char *pauseTimerTopic = "sanu/pauseTimer";
const char *startTimerTopic = "sanu/startTimer";
bool timerRunning = false;
#define buzzer 15
unsigned int pauseInstance = 0;
unsigned int startInstance = 0;
unsigned int pauseDuration = 0;
void setup()
{
Serial.begin(115200);
pinMode(buzzer, OUTPUT);
// configTzTime(time_zone, ntpServer1);
lcd.init();
lcd.backlight();
//connect to WiFi
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
configTzTime(time_zone, ntpServer1);
client.setServer(broker, port);
if ( client.connect("timer13")) {
Serial.println("mqtt connected");
}
client.setCallback(callback);
client.subscribe(resetClockTopic);
client.subscribe(setTimerTopic);
client.subscribe(resetTimerTopic);
client.subscribe(stopTimerTopic);
client.subscribe(pauseTimerTopic);
client.subscribe(startTimerTopic);
}
void loop()
{
delay(1000);
printLocalTime();
client.loop();
if (timerRunning) {
updateTimer();
}
// client.publish("sanu/ist", timestamp.c_str());//working
configTzTime(time_zone, ntpServer1);
}
void printLocalTime()
{
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
lcd.setCursor(0, 0);
lcd.print("Please wait...");
return;
}
char printBuffer[100];
sprintf(printBuffer, "Year %d, Month %d, Day %d, Hour %d, Min %d, Sec %d",
timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday,
timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
// Serial.println(printBuffer);
strftime(printBuffer, 100, "%A, %B %d %Y %H:%M:%S", &timeinfo);
// Serial.println(printBuffer);
timestamp = String(timeinfo.tm_year + 1900) + "-" + String(timeinfo.tm_mon + 1) + "-" + String(timeinfo.tm_mday) + ":" + String(timeinfo.tm_hour) + "-" + String(timeinfo.tm_min) + "-" + String(timeinfo.tm_sec);
// Serial.println(timestamp);
// lcd.clear();
lcd.setCursor(0, 0);
lcd.print(String(timeinfo.tm_hour) + ":" + String(timeinfo.tm_min)+ ":" + String(timeinfo.tm_sec) + " " + String(timeinfo.tm_mday) + "/" + String(timeinfo.tm_mon + 1) + "/" + String((timeinfo.tm_year + 1900) - 2000));
}
void callback(char *topic, byte *payload, unsigned int length) {
// Serial.println("Inside callback...");
// Serial.print("Message arrived on topic [");
// Serial.print(topic);
// Serial.print("] Payload: ");
// for (int i = 0; i < length; i++) {
// Serial.print((char)payload[i]);
// }
Serial.println();
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
if (String(topic) == resetClockTopic) {
if (message == "reset") {
Serial.println("Resetting ESP32...");
lcd.clear();
delay(1000);
ESP.restart(); // Perform a software reset
}
}
else if (String(topic) == setTimerTopic) {
unsigned long newDuration = message.toInt();
if (newDuration > 0) {
countdownDuration = newDuration;
startTime = millis();
timerRunning = true;
lcd.clear();
lcd.setCursor(0, 3);
lcd.print("Exam Started...");
// Serial.println("Timer set for " + String(countdownDuration) + " milliseconds");
}
}
else if (String(topic) == resetTimerTopic) {
if (message == "reset") {
lcd.setCursor(0, 1);
lcd.print("CD:");
lcd.print("00");
lcd.print(":");
lcd.print("00");
lcd.print(":");
lcd.print("00");
timerRunning = false;
lcd.setCursor(0, 3);
lcd.print("Timer reseted.......");
}
}
else if (String(topic) == pauseTimerTopic) {
if (message == "pause") {
pauseInstance = 0;
pauseDuration = 0;
timerRunning = false;
pauseInstance = millis();
}
}
else if (String(topic) == startTimerTopic) {
if (message == "start") {
startInstance = 0;
startInstance = millis();
pauseDuration = startInstance - pauseInstance;
timerRunning = true;
}
}
}
void updateTimer() {
unsigned long elapsedTime = millis() - startTime;
long remainingTime = countdownDuration - elapsedTime + pauseDuration;
if (remainingTime <= 0) {
// Timer expired
timerRunning = false;
lcd.setCursor(0, 3);
lcd.print("Time UP.........");
for (int i = 0; i < 5; i++) {
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
delay(500);
}
// pauseDuration = 0;
}
else {
// Display remaining time on LCD
int seconds1 = remainingTime / 1000;
int minutes1 = seconds1 / 60;
int hours1 = minutes1 / 60;
minutes1 = minutes1 % 60;
seconds1 = seconds1 % 60;
lcd.setCursor(0, 1);
lcd.print("CD:");
lcd.print(hours1);
lcd.print(":");
lcd.print(minutes1);
lcd.print(":");
if (seconds1 < 10) {
lcd.print("0");
}
lcd.print(seconds1);
}
}