/// ESP8266-WEBSERVER-RELE.ino /// `````````````````````````` #define _VERZE "MCH-20231218" // yyyymmdd /// /// ################################################################### /// ##################################################################### /// ## ## /// ## W I F I - W E B S E R V E R - R E L E ## /// ## ## /// ##################################################################### /// ################################################################### /// /// /// Jednoduchy priklad ovladani rele pres WiFi modul ESP8266 pomoci Web stranky, /// timto se veskere parametry kompiluji primo do programu a pouze je potreba: /// /// * dohrat si do Arduina prostredi knihovny WiFi a Web Serveru /// /// * prizpusobit uzivatele a heslo pro Web stranku /// /// * prizpusobit uzivatele a heslo pro WiFi spojeni /// /// * prizpusobit cislo I/O portu a polaritu pro Led indikaci WiFi spojeni /// /// * prizpusobit cislo I/O portu a polaritu pro Rele /// /// * pripadne prizpusobit si Web stranku jiz v tele funkce fnc_HTTP__Stranka(): /// * Nadpis stranky /// * Perioda obnovy stranky /// * Barvy, velikosti ... /// /// /// Po nahrani programu do ESB8266 a jeho restartu zacina pripojovani se k WiFi. /// Pripojovani je indikovano blikanim WiFi Led indikace v 1/2 sekundove periode. /// Je-li WiFi spojeni navazano, WiFi Led indikace setrvale sviti. Pri vypadku /// WiFi spojeni automaticky nastavaji pokusy opetovneho pripojovani, kdy WiFi Led /// indikace opet blika. /// /// Ovladaci rozhrani je voleno neinvazivni, kdy neni poreba do pocitace nebo /// mobilu dohravat specialni aplikace. Staci Web prohlizec a do jeho adresniho /// radku vlozit IP adresu pridelenou WiFi modulu jako http:// nikoli https:// /// Port :80 je standardni, netreba uvadet. /// /// Po odeslani se zobrazi prihlasovaci dialog Web stranky. Je-li spravne zadany /// uzivatel a heslo, zobrazi se ovladaci Web stranka. Je definovana i perioda /// automaticke obnovy Web stranky. /// /// Tvar ovladaci Web stranky: /// __________________________________ /// | | /// | ESP8266-WebServer-Rele | <- Nadpis Web Stranky /// | ----------- | /// | | Zapnout | | <- Zapinaci tlacitko Rele /// | ----------- | /// | ============= | /// | || Status || | <- Tlacitko dotazu a indikace stavu Rele /// | ============= | ( seda: vypnuto / zalena: zapnuto ) /// | ----------- | /// | | Vypnout | | <- Vypinaci tlacitko Rele /// | ----------- | /// | MCH-yyyymmdd | <- Verze definovana v zahlavi programu /// |__________________________________| /// /// #include "Arduino.h" #include #include /*** definice 1/2 sec. periody smycky, vychozi pro TimeOut navazovani WiFi spojeni ***/ uint16_t i_Interval_500ms; /*** definice Web Serveru ***/ ESP8266WebServer *_HTTP; const uint16_t i_Http_Stranka_Bytes = 2048; // max. velikost poskladane Web stranky char c_Http_Stranka[i_Http_Stranka_Bytes]; // prostor pro poskladanou Web stranku const uint16_t i_Http_Port = 80; // 80 je standardne pouzivany port Web stranek const char c_Http_Uzivatel[] = "uzivatel"; // pro opravneni pristupu na Web stranku const char c_Http_Heslo[] = "heslo"; // pro opravneni pristupu na Web stranku /*** definice WiFi rozhrani ***/ bool x_Wifi_Zap = true; // prednastaveno je automaticke navazovani WiFi spojeni uint8_t i_WiFi_TimeOut = 0; // inicializacni hodnota TimeOutu const uint8_t i_WiFi_TimeOut_Max = 90; // cyklicky TimeOut v sec. pri navazovani WiFi spojeni const char c_Wifi_Nazev[] = "Nazev_WiFi_Site"; const char c_Wifi_Heslo[] = "Heslo_WiFi_Site"; /*** definice WiFi Led indikace ***/ const uint8_t i_WiFi_Led_Port = 0; #define cmd_WIFI_LED_DEF pinMode( i_WiFi_Led_Port, OUTPUT_OPEN_DRAIN ) // spinani otevrenym kolektorem do 'L' #define cmd_WIFI_LED_ZAP digitalWrite( i_WiFi_Led_Port, false ) #define cmd_WIFI_LED_VYP digitalWrite( i_WiFi_Led_Port, true ) #define cmd_WIFI_LED_NEG digitalWrite( i_WiFi_Led_Port, ! digitalRead( i_WiFi_Led_Port )) /*** definice Rele ***/ const uint8_t i_Rele_Port = 2; #define cmd_RELE_DEF pinMode( i_Rele_Port, OUTPUT ) // spinani do 'L' #define cmd_RELE_ZAP digitalWrite( i_Rele_Port, false ) #define cmd_RELE_VYP digitalWrite( i_Rele_Port, true ) #define test_RELE_ZAP digitalRead( i_Rele_Port ) == false /*** prototypy funkci ***/ static void fnc_WIFI__Spojeni( const bool x_Wifi_Zap, const char* c_Wifi_Nazev, const char* c_Wifi_Heslo ); void fnc_HTTP__Init(); static void fnc_HTTP__Stranka(); /// ##################### /// ####################### /// ## ## /// ## S T A R T ## /// ## ## /// ####################### /// ##################### void setup() { /*** nastaveni portu Rele ***/ cmd_RELE_DEF; cmd_RELE_VYP; /*** nastaveni portu WiFi Led indikace ***/ cmd_WIFI_LED_DEF; cmd_WIFI_LED_VYP; /*** Web stranky ***/ fnc_HTTP__Init(); } /// ######################## /// ########################## /// ## ## /// ## S M Y C K A ## /// ## ## /// ########################## /// ######################## void loop() { // ====================== // = porioda 10 msec. = // ====================== delay(10); /*** pozadavky pres WiFi na Web Server ***/ _HTTP->handleClient(); // ====================== // = porioda 1/2 sec. = // ====================== /*** citac intervalu pro 1/2 sec. periodu ***/ if ( ++i_Interval_500ms < 50 ) { return; } i_Interval_500ms = 0; /*** osetreni WiFi spojeni v 1/2 sekundovych intervalech ***/ fnc_WIFI__Spojeni( x_Wifi_Zap, c_Wifi_Nazev, c_Wifi_Heslo ); } /// ######################## /// ########################## /// ## ## /// ## F U N K C E ## /// ## ## /// ########################## /// ######################## /// ################################################### static void fnc_WIFI__Spojeni( const bool x_Wifi_Zap, const char* c_Wifi_Nazev, const char* c_Wifi_Heslo ) /// ################################################### /* * ! Vzhledem k definici TimeOutu, spoustet funkci v 1/2 sec. periode ! * * WiFi spojeni: * * a) navazani + udrzovani pri x_Wifi_Zap = true * b) ukonceni pri x_Wifi_Zap = false */ { // =========================================== // = KONTROLA, JE-LI NAVAZANE WIFI SPOJENI = // =========================================== /*** test, je-li navazane spojeni ***/ if ( WiFi.status() == WL_CONNECTED ) { /*** anulovani TimeOutu pro pripad navazovani WiFi spojeni ***/ i_WiFi_TimeOut = 0; /*** test, ma-li setrvat navazane WiFi spojeni ***/ if ( x_Wifi_Zap == true ) { /*** spojeni ma zustat navazane ***/ cmd_WIFI_LED_ZAP; return; } else { /*** ukonceni jiz navazaneho spojeni ***/ WiFi.disconnect(); WiFi.forceSleepWake(); } } // ================================== // = PRI NENAVAZANEM WIFI SPOJENI = // ================================== /*** test, ma-li zustat ukoncene WiFi spojeni ***/ if ( x_Wifi_Zap == false ) { /*** spojeni ma zustat ukoncene ***/ cmd_WIFI_LED_VYP; return; } // ============================= // = NAVAZOVANI WIFI SPOJENI = // ============================= /*** blikani WiFi Led pomoci negace jejiho stavu ***/ cmd_WIFI_LED_NEG; /*** cyklicke pocitadlo TimeOutu pri navazovani WiFi spojeni ***/ if ( ++i_WiFi_TimeOut > i_WiFi_TimeOut_Max ) { /*** reinicializace pro dalsi cykl TimeOutu pri prekroceni jeho maxima ***/ i_WiFi_TimeOut = 0; } /*** preventivni WiFi odpojeni na zacatku cyklu TimeOutu ***/ if ( i_WiFi_TimeOut == 1 ) { WiFi.disconnect(); } /*** navazovani WiFi spojeni se zpozdenim po jeho preventivnim odpojeni na zacatku TimeOutu ***/ if ( i_WiFi_TimeOut == 5 ) { /*** navazovani WiFi spojeni ***/ WiFi.mode( WIFI_STA ); /*** prihlasovani do WiFi site ***/ WiFi.begin( c_Wifi_Nazev, c_Wifi_Heslo ); } return; } /// ################ void fnc_HTTP__Init() /// ################ { /*** preventivni uvolneni pametoveho prostoru Web Serveru ***/ if ( _HTTP != NULL ) { _HTTP->stop(); delete _HTTP; } /*** zalozeni a aktivace webserveru ***/ _HTTP = new ESP8266WebServer( i_Http_Port ); _HTTP->begin( i_Http_Port ); // ============================= // = PRISTUPY NA WEB STRANKU = // ============================= /*** sparovani dotazovane Web stranky na volanou funkci ***/ _HTTP->on( "/", HTTP_GET, fnc_HTTP__Stranka ); _HTTP->on( "/", []() { /*** test, autentikace pristupu na Web stranku uzivatelem a heslem ***/ if ( ! _HTTP->authenticate( c_Http_Uzivatel, c_Http_Heslo ) ) { /*** neuspesna autentikace a ukonceni ***/ _HTTP->requestAuthentication(); return; } /*** vstup na Web stranku po uspesne autentikaci ***/ fnc_HTTP__Stranka(); }); /*** osetreni dotazu na neexistujici Web stranku ***/ _HTTP->onNotFound([]() { _HTTP->send(404, "text/plain", "404: Not found !"); }); } /// ####################################### /// ## W E B S T R A N K A ## /// ####################################### /// ########################## static void fnc_HTTP__Stranka() /// ########################## { const char c_Nadpis_Stranky[] = "ESP8266-WebServer-Rele"; const char c_Perioda_Obnovy[] = "30"; // perioda automaticke obnovy Web stranky v sec. String s_Tl_Barva; // pro barvu tlacitka statusu Rele /*** definice reakci na tlacitka z Web stranky ***/ if ( _HTTP->hasArg( "zap" ) ) { cmd_RELE_ZAP; _HTTP->handleClient(); } else if ( _HTTP->hasArg( "vyp" ) ) { cmd_RELE_VYP; _HTTP->handleClient(); } else if ( _HTTP->hasArg( "stat" ) ) { _HTTP->handleClient(); } /*** prideleni barvy tlacitku statusu dle aktualniho stavu Rele ***/ if ( test_RELE_ZAP ) { /*** barva pro zapnuty stav ***/ s_Tl_Barva = "green"; } else { /*** barva pro vypnuty stav ***/ s_Tl_Barva = "grey"; } /*** poskladani Web stranky ***/ snprintf( c_Http_Stranka, i_Http_Stranka_Bytes, "\ \ \ \ \ \ \ \ \ \ %s\ \ \
\
%s

\ \

\ \

\ \
\ %s\ \ ", c_Perioda_Obnovy, c_Nadpis_Stranky, c_Nadpis_Stranky, &(s_Tl_Barva)[0], _VERZE ); /*** odeslani Web stranky ***/ _HTTP->send( 200, "text/html", c_Http_Stranka ); }