diff --git a/app_httpd.cpp b/app_httpd.cpp
index 5facbcc..6d14fbe 100644
--- a/app_httpd.cpp
+++ b/app_httpd.cpp
@@ -31,6 +31,7 @@
// Functions from the main .ino
extern void flashLED(int flashtime);
extern void setLamp(int newVal);
+extern void printLocalTime(bool extraData);
// External variables declared in the main .ino
extern char myName[];
@@ -56,6 +57,7 @@ extern bool autoLamp;
extern bool filesystem;
extern String critERR;
extern bool debugData;
+extern bool haveTime;
extern int sketchSize;
extern int sketchSpace;
extern String sketchMD5;
@@ -73,15 +75,14 @@ static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %
httpd_handle_t stream_httpd = NULL;
httpd_handle_t camera_httpd = NULL;
-
void serialDump() {
- Serial.println("\r\nPreferences file: ");
- dumpPrefs(SPIFFS);
- if (critERR.length() > 0) {
- Serial.printf("\r\n\r\nA critical error has occurred when initialising Camera Hardware, see startup megssages\r\n");
- }
+ Serial.println();
// Module
Serial.printf("Name: %s\r\n", myName);
+ if (haveTime) {
+ Serial.print("Time: ");
+ printLocalTime(true);
+ }
Serial.printf("Firmware: %s (base: %s)\r\n", myVer, baseVersion);
float sketchPct = 100 * sketchSize / sketchSpace;
Serial.printf("Sketch Size: %i (total: %i, %.1f%% used)\r\n", sketchSize, sketchSpace, sketchPct);
@@ -123,9 +124,15 @@ void serialDump() {
Serial.printf("Freq: %i MHz\r\n", ESP.getCpuFreqMHz());
Serial.printf("Heap: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap());
Serial.printf("Psram: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram());
+ // Filesystems
if (filesystem) {
Serial.printf("Spiffs: %i, used: %i\r\n", SPIFFS.totalBytes(), SPIFFS.usedBytes());
}
+ Serial.println("Preferences file: ");
+ dumpPrefs(SPIFFS);
+ if (critERR.length() > 0) {
+ Serial.printf("\r\n\r\nA critical error has occurred when initialising Camera Hardware, see startup megssages\r\n");
+ }
Serial.println();
return;
}
@@ -522,6 +529,15 @@ static esp_err_t dump_handler(httpd_req_t *req){
// System
d+= sprintf(d,"
System
\n");
+ if (haveTime) {
+ struct tm timeinfo;
+ if(getLocalTime(&timeinfo)){
+ char timeStringBuff[50]; //50 chars should be enough
+ strftime(timeStringBuff, sizeof(timeStringBuff), "%H:%M:%S, %A, %B %d %Y", &timeinfo);
+ //print like "const char*"
+ d+= sprintf(d,"Time: %s
\n", timeStringBuff);
+ }
+ }
int64_t sec = esp_timer_get_time() / 1000000;
int64_t upDays = int64_t(floor(sec/86400));
int upHours = int64_t(floor(sec/3600)) % 24;
diff --git a/esp32-cam-webserver.ino b/esp32-cam-webserver.ino
index ec1805a..2656748 100644
--- a/esp32-cam-webserver.ino
+++ b/esp32-cam-webserver.ino
@@ -5,6 +5,7 @@
#include
#include
#include "src/parsebytes.h"
+#include "time.h"
/* This sketch is a extension/expansion/reork of the 'official' ESP32 Camera example
@@ -170,6 +171,17 @@ const int pwmMax = pow(2,pwmresolution)-1;
bool otaEnabled = true;
#endif
+#if defined(NTPSERVER)
+ bool haveTime = true;
+ const char* ntpServer = NTPSERVER;
+ const long gmtOffset_sec = NTP_GMT_OFFSET;
+ const int daylightOffset_sec = NTP_DST_OFFSET;
+#else
+ bool haveTime = false;
+ const char* ntpServer = "";
+ const long gmtOffset_sec = 0;
+ const int daylightOffset_sec = 0;
+#endif
// Critical error string; if set during init (camera hardware failure) it
// will be returned for all http requests
@@ -226,6 +238,18 @@ void setLamp(int newVal) {
}
}
+void printLocalTime(bool extraData=false) {
+ struct tm timeinfo;
+ if(!getLocalTime(&timeinfo)){
+ Serial.println("Failed to obtain time");
+ } else {
+ Serial.println(&timeinfo, "%H:%M:%S, %A, %B %d %Y");
+ }
+ if (extraData) {
+ Serial.printf("NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec);
+ }
+}
+
void WifiSetup() {
// Feedback that we are now attempting to connect
flashLED(300);
@@ -642,6 +666,15 @@ void setup() {
Serial.println("OTA is disabled");
}
+ // Set time via NTP server when enabled
+ if (haveTime) {
+ Serial.print("Time: ");
+ configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
+ printLocalTime(true);
+ } else {
+ Serial.println("Time functions disabled");
+ }
+
// Now we have a network we can start the two http handlers for the UI and Stream.
startCameraServer(httpPort, streamPort);
@@ -672,8 +705,6 @@ void setup() {
} else {
Serial.printf("\r\nCamera unavailable due to initialisation errors.\r\n\r\n");
}
- Serial.print("\r\nThis is the 4.0 alpha\r\n - Face detection has been removed!\r\n");
-
// Used when dumping status; these are slow functions, so just do them once during startup
sketchSize = ESP.getSketchSize();
@@ -682,6 +713,9 @@ void setup() {
// As a final init step chomp out the serial buffer in case we have recieved mis-keys or garbage during startup
while (Serial.available()) Serial.read();
+
+ // While in Beta; Warn!
+ Serial.print("\r\nThis is the 4.0 alpha\r\n - Face detection has been removed!\r\n");
}
void loop() {
diff --git a/myconfig.sample.h b/myconfig.sample.h
index d979764..ecdc1dc 100644
--- a/myconfig.sample.h
+++ b/myconfig.sample.h
@@ -113,6 +113,19 @@ struct station stationList[] = {{"ssid1", "pass1", true},
*/
// #define OTA_PASSWORD "SuperVisor"
+/* NTP
+ * Uncomment the following to enable the on-board clock
+ * Pick a nearby pool server from: https://www.ntppool.org/zone/@
+ * Set the GMT offset to match your timezone IN SECONDS;
+ * see https://en.wikipedia.org/wiki/List_of_UTC_time_offsets
+ * 1hr = 3600 seconds; do the math ;-)
+ * Default is CET (Central European Time), eg GMT + 1hr
+ * The DST offset is usually 1 hour (again, in seconds) if used in your country.
+ */
+//#define NTPSERVER ".pool.ntp.org"
+//#define NTP_GMT_OFFSET 3600
+//#define NTP_DST_OFFSET 3600
+
/*
* Camera Defaults
*