#include <NTPClient.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
//Wifi related
const char* ssid = "Wokwi-GUEST";
const char* password = "";
//Button related
const uint8_t button_left = 0, button_right = 1, button_switch = 2, button_interval = 100;
uint32_t button_timer_previous = 0;
//Timer related
const unsigned int timer_interval = 1000; //in miliseconds
uint8_t seconds = 0;
uint32_t timer_previous = 0;
const uint16_t ntp_interval = 60;
//Functions
void ntpc_displayI2C();
void scanButton();
void checkHours();
//UART
void scanUART();
void check_messageUART();
String incomingMessage;
//LCD
LiquidCrystal_I2C lcd1(0x48, 20, 4);
//NTP related
int8_t UTC = 2, currentTimeHH, currentTimeMM, currentTimeSS;
WiFiUDP udp;
NTPClient ntpClient(udp, "pool.ntp.org", 0, 0);
const uint16_t one_hour = 3600; //in seconds
void setup()
{
//buttons
pinMode(button_left, INPUT_PULLDOWN);
pinMode(button_right, INPUT_PULLDOWN);
pinMode(button_switch, INPUT_PULLDOWN);
//UART
Serial.begin(115200);
Serial.println("UART GOOD");
//LCD
Wire.begin();
Serial.println("I2C GOOD");
lcd1.begin(20,4);
//WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("WiFi Connecting");
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.print(".");
}
Serial.println("WiFi GOOD");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("MAC Address: ");
Serial.println(WiFi.macAddress());
//NTP
ntpClient.begin();
ntpClient.setTimeOffset(one_hour*UTC);
//few hours later: IT WAS THE PROBLEM WITH VS CODE, IT DISCONNECTED
while (!ntpClient.update())
ntpClient.forceUpdate();
currentTimeHH = ntpClient.getHours();
currentTimeMM = ntpClient.getMinutes();
currentTimeSS = ntpClient.getSeconds();
Serial.println("TimeZone: UTC+2 (Kyiv)");
Serial.println("To set different TimeZone - type UTC, +-, your_desired-timezone, e.g.: UTC-4");
}
void loop()
{
scanUART();
ntpc_displayI2C();
scanButton();
}
void scanUART()
{
if (Serial.available())
{
incomingMessage = Serial.readString();
Serial.print("Incoming: ");
Serial.println(incomingMessage);
incomingMessage.toUpperCase();
check_messageUART();
incomingMessage = "";
}
}
void ntpc_displayI2C()
{
if (seconds == 59)
{
seconds = 0xFF;
ntpClient.forceUpdate();
currentTimeHH = ntpClient.getHours();
currentTimeMM = ntpClient.getMinutes();
currentTimeSS = ntpClient.getSeconds();
Serial.print("Current Time: ");
Serial.printf("%.2d:%.2d:%.2d", currentTimeHH, currentTimeMM, currentTimeSS);
Serial.println();
}
if ( (millis() - timer_previous) >= timer_interval)
{
seconds++;
lcd1.setCursor(0, 0);
lcd1.print("IP:");
lcd1.setCursor(4, 0);
if (WiFi.isConnected())
lcd1.print(WiFi.localIP());
else if (!WiFi.isConnected())
lcd1.print("Offline ");
lcd1.setCursor(0,1);
lcd1.print("Time: ");
lcd1.printf("%.2d:%.2d:%.2d", currentTimeHH, currentTimeMM, currentTimeSS);
lcd1.setCursor(0, 2);
lcd1.print("Timezone: UTC");
lcd1.printf("%+d ", UTC);
lcd1.setCursor(0, 3);
lcd1.print("Timer: ");
lcd1.printf("%.2d s", seconds);
timer_previous = millis();
}
}
void check_messageUART()
{
if (incomingMessage.indexOf("UTC") != -1)
{
//Get command into string to than convert it to int8_t
String temp = incomingMessage.substring(incomingMessage.indexOf("UTC")+3,incomingMessage.indexOf("UTC")+3+3);
if (temp.toInt() < -12 || temp.toInt() > 14) //Check if it's in UTC range
{
Serial.printf("The UTC%+d doesn't exist, try again.", temp.toInt());
Serial.println();
}
else
{
currentTimeHH -= UTC;
UTC = temp.toInt();
ntpClient.setTimeOffset(one_hour*UTC);
currentTimeHH += UTC;
checkHours();
Serial.print("TimeZone changed to UTC");
Serial.printf("%+d", UTC);
Serial.println();
Serial.print("Current Time: ");
Serial.printf("%.2d:%.2d:%.2d", currentTimeHH, currentTimeMM, currentTimeSS);
Serial.println();
}
}
}
void scanButton()
{
if ( (millis() - button_timer_previous) >= button_interval)
{
if (digitalRead(button_left))
{
UTC--;
currentTimeHH--;
if (UTC == -13)
{
UTC = 14; //from -12 to +14
currentTimeHH += 27; //26 + 1
}
checkHours();
ntpClient.setTimeOffset(one_hour*UTC);
Serial.print("TimeZone changed to UTC");
Serial.printf("%+d", UTC);
Serial.println();
Serial.print("Current Time: ");
Serial.printf("%.2d:%.2d:%.2d", currentTimeHH, currentTimeMM, currentTimeSS);
Serial.println();
button_timer_previous = millis();
}
else if (digitalRead(button_right)) // button pressed -> switch modes
{
UTC++;
currentTimeHH++;
if (UTC == 15)
{
UTC = -12; //from +14 to -12
currentTimeHH -= 27; //26 + 1
}
checkHours();
ntpClient.setTimeOffset(one_hour*UTC);
Serial.print("TimeZone changed to UTC");
Serial.printf("%+d", UTC);
Serial.println();
Serial.print("Current Time: ");
Serial.printf("%.2d:%.2d:%.2d", currentTimeHH, currentTimeMM, currentTimeSS);
Serial.println();
button_timer_previous = millis();
}
else if (digitalRead(button_switch))
{
if (WiFi.isConnected())
{
WiFi.disconnect();
Serial.print("WiFi Disconnecting");
button_timer_previous = millis();
while(WiFi.status() != WL_DISCONNECTED)
{
if((millis() - button_timer_previous) >= timer_interval)
{
Serial.print(".");
button_timer_previous = millis();
}
}
Serial.println();
Serial.println("WiFi Disconnected");
}
else if (!WiFi.isConnected())
{
WiFi.reconnect();
Serial.print("WiFi Connecting");
button_timer_previous = millis();
while (WiFi.status() != WL_CONNECTED)
{
if ( ( millis() - button_timer_previous) >= timer_interval)
{
Serial.print(".");
button_timer_previous = millis();
}
}
Serial.println();
Serial.println("WiFi Connected");
}
button_timer_previous = millis();
}
}
}
void checkHours()
{
if (currentTimeHH < 0)
currentTimeHH += 24;
else if (currentTimeHH >= 24)
currentTimeHH -= 24;
}Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1