Example i pro ESP32

This commit is contained in:
Pavel Brychta 2020-04-06 17:37:23 +02:00
parent 26a65f00ac
commit 8a95f6d69b

View File

@ -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();
} }