123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- /*
- Simple.ino, Example for the AutoConnect library.
- Copyright (c) 2018, Hieromon Ikasamo
- https://github.com/Hieromon/AutoConnect
- This software is released under the MIT License.
- https://opensource.org/licenses/MIT
- */
- #if defined(ARDUINO_ARCH_ESP8266)
- #include <ESP8266WiFi.h>
- #include <ESP8266WebServer.h>
- #elif defined(ARDUINO_ARCH_ESP32)
- #include <WiFi.h>
- #include <WebServer.h>
- #endif
- #include <time.h>
- #include <AutoConnect.h>
- static const char AUX_TIMEZONE[] PROGMEM = R"(
- {
- "title": "TimeZone",
- "uri": "/timezone",
- "menu": true,
- "element": [
- {
- "name": "caption",
- "type": "ACText",
- "value": "Sets the time zone to get the current local time.",
- "style": "font-family:Arial;font-weight:bold;text-align:center;margin-bottom:10px;color:DarkSlateBlue"
- },
- {
- "name": "timezone",
- "type": "ACSelect",
- "label": "Select TZ name",
- "option": [],
- "selected": 10
- },
- {
- "name": "newline",
- "type": "ACElement",
- "value": "<br>"
- },
- {
- "name": "start",
- "type": "ACSubmit",
- "value": "OK",
- "uri": "/start"
- }
- ]
- }
- )";
- typedef struct {
- const char* zone;
- const char* ntpServer;
- int8_t tzoff;
- } Timezone_t;
- static const Timezone_t TZ[] = {
- { "Europe/London", "europe.pool.ntp.org", 0 },
- { "Europe/Berlin", "europe.pool.ntp.org", 1 },
- { "Europe/Helsinki", "europe.pool.ntp.org", 2 },
- { "Europe/Moscow", "europe.pool.ntp.org", 3 },
- { "Asia/Dubai", "asia.pool.ntp.org", 4 },
- { "Asia/Karachi", "asia.pool.ntp.org", 5 },
- { "Asia/Dhaka", "asia.pool.ntp.org", 6 },
- { "Asia/Jakarta", "asia.pool.ntp.org", 7 },
- { "Asia/Manila", "asia.pool.ntp.org", 8 },
- { "Asia/Tokyo", "asia.pool.ntp.org", 9 },
- { "Australia/Brisbane", "oceania.pool.ntp.org", 10 },
- { "Pacific/Noumea", "oceania.pool.ntp.org", 11 },
- { "Pacific/Auckland", "oceania.pool.ntp.org", 12 },
- { "Atlantic/Azores", "europe.pool.ntp.org", -1 },
- { "America/Noronha", "south-america.pool.ntp.org", -2 },
- { "America/Araguaina", "south-america.pool.ntp.org", -3 },
- { "America/Blanc-Sablon", "north-america.pool.ntp.org", -4},
- { "America/New_York", "north-america.pool.ntp.org", -5 },
- { "America/Chicago", "north-america.pool.ntp.org", -6 },
- { "America/Denver", "north-america.pool.ntp.org", -7 },
- { "America/Los_Angeles", "north-america.pool.ntp.org", -8 },
- { "America/Anchorage", "north-america.pool.ntp.org", -9 },
- { "Pacific/Honolulu", "north-america.pool.ntp.org", -10 },
- { "Pacific/Samoa", "oceania.pool.ntp.org", -11 }
- };
- #if defined(ARDUINO_ARCH_ESP8266)
- ESP8266WebServer Server;
- #elif defined(ARDUINO_ARCH_ESP32)
- WebServer Server;
- #endif
- AutoConnect Portal(Server);
- AutoConnectConfig Config; // Enable autoReconnect supported on v0.9.4
- AutoConnectAux Timezone;
- void rootPage() {
- String content =
- "<html>"
- "<head>"
- "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"
- "<script type=\"text/javascript\">"
- "setTimeout(\"location.reload()\", 1000);"
- "</script>"
- "</head>"
- "<body>"
- "<h2 align=\"center\" style=\"color:blue;margin:20px;\">Hello, world</h2>"
- "<h3 align=\"center\" style=\"color:gray;margin:10px;\">{{DateTime}}</h3>"
- "<p style=\"text-align:center;\">Reload the page to update the time.</p>"
- "<p></p><p style=\"padding-top:15px;text-align:center\">" AUTOCONNECT_LINK(COG_24) "</p>"
- "</body>"
- "</html>";
- static const char *wd[7] = { "Sun","Mon","Tue","Wed","Thr","Fri","Sat" };
- struct tm *tm;
- time_t t;
- char dateTime[26];
- t = time(NULL);
- tm = localtime(&t);
- sprintf(dateTime, "%04d/%02d/%02d(%s) %02d:%02d:%02d.",
- tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
- wd[tm->tm_wday],
- tm->tm_hour, tm->tm_min, tm->tm_sec);
- content.replace("{{DateTime}}", String(dateTime));
- Server.send(200, "text/html", content);
- }
- void startPage() {
- // Retrieve the value of AutoConnectElement with arg function of WebServer class.
- // Values are accessible with the element name.
- String tz = Server.arg("timezone");
- for (uint8_t n = 0; n < sizeof(TZ) / sizeof(Timezone_t); n++) {
- String tzName = String(TZ[n].zone);
- if (tz.equalsIgnoreCase(tzName)) {
- configTime(TZ[n].tzoff * 3600, 0, TZ[n].ntpServer);
- Serial.println("Time zone: " + tz);
- Serial.println("ntp server: " + String(TZ[n].ntpServer));
- break;
- }
- }
- // The /start page just constitutes timezone,
- // it redirects to the root page without the content response.
- Server.sendHeader("Location", String("http://") + Server.client().localIP().toString() + String("/"));
- Server.send(302, "text/plain", "");
- Server.client().flush();
- Server.client().stop();
- }
- void setup() {
- delay(1000);
- Serial.begin(115200);
- Serial.println();
- // Enable saved past credential by autoReconnect option,
- // even once it is disconnected.
- Config.autoReconnect = true;
- Portal.config(Config);
- // Load aux. page
- Timezone.load(AUX_TIMEZONE);
- // Retrieve the select element that holds the time zone code and
- // register the zone mnemonic in advance.
- AutoConnectSelect& tz = Timezone["timezone"].as<AutoConnectSelect>();
- for (uint8_t n = 0; n < sizeof(TZ) / sizeof(Timezone_t); n++) {
- tz.add(String(TZ[n].zone));
- }
- Portal.join({ Timezone }); // Register aux. page
- // Behavior a root path of ESP8266WebServer.
- Server.on("/", rootPage);
- Server.on("/start", startPage); // Set NTP server trigger handler
- // Establish a connection with an autoReconnect option.
- if (Portal.begin()) {
- Serial.println("WiFi connected: " + WiFi.localIP().toString());
- }
- }
- void loop() {
- Portal.handleClient();
- }
|