// ESP32 setting time without NTP
// This example from Wokwi was modified using information from the following article:
// https://www.theelectronics.co.in/2022/04/how-to-use-internal-rtc-of-esp32.html
//
// Djordje Herceg, 30.4.2024.
//
// This program recognizes two commands passed over Serial:
// ntp - obtain time from an NTP server
// time - manually set a fixed time
// UNIX time (long int) - manually set time, for example "1714502332"
//
// Keep in mind that, according to the documentation, once configTime
// is called, the time will be synchronized from the NTP server every hour.
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ESP32Time
#include <ESP32Time.h>
ESP32Time rtc(3600);
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 0
#define UTC_OFFSET_DST 0
void spinner() {
// this is just for decoration while WiFi is connecting
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
LCD.setCursor(15, 1);
LCD.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
LCD.setCursor(0, 1);
LCD.println("Connection Err");
return;
}
// this uses the strftime function: https://cplusplus.com/reference/ctime/strftime/
LCD.setCursor(8, 0);
LCD.println(&timeinfo, "%H:%M:%S");
LCD.setCursor(0, 1);
LCD.println(&timeinfo, "%d/%m/%Y %Z");
}
void setup() {
Serial.begin(115200);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 1);
LCD.print("WiFi ");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
spinner();
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("Send 'ntp' or 'time' to set network or predefined time");
Serial.println("Send UNIX time (long int) to set time (for example, 1714505889");
LCD.clear();
//LCD.setCursor(0, 0);
//LCD.println("Online");
//LCD.setCursor(0, 1);
//LCD.println("Updating time...");
//configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}
String input;
void loop() {
printLocalTime();
// Process input over Serial
if (Serial.available())
{
input = Serial.readStringUntil(10);
if (input == "ntp"){
Serial.println("NTP GET TIME");
LCD.setCursor(0, 0);
LCD.println("NTP ");
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}
else if (input == "time"){
Serial.println("MANUAL TIME"); // can't set manual time before 2017
LCD.setCursor(0, 0);
LCD.println("Manual ");
rtc.setTime(0, 15, 18, 1, 1, 2017); // get your flux capacitor ready
}
else {
Serial.println("UNIX TIME");
LCD.setCursor(0, 0);
LCD.println("Unix ");
long a = atol(input.c_str()); // atol means "ASCII to long"
if (a > 0) {
rtc.setTime(a);
}
}
}
delay(100);
}