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 *