Example i pro ESP32
This commit is contained in:
parent
26a65f00ac
commit
8a95f6d69b
@ -1,16 +1,21 @@
|
|||||||
#include <ESP8266WiFi.h>
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
#include <ESP8266WebServer.h>
|
# include <ESP8266WiFi.h>
|
||||||
|
# include <ESP8266WebServer.h>
|
||||||
|
# include <ESP8266NetBIOS.h>
|
||||||
|
#else
|
||||||
|
# include <WiFi.h>
|
||||||
|
# include <WebServer.h>
|
||||||
|
# include <NetBIOS.h>
|
||||||
|
#endif
|
||||||
#include <ArduinoOTA.h>
|
#include <ArduinoOTA.h>
|
||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
#include <ESP8266NetBIOS.h>
|
|
||||||
#include <WiFiConfig.h>
|
#include <WiFiConfig.h>
|
||||||
#include <encipheredEEPROMStrings.h>
|
#include <encipheredEEPROMStrings.h>
|
||||||
|
|
||||||
|
#define MAGIC 0xdeadbeef
|
||||||
|
|
||||||
// Plati pro desticku Witty s modulem ESP-12E
|
// Plati pro desticku Witty s modulem ESP-12E
|
||||||
#define PIN_FORCE_CONFIG 4
|
#define PIN_FORCE_CONFIG 4
|
||||||
#define PIN_LED_RED 15
|
|
||||||
#define PIN_LED_GREEN 12
|
|
||||||
#define PIN_LED_BLUE 13
|
|
||||||
|
|
||||||
//#define DEBUG_OUT(a) {}
|
//#define DEBUG_OUT(a) {}
|
||||||
#define DEBUG_OUT(a) Serial.print(a)
|
#define DEBUG_OUT(a) Serial.print(a)
|
||||||
@ -18,9 +23,9 @@
|
|||||||
// Definice obsazeni EEPROM
|
// Definice obsazeni EEPROM
|
||||||
#define elementSize(type, element) sizeof(((type *)0)->element)
|
#define elementSize(type, element) sizeof(((type *)0)->element)
|
||||||
#define countof(a) (sizeof(a) / sizeof(a[0]))
|
#define countof(a) (sizeof(a) / sizeof(a[0]))
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
uint32_t magic; // kontrola spravneho obsahu EEPROM
|
||||||
char devname[32 + 2]; // jmeno zarizeni (pro NBNS plati jen 16 znaku)
|
char devname[32 + 2]; // jmeno zarizeni (pro NBNS plati jen 16 znaku)
|
||||||
} eepromconfig_t;
|
} eepromconfig_t;
|
||||||
|
|
||||||
#define EEPROM_SIZE (sizeof(wificonfigarea_t) + sizeof(eepromconfig_t) + 10) // velikost EEPROM oblasti (POZOR!!! zbytecnym zvetsovanim se zaroven zmensuje velikost RAM kvuli zrcadlu!!!)
|
#define EEPROM_SIZE (sizeof(wificonfigarea_t) + sizeof(eepromconfig_t) + 10) // velikost EEPROM oblasti (POZOR!!! zbytecnym zvetsovanim se zaroven zmensuje velikost RAM kvuli zrcadlu!!!)
|
||||||
@ -28,118 +33,132 @@ typedef struct
|
|||||||
#define EEPROM_CONFIG_ORIGIN (0)
|
#define EEPROM_CONFIG_ORIGIN (0)
|
||||||
|
|
||||||
char WiFiDeviceName[elementSize(eepromconfig_t, devname)]; // misto pro jmeno zarizeni (dodane do DNS, DHCP NBNS apod...)
|
char WiFiDeviceName[elementSize(eepromconfig_t, devname)]; // misto pro jmeno zarizeni (dodane do DNS, DHCP NBNS apod...)
|
||||||
|
#if defined(ARDUINO_ARCH_ESP8266)
|
||||||
ESP8266WebServer wwwserver(80); // webovy server
|
ESP8266WebServer wwwserver(80); // webovy server
|
||||||
|
#else
|
||||||
|
WebServer wwwserver(80); // webovy server
|
||||||
|
#endif
|
||||||
String content;
|
String content;
|
||||||
|
|
||||||
static void handleRoot(void)
|
static void handleRoot(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
content = F("<!DOCTYPE HTML>\n<html>Hello world from ESP8266");
|
content = F("<!DOCTYPE HTML>\n<html>Hello world from ESP8266");
|
||||||
content += F("<p>");
|
content += F("<p>");
|
||||||
content += F("</html>");
|
content += F("</html>");
|
||||||
|
|
||||||
wwwserver.send(200, "text/html", content);
|
wwwserver.send(200, "text/html", content);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR wcb(wificonfigstate_t state)
|
void ICACHE_FLASH_ATTR wcb(wificonfigstate_t state)
|
||||||
{
|
{
|
||||||
|
|
||||||
switch (state)
|
switch (state) {
|
||||||
{
|
|
||||||
case WCS_CONNECTSTART:
|
case WCS_CONNECTSTART:
|
||||||
DEBUG_OUT(F("Starting connect...\r\n"));
|
DEBUG_OUT(F("Starting connect...\r\n"));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WCS_CONNECTING:
|
case WCS_CONNECTING:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WCS_CONNECTED:
|
case WCS_CONNECTED:
|
||||||
DEBUG_OUT(F("Connected.\r\n"));
|
DEBUG_OUT(F("Connected.\r\n"));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WCS_CONFIGSTART:
|
case WCS_CONFIGSTART:
|
||||||
DEBUG_OUT(F("Starting config...\r\n"));
|
DEBUG_OUT(F("Starting config...\r\n"));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WCS_CONFIGWAIT:
|
case WCS_CONFIGWAIT:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR saveDevname(const char *param)
|
void ICACHE_FLASH_ATTR saveDevname(const char *param)
|
||||||
{
|
{
|
||||||
String p = param;
|
String p = param;
|
||||||
|
|
||||||
EES_storeString(EEPROM_CONFIG_ORIGIN + offsetof(eepromconfig_t, devname), elementSize(eepromconfig_t, devname), p);
|
EES_storeString(EEPROM_CONFIG_ORIGIN + offsetof(eepromconfig_t, devname), elementSize(eepromconfig_t, devname), p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ICACHE_FLASH_ATTR setup()
|
void ICACHE_FLASH_ATTR setup()
|
||||||
{
|
{
|
||||||
WiFiConfig wifi; // konfigurace ESP modulu
|
WiFiConfig wifi; // konfigurace ESP modulu
|
||||||
WiFiConfigUsrParameter devname("devname", "Jméno zařízení", (const char *)WiFiDeviceName, 32, saveDevname);
|
WiFiConfigUsrParameter devname("devname", "Jméno zařízení", (const char *)WiFiDeviceName, 32, saveDevname);
|
||||||
|
|
||||||
EEPROM.begin(EEPROM_SIZE); // zahajujeme praci s EEPROM
|
EEPROM.begin(EEPROM_SIZE); // zahajujeme praci s EEPROM
|
||||||
pinMode(PIN_FORCE_CONFIG, INPUT_PULLUP); // pin, co slouzi jako vstup tlacitka
|
|
||||||
int fc = digitalRead(PIN_FORCE_CONFIG); // pozadavek na vynucene vyvolani konfigurace
|
|
||||||
Serial.begin(9600);
|
|
||||||
String dn = EES_readString(EEPROM_CONFIG_ORIGIN + offsetof(eepromconfig_t, devname), elementSize(eepromconfig_t, devname));
|
|
||||||
strcpy(WiFiDeviceName, dn.c_str());
|
|
||||||
wifi.addParameter(&devname);
|
|
||||||
|
|
||||||
if (WCR_OK != wifi.begin(EEPROM_WIFICONFIG_ORIGIN, fc, wcb)) // startujeme pripojeni
|
uint32_t magic;
|
||||||
ESP.restart();
|
|
||||||
|
|
||||||
wwwserver.on("/", handleRoot);
|
EEPROM.get(EEPROM_CONFIG_ORIGIN + offsetof(eepromconfig_t, magic), magic);
|
||||||
wwwserver.begin(); // startujeme webovy server
|
if (EEPROM_MAGIC != magic) {
|
||||||
|
// EEPROM ma spatny obsah
|
||||||
if (strlen(WiFiDeviceName) > 0)
|
for (unsigned int i = 0; i < EEPROM_SIZE; i++)
|
||||||
{
|
EEPROM.write(i, 0);
|
||||||
NBNS.begin(WiFiDeviceName);
|
magic = EEPROM_MAGIC;
|
||||||
ArduinoOTA.setHostname(WiFiDeviceName);
|
EEPROM.put(EEPROM_CONFIG_ORIGIN + offsetof(eepromconfig_t, magic), magic);
|
||||||
}
|
EEPROM.commit();
|
||||||
|
|
||||||
ArduinoOTA.onStart([]() {
|
|
||||||
DEBUG_OUT(F("Start\r\n"));
|
|
||||||
});
|
|
||||||
ArduinoOTA.onEnd([]() {
|
|
||||||
DEBUG_OUT(F("End\r\n"));
|
|
||||||
});
|
|
||||||
ArduinoOTA.onError([](ota_error_t error) {
|
|
||||||
DEBUG_OUT(F("Error["));
|
|
||||||
DEBUG_OUT(error);
|
|
||||||
DEBUG_OUT(F("]: "));
|
|
||||||
switch (error)
|
|
||||||
{
|
|
||||||
case OTA_AUTH_ERROR:
|
|
||||||
DEBUG_OUT(F("Auth Failed\r\n"));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OTA_BEGIN_ERROR:
|
|
||||||
DEBUG_OUT(F("Begin Failed\r\n"));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OTA_CONNECT_ERROR:
|
|
||||||
DEBUG_OUT(F("Connect Failed\r\n"));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OTA_RECEIVE_ERROR:
|
|
||||||
DEBUG_OUT(F("Receive Failed\r\n"));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OTA_END_ERROR:
|
|
||||||
DEBUG_OUT(F("End Failed\r\n"));
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DEBUG_OUT(F("\r\n"));
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
ArduinoOTA.begin();
|
pinMode(PIN_FORCE_CONFIG, INPUT_PULLUP); // pin, co slouzi jako vstup tlacitka
|
||||||
|
int fc = digitalRead(PIN_FORCE_CONFIG); // pozadavek na vynucene vyvolani konfigurace
|
||||||
|
Serial.begin(9600);
|
||||||
|
String dn = EES_readString(EEPROM_CONFIG_ORIGIN + offsetof(eepromconfig_t, devname), elementSize(eepromconfig_t, devname));
|
||||||
|
strcpy(WiFiDeviceName, dn.c_str());
|
||||||
|
wifi.addParameter(&devname);
|
||||||
|
|
||||||
|
if (WCR_OK != wifi.begin(EEPROM_WIFICONFIG_ORIGIN, fc, wcb)) // startujeme pripojeni
|
||||||
|
ESP.restart();
|
||||||
|
|
||||||
|
wwwserver.on("/", handleRoot);
|
||||||
|
wwwserver.begin(); // startujeme webovy server
|
||||||
|
|
||||||
|
if (strlen(WiFiDeviceName) > 0) {
|
||||||
|
NBNS.begin(WiFiDeviceName);
|
||||||
|
ArduinoOTA.setHostname(WiFiDeviceName);
|
||||||
|
}
|
||||||
|
|
||||||
|
ArduinoOTA.onStart([]() {
|
||||||
|
DEBUG_OUT(F("Start\r\n"));
|
||||||
|
});
|
||||||
|
ArduinoOTA.onEnd([]() {
|
||||||
|
DEBUG_OUT(F("End\r\n"));
|
||||||
|
});
|
||||||
|
ArduinoOTA.onError([](ota_error_t error) {
|
||||||
|
DEBUG_OUT(F("Error["));
|
||||||
|
DEBUG_OUT(error);
|
||||||
|
DEBUG_OUT(F("]: "));
|
||||||
|
switch (error) {
|
||||||
|
case OTA_AUTH_ERROR:
|
||||||
|
DEBUG_OUT(F("Auth Failed\r\n"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OTA_BEGIN_ERROR:
|
||||||
|
DEBUG_OUT(F("Begin Failed\r\n"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OTA_CONNECT_ERROR:
|
||||||
|
DEBUG_OUT(F("Connect Failed\r\n"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OTA_RECEIVE_ERROR:
|
||||||
|
DEBUG_OUT(F("Receive Failed\r\n"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OTA_END_ERROR:
|
||||||
|
DEBUG_OUT(F("End Failed\r\n"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DEBUG_OUT(F("\r\n"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ArduinoOTA.begin();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
wwwserver.handleClient(); // osetrujeme praci serveru
|
wwwserver.handleClient(); // osetrujeme praci serveru
|
||||||
ArduinoOTA.handle();
|
ArduinoOTA.handle();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user