/*
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>
# if defined(ARDUINO_ARCH_ESP8266)
ESP8266WebServer Server ;
# elif defined(ARDUINO_ARCH_ESP32)
WebServer Server ;
# endif
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 " : [ ]
} ,
{
" 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 }
} ;
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 \" > "
" </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 . getElement < AutoConnectSelect > ( " timezone " ) ;
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 ( ) ;
}