Re: ESP32 domácí automatizace
Jan Půhoný
konference na puhy.cz
Sobota Červenec 31 00:05:44 CEST 2021
Dobrý večer,
tak se po chvíli vracím k tomu původnímu ESP vlíknu. Chtěl jsem si pohrát s
multitaskingem, ale jak to začnu cpát všechno dohromady, esp se dokola
resetuje.
Např: nad setup jsem přidal funkci void heartBeat ,která by mi měla hýbat
pinem pro externí WDT. Do setupu jsem dal xTaskCreate, zkoušel jsem i
xTaskCreatePinnedToCore.
//xTaskCreate(
xTaskCreatePinnedToCore(
heartBeat, // Function that should be called
"heartBeatPin change", // Name of the task (for debugging)
1000, // Stack size (bytes)
NULL, // Parameter to pass
1, // Task priority
NULL, // Task handle
1 // Core 1/0
);
Přeložit to jde, ale resetuje se dokola. Když to vyhodím, tak ok.
Předpokládám, že moje pokusy z minula s millis, které tam zůstaly by na to
neměli mít žádný vliv.
Resetuje se to s tímto:
rst:0x1 (POWERON_RESET),boot:0x12 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:10124
load:0x40080400,len:5828
entry 0x400806a8
Když vyhodím xTaskCreate nebo xTaskCreatePinnedToCore neresetuje se to.
Kde je ten zakopaný pes?
*Díky *za nápady, celý kód níže.
HP
/*
-----------------------------
ESPDASH Lite - Interactive Example
-----------------------------
Skill Level: Intermediate
In this example we will be creating a interactive dashboard which consists
of a button and a slider.
Github: https://github.com/ayushsharma82/ESP-DASH
WiKi: https://ayushsharma82.github.io/ESP-DASH/
Works with both ESP8266 & ESP32
-------------------------------
Upgrade to ESP-DASH Pro: https://espdash.pro
*/
#include <Arduino.h>
/* ESP32 Dependencies */
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <ESPDash.h>
#include <ArduinoOTA.h>
#include "uptime.h"
#include "uptime_formatter.h"
#include <Wire.h>
#include <esp_wifi.h>
uint8_t current_protocol;
esp_interface_t current_esp_interface;
wifi_interface_t current_wifi_interface;
/* Your WiFi Credentials */
const char* ssid = "*****"; // SSID
const char* password = "*****"; // Password
const char* OTAhostname = "ESP-puhy";
/* Start Webserver */
AsyncWebServer server(80);
/* Attach ESP-DASH to AsyncWebServer */
ESPDash dashboard(&server);
/*
Button Card
Format - (Dashboard Instance, Card Type, Card Name)
*/
Card button1(&dashboard, BUTTON_CARD, "Zalévej 1");
Card button2(&dashboard, BUTTON_CARD, "Zalévej 2");
Card button3(&dashboard, BUTTON_CARD, "Zalévej 3");
Card button4(&dashboard, BUTTON_CARD, "Zalévej 4");
Card uptimeCard(&dashboard, STATUS_CARD, "Uptime", "success");
Card signalCard(&dashboard, STATUS_CARD, "Signal", "success");
/*
Slider Card
Format - (Dashboard Instance, Card Type, Card Name, Card
Symbol(optional), int min, int max)
*/
Card slider(&dashboard, SLIDER_CARD, "Test Slider", "", 0, 255);
const int ledPinBlue = 2;
const int ledPinRed = 27;
const int ledPinGreen = 26;
const int ventMain1 = 18;
const int ventOn1 = 5;
const int ventMain2 = 19;
const int ventOn2 = 21;
const int ventMain3 = 32;
const int ventOn3 = 33;
const int ventMain4 = 35;
const int ventOn4 = 34;
const int heartBeatPin = 12;
int blinkOnTime = 0;
int blinkRepeatTime = 0;
int wlanLedState = 0;
int wlanConnected = 0;
// setting PWM properties
//int dutyCycle;
/* Setting PWM Properties */
const int PWMFreq = 5000; /* 5 KHz */
const int PWMChannel = 0;
const int PWMResolution = 8;
const int MAX_DUTY_CYCLE = (int)(pow(2, PWMResolution) - 1);
// Variables will change:
int prevState = LOW; // state used to set heardbeat
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;
// will store last time heartbeat was updated
unsigned long previousMillisLED = 0;
// will store last time LED was updated
void heartBeat(void * parameter){
for(;;){ // infinite loop
digitalWrite(heartBeatPin, LOW);
// Pause the task for 20ms
vTaskDelay(20 / portTICK_PERIOD_MS);
digitalWrite(heartBeatPin, HIGH);
// Pause the task again for 500ms
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void uptimeUpdate(void * parameter){
for(;;){ // infinite loop
Serial.println(uptime_formatter::getUptime());
uptimeCard.update(uptime_formatter::getUptime());
// Pause the task again for 2000ms
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
void I2CRead(void * parameter){
for(;;){ // infinite loop
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
nDevices++;
}
else if (error==4) {
Serial.print("Unknow error at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
}
else {
Serial.println("done\n");
}
// Pause the task again for 2000ms
vTaskDelay(5000 / portTICK_PERIOD_MS);
}
}
void cardUpdate(void * parameter){
for(;;){ // infinite loop
signalCard.update(WiFi.RSSI());
// Pause the task again for 2000ms
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(9600);
pinMode (heartBeatPin, OUTPUT);
pinMode (ledPinRed, OUTPUT);
pinMode (ledPinGreen, OUTPUT);
pinMode (ledPinBlue, OUTPUT);
pinMode ( ventMain1, OUTPUT);
pinMode ( ventOn1, OUTPUT);
pinMode ( ventMain2, OUTPUT);
pinMode ( ventOn2, OUTPUT);
pinMode ( ventMain3, OUTPUT);
pinMode ( ventOn3, OUTPUT);
pinMode ( ventMain4, OUTPUT);
pinMode ( ventOn4, OUTPUT);
ledcSetup(PWMChannel, PWMFreq, PWMResolution);
/* Attach the LED PWM Channel to the GPIO Pin */
ledcAttachPin(ledPinGreen, PWMChannel);
Serial.begin(115200);
/* Connect WiFi */
WiFi.mode(WIFI_STA);
//check_protocol();
// esp_wifi_set_protocol(current_wifi_interface,
WIFI_PROTOCOL_11B|WIFI_PROTOCOL_11G|WIFI_PROTOCOL_11N);
//vynucení 11N wifi protokolu
esp_wifi_set_protocol(current_wifi_interface, WIFI_PROTOCOL_11N);
//check_protocol();
//vypnutí save režimu wifi
esp_wifi_set_ps(WIFI_PS_NONE);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.printf("WiFi Failed!\n");
return;
}
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
/* Attach Button Callback */
button1.attachCallback([&](bool value){
/* Print our new button value received from dashboard */
Serial.println("Button Triggered: "+String((value)?"true":"false"));
/* Make sure we update our button's value and send update to dashboard */
button1.update(value);
digitalWrite (ledPinRed, value);
digitalWrite (ventMain1, 1);
digitalWrite (ventOn1, value);
dashboard.sendUpdates();
});
button2.attachCallback([&](bool value){
/* Print our new button value received from dashboard */
Serial.println("Button Triggered: "+String((value)?"true":"false"));
/* Make sure we update our button's value and send update to dashboard */
button2.update(value);
digitalWrite (ledPinRed, value);
dashboard.sendUpdates();
});
button3.attachCallback([&](bool value){
/* Print our new button value received from dashboard */
Serial.println("Button Triggered: "+String((value)?"true":"false"));
/* Make sure we update our button's value and send update to dashboard */
button3.update(value);
digitalWrite (ledPinRed, value);
dashboard.sendUpdates();
});
button4.attachCallback([&](bool value){
/* Print our new button value received from dashboard */
Serial.println("Button Triggered: "+String((value)?"true":"false"));
/* Make sure we update our button's value and send update to dashboard */
button4.update(value);
digitalWrite (ledPinRed, value);
dashboard.sendUpdates();
});
/* Attach Slider Callback */
slider.attachCallback([&](int value){
/* Print our new slider value received from dashboard */
Serial.println("Slider Triggered: "+String(value));
/* Make sure we update our slider's value and send update to dashboard */
slider.update(value);
ledcWrite(PWMChannel, value);
dashboard.sendUpdates();
});
/* Start AsyncWebServer */
server.begin();
ArduinoOTA.setHostname("VentControl");
ArduinoOTA.onStart([]()
{
Serial.println("Start");
});
ArduinoOTA.onEnd([]()
{
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
{
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error)
{
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
//xTaskCreate(
xTaskCreatePinnedToCore(
heartBeat, // Function that should be called
"heartBeatPin change", // Name of the task (for debugging)
1000, // Stack size (bytes)
NULL, // Parameter to pass
1, // Task priority
NULL, // Task handle
1 // Core 1/0
);
xTaskCreatePinnedToCore(
uptimeUpdate, // Function that should be called
"uptimeUpdate", // Name of the task (for debugging)
1000, // Stack size (bytes)
NULL, // Parameter to pass
1, // Task priority
NULL, // Task handle
1 // Core 1/0
);
xTaskCreatePinnedToCore(
I2CRead, // Function that should be called
"I2CRead", // Name of the task (for debugging)
1000, // Stack size (bytes)
NULL, // Parameter to pass
1, // Task priority
NULL, // Task handle
0 // Core 1/0
);
xTaskCreatePinnedToCore(
cardUpdate, // Function that should be called
"cardUpdate", // Name of the task (for debugging)
1000, // Stack size (bytes)
NULL, // Parameter to pass
1, // Task priority
NULL, // Task handle
0 // Core 1/0
);
}//setup
void loop() {
/* Nothing so far */
ArduinoOTA.handle();
// here is where you'd put code that needs to be running all the time.
// check to see if it's time to blink the LED; that is, if the difference
// between the current time and last time you blinked the LED is bigger than
// the interval at which you want to blink the LED.
if (WiFi.softAPgetStationNum()) {
// AP client connected, mostly on
blinkOnTime = 275;
blinkRepeatTime = 300;
} else if (WiFi.status() == WL_CONNECTED) {
// Connected as STA (or AP), flash 1/sec
wlanConnected = true;
blinkOnTime = 200;
blinkRepeatTime = 1000;
} else {
// no connections, every 10 sec
blinkOnTime = 25;
blinkRepeatTime = 10000;
}
if (((millis() - previousMillisLED) > blinkRepeatTime) && wlanLedState) {
previousMillisLED = millis();
wlanLedState = false;
digitalWrite(ledPinBlue, wlanLedState);
} else if (((millis() - previousMillisLED) > blinkOnTime) && !wlanLedState
) {
wlanLedState = true;
digitalWrite(ledPinBlue, wlanLedState);
}
//
//delay(5000);
}
st 2. 6. 2021 v 11:58 odesílatel Tomáš Hamouz <
konfery.tomas.hamouz na seznam.cz> napsal:
> Zajímalo, od toho to přece je konference ;-)
>
> Tomáš
>
>
>
> Nemáte zač - co se týče WiFi, tak hledejte nastavení autoReconnect a
> autoConnect parametrů (až použijete ten wifimanager/wificonfig, tak tohle
> řešit nemusíte). Je možné, že je máte nastavené na false a pak se to znovu
> nepřipojí. Pokud budete mít další dotazy, tak možná raději pište přímo -
> nejsem si jistý, kolik lidí by tohle zajímalo.
> P.B.
> Dne 02. 06. 21 v 10:51 Jan Půhoný napsal(a):
> Ok, díky moc za tipy. Už jsem to snad pochopil. Ještě mě zarazila jedna
> věc, předpokládal bych, že to už je na takovém modulu ošetřené v základu
> nebo přímo ve wifi řadiči nebo jak to napsat, ale evidentně ne. Pokud
> odpojím wifi, třeba tak, že restartuji wifi router, tak se sama znovu
> nepřipojí.
>
> Dá se to nějak nastavit? Nebo musím jednou za čas volat něco jako tento
> kód? Je nějaké doporučení jak to často testovat? Ale čekal bych, že když se
> to jednou nastaví, že to bude vyřešeno na úrovni toho wifi řadiče. Nebo mám
> něco blbě?
>
> if (WiFi.waitForConnectResult() != WL_CONNECTED) {
>
> WiFi.mode(WIFI_STA);
> WiFi.begin(ssid, password);
>
> }
>
> Díky,
>
> HP
>
> po 31. 5. 2021 v 12:06 odesílatel Pavel Brychta <pavel.brychta na duhasys.eu>
> napsal:
> DD,
> přesně tak. Když se podíváte do includnuté Arduino.h, tak uvidíte, že
> freertos/FreeRTOS.h, freertos/task.h a freertos/semphr.h jsou součástí,
> takže můžete volat přímo RTOS funkce. Pro začátek doporučuju si načíst
> třeba https://savjee.be/2020/01/multitasking-esp32-arduino-freertos/ a
> pak si k tomu najděte nějaký příklad na semafory a mutexy. Přes millis() to
> bude fungovat také, ale kooperativně. Další možností pak je použít knihovnu
> Ticker, která umožňuje vyytvořit hybrid mezi kooperativním použitím
> millis() a vláknovým RTOS (ušetříte třeba RAM na stack oblasti). Trošku
> potíž může být při přístupu do proměnných dash knihovny z jiného vlákna
> (proto to doporučení studia semaforů), ale to dokážou ošetřit semafory,
> nebo fronty. Pokud ale program bude té složitosti, co jste poslal, tak
> není důvod používat ani RTOS, ani Ticker, ale použijte třeba moji
> historickou https://github.com/Pablo2048/Interval (teď koukám, že by
> zasloužila aktualizovat - tak zkuste třeba aktuálnější verzi z
> https://git.xpablo.cz/pablo2048/Interval ). Ta parametrizace WiFi by si
> taky zasloužila něco lepšího než hardcoded credentials - zkuste se podívat
> na knihovnu Wifimanager, nebo můj wificonfig (pokud jste dostatečně
> odvážný...)
> P.B.
> Dne 31. 05. 21 v 11:17 Jan Půhoný napsal(a):
> Díky,
>
> delay jsem dal pryč. Už to funguje. "Multitasking" na arduinu jsem dělal
> pomocí millis, tady to funguje taky, viz kód níže, ale jak se to dělá
> elegantněji na ESP32? Pochopil jsem, že když použiji Arduino framework, tak
> by mělo jít psát přímo s využitím freertos? Omlouvám se za lama dotazy, ale
> to tam nemusím už nic includovat a rovnou můžu používat něco jako?
>
> void vATaskFunction( void *pvParameters )
> {
> for( ;; )
> {
> -- Task application code here. --
> }
>
> /* Tasks must not attempt to return from their implementing
> function or otherwise exit. In newer FreeRTOS port
> attempting to do so will result in an configASSERT() being
> called if it is defined. If it is necessary for a task to
> exit then have the task call vTaskDelete( NULL ) to ensure
> its exit is clean. */
> vTaskDelete( NULL );
> }
>
> Potřebuji něco kolem 10 ti tasku, nic náročného, každý se provede do max
> 1s. Nebo to mám udělat jen pomocí millis? Je potřeba, aby tam na pozadí
> běžel dash a OTA, takto mi to funguje:
>
> #include <Arduino.h>
> /* ESP32 Dependencies */
> #include <WiFi.h>
> #include <AsyncTCP.h>
> #include <ESPAsyncWebServer.h>
> #include <ESPDash.h>
> #include <WiFiUdp.h>
> #include <ArduinoOTA.h>
> #include "uptime.h"
> #include "uptime_formatter.h"
> /* Your WiFi Credentials */
> const char* ssid = "puhy_iot"; // SSID
> const char* password = "iot44puhy"; // Password
> const char* OTAhostname = "ESP-puhy";
> /* Start Webserver */
> AsyncWebServer server(80);
> /* Attach ESP-DASH to AsyncWebServer */
> ESPDash dashboard(&server);
> /*
> Button Card
> Format - (Dashboard Instance, Card Type, Card Name)
> */
> Card button(&dashboard, BUTTON_CARD, "Zalévej");
> Card button1(&dashboard, BUTTON_CARD, "Čisti");
> Card button2(&dashboard, BUTTON_CARD, "Zatop");
> Card uptimeCard(&dashboard, STATUS_CARD, "Uptime", "success");
> /*
> Slider Card
> Format - (Dashboard Instance, Card Type, Card Name, Card
> Symbol(optional), int min, int max)
> */
> Card slider(&dashboard, SLIDER_CARD, "Test Slider", "", 0, 255);
> const int ledHeartBeatPin = 2;
> const int ledPin = 5;
> // setting PWM properties
> const int ledPinPWM = 13; /* GPIO13 */
> //int dutyCycle;
> /* Setting PWM Properties */
> const int PWMFreq = 5000; /* 5 KHz */
> const int PWMChannel = 0;
> const int PWMResolution = 8;
> const int MAX_DUTY_CYCLE = (int)(pow(2, PWMResolution) - 1);
> // Variables will change:
> int ledState = LOW; // ledState used to set the LED
> // Generally, you should use "unsigned long" for variables that hold time
> // The value will quickly become too large for an int to store
> unsigned long previousMillis = 0; // will store last time LED was
> updated
> // constants won't change:
> long heartBeatInterval = 1000; // interval at which to blink
> (milliseconds)
> void setup() {
> pinMode (ledPin, OUTPUT);
> pinMode (ledHeartBeatPin, OUTPUT);
> pinMode (ledPinPWM, OUTPUT);
> ledcSetup(PWMChannel, PWMFreq, PWMResolution);
> /* Attach the LED PWM Channel to the GPIO Pin */
> ledcAttachPin(ledPinPWM, PWMChannel);
> Serial.begin(115200);
> /* Connect WiFi */
> WiFi.mode(WIFI_STA);
> WiFi.begin(ssid, password);
> if (WiFi.waitForConnectResult() != WL_CONNECTED) {
> Serial.printf("WiFi Failed!\n");
> return;
> }
> Serial.print("IP Address: ");
> Serial.println(WiFi.localIP());
> /* Attach Button Callback */
> button.attachCallback([&](bool value){
> /* Print our new button value received from dashboard */
> Serial.println("Button Triggered: "+String((value)?"true":"false"));
> /* Make sure we update our button's value and send update to dashboard
> */
> button.update(value);
> digitalWrite (ledPin, value);
> dashboard.sendUpdates();
> });
> /* Attach Slider Callback */
> slider.attachCallback([&](int value){
> /* Print our new slider value received from dashboard */
> Serial.println("Slider Triggered: "+String(value));
> /* Make sure we update our slider's value and send update to dashboard
> */
> slider.update(value);
> ledcWrite(PWMChannel, value);
> dashboard.sendUpdates();
> });
> /* Start AsyncWebServer */
> server.begin();
> ArduinoOTA.setHostname(OTAhostname);
> ArduinoOTA.onStart([]()
> {
> Serial.println("Start");
> });
> ArduinoOTA.onEnd([]()
> {
> Serial.println("\nEnd");
> });
> ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
> {
> Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
> });
> ArduinoOTA.onError([](ota_error_t error)
> {
> Serial.printf("Error[%u]: ", error);
> if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
> else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
> else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
> else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
> else if (error == OTA_END_ERROR) Serial.println("End Failed");
> });
> ArduinoOTA.begin();
> }
> void loop() {
> /* Nothing so far */
> ArduinoOTA.handle();
> // here is where you'd put code that needs to be running all the time.
> // check to see if it's time to blink the LED; that is, if the difference
> // between the current time and last time you blinked the LED is bigger
> than
> // the interval at which you want to blink the LED.
> unsigned long currentMillis = millis();
> if (currentMillis - previousMillis >= heartBeatInterval) {
> // save the last time you blinked the LED
> previousMillis = currentMillis;
> // if the LED is off turn it on and vice-versa:
> if (ledState == LOW) {
> ledState = HIGH;
> heartBeatInterval = 2500; }
> else {
> heartBeatInterval = 20;
> ledState = LOW; }
>
> // set the LED with the ledState of the variable:
> digitalWrite(ledHeartBeatPin, ledState);
> Serial.println(uptime_formatter::getUptime());
> uptimeCard.update(uptime_formatter::getUptime()); }
>
>
>
> Díky za podporu. HP pá 28. 5. 2021 v 6:10 odesílatel Pavel Brychta <
>
>
>
>
> pavel.brychta na duhasys.eu> napsal:
> DD,
> ano, handler se dává do loop(), ale doporučuju odstranit ten nešťastný
> delay() i když to zrovna nemusí být zdroj problému. Potíž je v tom, že
> nepíšete jak se projevuje to, že to nefunguje - pokud upoad proběhne, ale
> podezřele rychle a firmware se ve skutečnosti nenahraje, tak je to tím, že
> jste nevymazal paměť flash (pio run -t erase) a to ESP má uloženou jinou
> partition tabulku. Vždycky, když nahrávám do nového modulu, tak udělám
> výmaz flash a teprve pak nahraju první firmware. Já prakticky výhradně
> používám Wrover 16MB moduly s trošku upravenou vnitřní konfigurací a
> všechny tyto úpravy dělám v přípravku mimo zařízení před osazením (reklamní
> linka https://s.click.aliexpress.com/e/_9j8PIP ).
> P.B.
> Dne 27. 05. 21 v 23:22 Jan Půhoný napsal(a):
> Dobrý večer,
>
> ten ESPDash je super. Ještě jednou díky za tip. Ohledně těch WDT asi tam
> dám i ten externí, bude potřeba ale časovat někde kolem 1minuty, aby to
> nezabíralo v případě update firmware.
>
> Trochu se s trápím s tím, jak zkombinovat svůj kód s OTA update. Funguje
> mi jen jedno nebo druhé, ale dohromady ne.
>
> Když to napíšu takto z(viz níže), tak OTA je vidět (např. v Arduino IDE)
> ale nejde nic nahrát. Testoval jsem jak Arduino IDE, tak platformio.
>
>
>
> Když tam dám jen příklad OTA tak upload normálně funguje, když tam dám jen
> ESPDash, normálně to funguje. Ale dohromady ne.
>
> Píše se ten OTA handler opravdu do loop?
>
> #include <Arduino.h>
> #if defined(ESP8266)
> /* ESP8266 Dependencies */
> #include <ESP8266WiFi.h>
> #include <ESPAsyncTCP.h>
> #include <ESPAsyncWebServer.h>
> #elif defined(ESP32)
> /* ESP32 Dependencies */
> #include <WiFi.h>
> #include <AsyncTCP.h>
> #include <ESPAsyncWebServer.h>
> #endif
> #include <ESPDash.h>
>
>
> #include <WiFiUdp.h>
>
>
> *#include <ArduinoOTA.h> */* Your WiFi Credentials */
> const char* ssid = "******"; // SSID
> const char* password = "******"; // Password
>
> const char* OTAhostname = "ESP-puhy";
>
> /* Start Webserver */
> AsyncWebServer server(80);
>
> /* Attach ESP-DASH to AsyncWebServer */
> ESPDash dashboard(&server);
>
> /*
> Button Card
> Format - (Dashboard Instance, Card Type, Card Name)
> */
> Card button(&dashboard, BUTTON_CARD, "Test Button");
>
> /*
> Slider Card
> Format - (Dashboard Instance, Card Type, Card Name, Card
> Symbol(optional), int min, int max)
> */
> Card slider(&dashboard, SLIDER_CARD, "Test Slider", "", 0, 255);
>
>
> void setup() {
> Serial.begin(115200);
>
> /* Connect WiFi */
> WiFi.mode(WIFI_STA);
> WiFi.begin(ssid, password);
> if (WiFi.waitForConnectResult() != WL_CONNECTED) {
> Serial.printf("WiFi Failed!\n");
> return;
> }
> Serial.print("IP Address: ");
> Serial.println(WiFi.localIP());
>
> /* Attach Button Callback */
> button.attachCallback([&](bool value){
> /* Print our new button value received from dashboard */
> Serial.println("Button Triggered: "+String((value)?"true":"false"));
> /* Make sure we update our button's value and send update to dashboard
> */
> button.update(value);
> dashboard.sendUpdates();
> });
>
> /* Attach Slider Callback */
> slider.attachCallback([&](int value){
> /* Print our new slider value received from dashboard */
> Serial.println("Slider Triggered: "+String(value));
> /* Make sure we update our slider's value and send update to dashboard
> */
> slider.update(value);
> dashboard.sendUpdates();
> });
>
> /* Start AsyncWebServer */
> server.begin();
>
> ArduinoOTA.setHostname(OTAhostname);
> ArduinoOTA.onStart([]()
> {
> Serial.println("Start");
> });
> ArduinoOTA.onEnd([]()
> {
> Serial.println("\nEnd");
> });
> ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
> {
> Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
> });
> ArduinoOTA.onError([](ota_error_t error)
> {
> Serial.printf("Error[%u]: ", error);
> if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
> else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
> else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
> else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
> else if (error == OTA_END_ERROR) Serial.println("End Failed");
> });
> ArduinoOTA.begin();
> }
>
> void loop() {
> /* Nothing so far */
>
>
> * ArduinoOTA.handle(); * delay(5000);
>
> }
>
> Díky,
>
> HP
>
>
> st 26. 5. 2021 v 13:45 odesílatel Pavel Brychta <pavel.brychta na duhasys.eu>
> napsal:
> Co se týče WDT, tak fakt nevím - mě zatím vždycky stačil vnitřní v ESP32
> (má i brownout detector, který už jsem také viděl zabrat). Zařízení mi běží
> 24/7. Expandér můžu doporučit místo toho PCF raději MCP23008 (nebo 16,
> pokud je 8 GPIO málo) - minimálně z toho důvodu, že má asynchronní reset,
> takže po resetu jsou GPIO v definovaných stavech.
> P.B.
> Dne 26. 05. 21 v 13:30 Jan Půhoný napsal(a):
> Díky za reakce. Jde mi o to mít to co nejvíce low level. Opravdu do toho
> nechci tahat RasPi. Musí to jet i když nepůjde wifi a s tou Atmegou to drží
> roky až se divím.
>
> Maximálně do budoucna můžu přidat nějakou vizualizaci na něčem jako RasPi,
> ale to spíš už přímo posílat requesty na www a ukládat do MySQL. Potřebuji
> aby ta logika byla spolehlivá. Ano, mám na tom rybičky a čerpadlo topení (
> a taky zalévání na zahradě a vodoměr a zvonky a fakt hodně blbostí :-)
>
> Atmega s watchdogem to zatím pár let dala bez ztráty kytičky, uptime tam
> přetékal bez toho aby se to nějak resetovalo nebo tak něco.
>
> Mám to vše jakoby centralizované u hlavního rozvaděče, takže nepotřebuji
> bezdrátové nody po domě, jde mi o to nahradit tu AtMegu něčím výkonnějším.
>
> Budu tam potřebovat hodně I/O, je dobrý nápad k tomu ESP32 dávat pár
> PCF8574 jako I/O expander nebo je něco robusnějšího?
>
> A další věc, je potřeba k ESP32 dávat externí WDT?
>
> HP
>
> st 26. 5. 2021 v 11:47 odesílatel Pavel Brychta <pavel.brychta na duhasys.eu>
> napsal:
> Tak zrovna to je exemplární případ, jak to určitě nedělat. Zde
>
> https://github.com/Alextros00/ESP32-MQTT-Relay-Control/blob/main/main/app_main.c
> není jediná zmínka, nebo náznak řešení nějakého failsafe mechanizmu.
> Celé to je na úrovni primitivního Arduino example, který se s detaily
> jako je třeba jméno topcu vůbec nezalamuje. MQTT failsafe samo o sobě
> nevyřeší ani omylem.
>
> P.B.
>
> Dne 26. 05. 21 v 11:28 T. Meinlschmidt napsal(a):
> > proto pisu mqtt. esp32 tu podporu mqtt ma pomerne slusnou. viz treba
> > takovy easy priklad
> >
> > https://github.com/Alextros00/Home-Automation-NodeRED-ESP-Telegram
> >
> > tm
> >
> > Dne 2021-05-26 10:54, Pavel Brychta napsal:
> >> ... až na to, že když pak lehne to Pi, nebo WiFi, tak zůstane třeba
> >> čerpadlo běžet stále, nebo uvaříte rybičky. Přiznám se, že takovouto
> >> cestou bych nikdy nešel, protože to znamená mít failsafe procesy v ESP
> >> a řídící logiku jinde, což pro účely automatizace považuji za hodně
> >> nešťastné řešení. Když už, tak autonomní pocesy na zařízení a API pro
> >> parametrizaci do toho rPi...
> >>
> >> P.B.
> >>
> >> Dne 26. 05. 21 v 10:49 T. Meinlschmidt napsal(a):
> >>> dobre dopoledne.
> >>>
> >>> ja se priznam, ze bych vubec nesel touhle cestou, ale mel ESP ciste
> >>> na hw veci a sber nejakych dat,
> >>> a celou tu logiku nechal v node-red + mqtt (treba na rpi). Casem na
> >>> to muzete navazat mobil, UI si udelate podle sebe pomerne jednoduse,
> >>> navic to umi spoustu veci z jinych zdroju.
> >>>
> >>> tm
> >>>
> >>> Dne 2021-05-26 10:32, Jan Půhoný napsal:
> >>>> Dobré dopoledne,
> >>>>
> >>>> Ještě bych potřeboval poradit co použít za systém na ESP32.
> >>>> Jedná se mi o to, že do ESP32 přepisuji z Atmegy 2560 něco jako
> >>>> řízení topení a různých zdrojů tepla a různých hejblátek
> >>>> doma. Do teď to běží na ATMEGA 2560 a mám tam jednoduchý
> >>>> "multitasking" pomocí millis. Jedná se v podstatě jen o čtení
> >>>> teplotních čidel, webserver a pak různé výstupy v podobě SSR
> >>>> relé + vstupy a logika mezi tím. Nic složitého. Na druhou stranu
> >>>> za ty roky to celkem naboptnalo co se kódu týče a ten webserver na
> >>>> té AT2560 je takový dost líný. Navíc tam potřebuji číst http
> >>>> requesty data z komerční meteostanice a na to už to moc není.
> >>>>
> >>>> Neexistuje nějaký opensource projekt na ESP32, kde by byly
> >>>> vyřešeny základní věci jako webserver + nějaká grafika a
> >>>> hejblátka abych to nemusel psát úplně od začátku. Líbilo by se
> >>>> mi už https a základní struktura a dopsal bych si do toho jen tu
> >>>> vlastní logiku a ovládání vstupů a výstupů.
> >>>>
> >>>> Je dobrý nápad na to ESP dávat FreeRTOS, nebo to už je překonané
> >>>> a používáte něco lepšího? Případně víte o nějakém open
> >>>> source projektu pro domácí automatizaci pro ESP32?
> >>>>
> >>>> Ano, googlil jsem, ale serp je zaplaven videi geeků kteří připojí
> >>>> k pár relátkům esp a myslí si co nevymysleli a trochu se v tom
> >>>> ztrácím. Já bych potřeboval něco trochu robusnějšího.
> >>>>
> >>>> Díky za nápady.
> >>>>
> >>>> HP
> >>>> _______________________________________________
> >>>> HW-list mailing list - sponsored by www.HW.cz
> >>>> Hw-list na list.hw.cz
> >>>> http://list.hw.cz/mailman/listinfo/hw-list
> >>> _______________________________________________
> >>> HW-list mailing list - sponsored by www.HW.cz
> >>> Hw-list na list.hw.cz
> >>> http://list.hw.cz/mailman/listinfo/hw-list
> >> _______________________________________________
> >> HW-list mailing list - sponsored by www.HW.cz
> >> Hw-list na list.hw.cz
> >> http://list.hw.cz/mailman/listinfo/hw-list
> > _______________________________________________
> > HW-list mailing list - sponsored by www.HW.cz
> > Hw-list na list.hw.cz
> > http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list Nemáte zač - co se týče WiFi,
> tak hledejte nastavení autoReconnect a autoConnect parametrů (až použijete
> ten wifimanager/wificonfig, tak tohle řešit nemusíte). Je možné, že je máte
> nastavené na false a pak se to znovu nepřipojí. Pokud budete mít další
> dotazy, tak možná raději pište přímo - nejsem si jistý, kolik lidí by tohle
> zajímalo.
> P.B.
> Dne 02. 06. 21 v 10:51 Jan Půhoný napsal(a):
> Ok, díky moc za tipy. Už jsem to snad pochopil. Ještě mě zarazila jedna
> věc, předpokládal bych, že to už je na takovém modulu ošetřené v základu
> nebo přímo ve wifi řadiči nebo jak to napsat, ale evidentně ne. Pokud
> odpojím wifi, třeba tak, že restartuji wifi router, tak se sama znovu
> nepřipojí.
>
> Dá se to nějak nastavit? Nebo musím jednou za čas volat něco jako tento
> kód? Je nějaké doporučení jak to často testovat? Ale čekal bych, že když se
> to jednou nastaví, že to bude vyřešeno na úrovni toho wifi řadiče. Nebo mám
> něco blbě?
>
> if (WiFi.waitForConnectResult() != WL_CONNECTED) {
>
> WiFi.mode(WIFI_STA);
> WiFi.begin(ssid, password);
>
> }
>
> Díky,
>
> HP
>
> po 31. 5. 2021 v 12:06 odesílatel Pavel Brychta <pavel.brychta na duhasys.eu>
> napsal:
> DD,
> přesně tak. Když se podíváte do includnuté Arduino.h, tak uvidíte, že
> freertos/FreeRTOS.h, freertos/task.h a freertos/semphr.h jsou součástí,
> takže můžete volat přímo RTOS funkce. Pro začátek doporučuju si načíst
> třeba https://savjee.be/2020/01/multitasking-esp32-arduino-freertos/ a
> pak si k tomu najděte nějaký příklad na semafory a mutexy. Přes millis() to
> bude fungovat také, ale kooperativně. Další možností pak je použít knihovnu
> Ticker, která umožňuje vyytvořit hybrid mezi kooperativním použitím
> millis() a vláknovým RTOS (ušetříte třeba RAM na stack oblasti). Trošku
> potíž může být při přístupu do proměnných dash knihovny z jiného vlákna
> (proto to doporučení studia semaforů), ale to dokážou ošetřit semafory,
> nebo fronty. Pokud ale program bude té složitosti, co jste poslal, tak
> není důvod používat ani RTOS, ani Ticker, ale použijte třeba moji
> historickou https://github.com/Pablo2048/Interval (teď koukám, že by
> zasloužila aktualizovat - tak zkuste třeba aktuálnější verzi z
> https://git.xpablo.cz/pablo2048/Interval ). Ta parametrizace WiFi by si
> taky zasloužila něco lepšího než hardcoded credentials - zkuste se podívat
> na knihovnu Wifimanager, nebo můj wificonfig (pokud jste dostatečně
> odvážný...)
> P.B.
> Dne 31. 05. 21 v 11:17 Jan Půhoný napsal(a):
> Díky,
>
> delay jsem dal pryč. Už to funguje. "Multitasking" na arduinu jsem dělal
> pomocí millis, tady to funguje taky, viz kód níže, ale jak se to dělá
> elegantněji na ESP32? Pochopil jsem, že když použiji Arduino framework, tak
> by mělo jít psát přímo s využitím freertos? Omlouvám se za lama dotazy, ale
> to tam nemusím už nic includovat a rovnou můžu používat něco jako?
>
> void vATaskFunction( void *pvParameters )
> {
> for( ;; )
> {
> -- Task application code here. --
> }
>
> /* Tasks must not attempt to return from their implementing
> function or otherwise exit. In newer FreeRTOS port
> attempting to do so will result in an configASSERT() being
> called if it is defined. If it is necessary for a task to
> exit then have the task call vTaskDelete( NULL ) to ensure
> its exit is clean. */
> vTaskDelete( NULL );
> }
>
> Potřebuji něco kolem 10 ti tasku, nic náročného, každý se provede do max
> 1s. Nebo to mám udělat jen pomocí millis? Je potřeba, aby tam na pozadí
> běžel dash a OTA, takto mi to funguje:
>
> #include <Arduino.h>
> /* ESP32 Dependencies */
> #include <WiFi.h>
> #include <AsyncTCP.h>
> #include <ESPAsyncWebServer.h>
> #include <ESPDash.h>
> #include <WiFiUdp.h>
> #include <ArduinoOTA.h>
> #include "uptime.h"
> #include "uptime_formatter.h"
> /* Your WiFi Credentials */
> const char* ssid = "puhy_iot"; // SSID
> const char* password = "iot44puhy"; // Password
> const char* OTAhostname = "ESP-puhy";
> /* Start Webserver */
> AsyncWebServer server(80);
> /* Attach ESP-DASH to AsyncWebServer */
> ESPDash dashboard(&server);
> /*
> Button Card
> Format - (Dashboard Instance, Card Type, Card Name)
> */
> Card button(&dashboard, BUTTON_CARD, "Zalévej");
> Card button1(&dashboard, BUTTON_CARD, "Čisti");
> Card button2(&dashboard, BUTTON_CARD, "Zatop");
> Card uptimeCard(&dashboard, STATUS_CARD, "Uptime", "success");
> /*
> Slider Card
> Format - (Dashboard Instance, Card Type, Card Name, Card
> Symbol(optional), int min, int max)
> */
> Card slider(&dashboard, SLIDER_CARD, "Test Slider", "", 0, 255);
> const int ledHeartBeatPin = 2;
> const int ledPin = 5;
> // setting PWM properties
> const int ledPinPWM = 13; /* GPIO13 */
> //int dutyCycle;
> /* Setting PWM Properties */
> const int PWMFreq = 5000; /* 5 KHz */
> const int PWMChannel = 0;
> const int PWMResolution = 8;
> const int MAX_DUTY_CYCLE = (int)(pow(2, PWMResolution) - 1);
> // Variables will change:
> int ledState = LOW; // ledState used to set the LED
> // Generally, you should use "unsigned long" for variables that hold time
> // The value will quickly become too large for an int to store
> unsigned long previousMillis = 0; // will store last time LED was
> updated
> // constants won't change:
> long heartBeatInterval = 1000; // interval at which to blink
> (milliseconds)
> void setup() {
> pinMode (ledPin, OUTPUT);
> pinMode (ledHeartBeatPin, OUTPUT);
> pinMode (ledPinPWM, OUTPUT);
> ledcSetup(PWMChannel, PWMFreq, PWMResolution);
> /* Attach the LED PWM Channel to the GPIO Pin */
> ledcAttachPin(ledPinPWM, PWMChannel);
> Serial.begin(115200);
> /* Connect WiFi */
> WiFi.mode(WIFI_STA);
> WiFi.begin(ssid, password);
> if (WiFi.waitForConnectResult() != WL_CONNECTED) {
> Serial.printf("WiFi Failed!\n");
> return;
> }
> Serial.print("IP Address: ");
> Serial.println(WiFi.localIP());
> /* Attach Button Callback */
> button.attachCallback([&](bool value){
> /* Print our new button value received from dashboard */
> Serial.println("Button Triggered: "+String((value)?"true":"false"));
> /* Make sure we update our button's value and send update to dashboard
> */
> button.update(value);
> digitalWrite (ledPin, value);
> dashboard.sendUpdates();
> });
> /* Attach Slider Callback */
> slider.attachCallback([&](int value){
> /* Print our new slider value received from dashboard */
> Serial.println("Slider Triggered: "+String(value));
> /* Make sure we update our slider's value and send update to dashboard
> */
> slider.update(value);
> ledcWrite(PWMChannel, value);
> dashboard.sendUpdates();
> });
> /* Start AsyncWebServer */
> server.begin();
> ArduinoOTA.setHostname(OTAhostname);
> ArduinoOTA.onStart([]()
> {
> Serial.println("Start");
> });
> ArduinoOTA.onEnd([]()
> {
> Serial.println("\nEnd");
> });
> ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
> {
> Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
> });
> ArduinoOTA.onError([](ota_error_t error)
> {
> Serial.printf("Error[%u]: ", error);
> if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
> else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
> else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
> else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
> else if (error == OTA_END_ERROR) Serial.println("End Failed");
> });
> ArduinoOTA.begin();
> }
> void loop() {
> /* Nothing so far */
> ArduinoOTA.handle();
> // here is where you'd put code that needs to be running all the time.
> // check to see if it's time to blink the LED; that is, if the difference
> // between the current time and last time you blinked the LED is bigger
> than
> // the interval at which you want to blink the LED.
> unsigned long currentMillis = millis();
> if (currentMillis - previousMillis >= heartBeatInterval) {
> // save the last time you blinked the LED
> previousMillis = currentMillis;
> // if the LED is off turn it on and vice-versa:
> if (ledState == LOW) {
> ledState = HIGH;
> heartBeatInterval = 2500; }
> else {
> heartBeatInterval = 20;
> ledState = LOW; }
>
> // set the LED with the ledState of the variable:
> digitalWrite(ledHeartBeatPin, ledState);
> Serial.println(uptime_formatter::getUptime());
> uptimeCard.update(uptime_formatter::getUptime()); }
>
>
>
> Díky za podporu. HP pá 28. 5. 2021 v 6:10 odesílatel Pavel Brychta <
>
>
>
>
> pavel.brychta na duhasys.eu> napsal:
> DD,
> ano, handler se dává do loop(), ale doporučuju odstranit ten nešťastný
> delay() i když to zrovna nemusí být zdroj problému. Potíž je v tom, že
> nepíšete jak se projevuje to, že to nefunguje - pokud upoad proběhne, ale
> podezřele rychle a firmware se ve skutečnosti nenahraje, tak je to tím, že
> jste nevymazal paměť flash (pio run -t erase) a to ESP má uloženou jinou
> partition tabulku. Vždycky, když nahrávám do nového modulu, tak udělám
> výmaz flash a teprve pak nahraju první firmware. Já prakticky výhradně
> používám Wrover 16MB moduly s trošku upravenou vnitřní konfigurací a
> všechny tyto úpravy dělám v přípravku mimo zařízení před osazením (reklamní
> linka https://s.click.aliexpress.com/e/_9j8PIP ).
> P.B.
> Dne 27. 05. 21 v 23:22 Jan Půhoný napsal(a):
> Dobrý večer,
>
> ten ESPDash je super. Ještě jednou díky za tip. Ohledně těch WDT asi tam
> dám i ten externí, bude potřeba ale časovat někde kolem 1minuty, aby to
> nezabíralo v případě update firmware.
>
> Trochu se s trápím s tím, jak zkombinovat svůj kód s OTA update. Funguje
> mi jen jedno nebo druhé, ale dohromady ne.
>
> Když to napíšu takto z(viz níže), tak OTA je vidět (např. v Arduino IDE)
> ale nejde nic nahrát. Testoval jsem jak Arduino IDE, tak platformio.
>
>
>
> Když tam dám jen příklad OTA tak upload normálně funguje, když tam dám jen
> ESPDash, normálně to funguje. Ale dohromady ne.
>
> Píše se ten OTA handler opravdu do loop?
>
> #include <Arduino.h>
> #if defined(ESP8266)
> /* ESP8266 Dependencies */
> #include <ESP8266WiFi.h>
> #include <ESPAsyncTCP.h>
> #include <ESPAsyncWebServer.h>
> #elif defined(ESP32)
> /* ESP32 Dependencies */
> #include <WiFi.h>
> #include <AsyncTCP.h>
> #include <ESPAsyncWebServer.h>
> #endif
> #include <ESPDash.h>
>
>
> #include <WiFiUdp.h>
>
>
> *#include <ArduinoOTA.h> */* Your WiFi Credentials */
> const char* ssid = "******"; // SSID
> const char* password = "******"; // Password
>
> const char* OTAhostname = "ESP-puhy";
>
> /* Start Webserver */
> AsyncWebServer server(80);
>
> /* Attach ESP-DASH to AsyncWebServer */
> ESPDash dashboard(&server);
>
> /*
> Button Card
> Format - (Dashboard Instance, Card Type, Card Name)
> */
> Card button(&dashboard, BUTTON_CARD, "Test Button");
>
> /*
> Slider Card
> Format - (Dashboard Instance, Card Type, Card Name, Card
> Symbol(optional), int min, int max)
> */
> Card slider(&dashboard, SLIDER_CARD, "Test Slider", "", 0, 255);
>
>
> void setup() {
> Serial.begin(115200);
>
> /* Connect WiFi */
> WiFi.mode(WIFI_STA);
> WiFi.begin(ssid, password);
> if (WiFi.waitForConnectResult() != WL_CONNECTED) {
> Serial.printf("WiFi Failed!\n");
> return;
> }
> Serial.print("IP Address: ");
> Serial.println(WiFi.localIP());
>
> /* Attach Button Callback */
> button.attachCallback([&](bool value){
> /* Print our new button value received from dashboard */
> Serial.println("Button Triggered: "+String((value)?"true":"false"));
> /* Make sure we update our button's value and send update to dashboard
> */
> button.update(value);
> dashboard.sendUpdates();
> });
>
> /* Attach Slider Callback */
> slider.attachCallback([&](int value){
> /* Print our new slider value received from dashboard */
> Serial.println("Slider Triggered: "+String(value));
> /* Make sure we update our slider's value and send update to dashboard
> */
> slider.update(value);
> dashboard.sendUpdates();
> });
>
> /* Start AsyncWebServer */
> server.begin();
>
> ArduinoOTA.setHostname(OTAhostname);
> ArduinoOTA.onStart([]()
> {
> Serial.println("Start");
> });
> ArduinoOTA.onEnd([]()
> {
> Serial.println("\nEnd");
> });
> ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
> {
> Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
> });
> ArduinoOTA.onError([](ota_error_t error)
> {
> Serial.printf("Error[%u]: ", error);
> if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
> else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
> else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
> else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
> else if (error == OTA_END_ERROR) Serial.println("End Failed");
> });
> ArduinoOTA.begin();
> }
>
> void loop() {
> /* Nothing so far */
>
>
> * ArduinoOTA.handle(); * delay(5000);
>
> }
>
> Díky,
>
> HP
>
>
> st 26. 5. 2021 v 13:45 odesílatel Pavel Brychta <pavel.brychta na duhasys.eu>
> napsal:
> Co se týče WDT, tak fakt nevím - mě zatím vždycky stačil vnitřní v ESP32
> (má i brownout detector, který už jsem také viděl zabrat). Zařízení mi běží
> 24/7. Expandér můžu doporučit místo toho PCF raději MCP23008 (nebo 16,
> pokud je 8 GPIO málo) - minimálně z toho důvodu, že má asynchronní reset,
> takže po resetu jsou GPIO v definovaných stavech.
> P.B.
> Dne 26. 05. 21 v 13:30 Jan Půhoný napsal(a):
> Díky za reakce. Jde mi o to mít to co nejvíce low level. Opravdu do toho
> nechci tahat RasPi. Musí to jet i když nepůjde wifi a s tou Atmegou to drží
> roky až se divím.
>
> Maximálně do budoucna můžu přidat nějakou vizualizaci na něčem jako RasPi,
> ale to spíš už přímo posílat requesty na www a ukládat do MySQL. Potřebuji
> aby ta logika byla spolehlivá. Ano, mám na tom rybičky a čerpadlo topení (
> a taky zalévání na zahradě a vodoměr a zvonky a fakt hodně blbostí :-)
>
> Atmega s watchdogem to zatím pár let dala bez ztráty kytičky, uptime tam
> přetékal bez toho aby se to nějak resetovalo nebo tak něco.
>
> Mám to vše jakoby centralizované u hlavního rozvaděče, takže nepotřebuji
> bezdrátové nody po domě, jde mi o to nahradit tu AtMegu něčím výkonnějším.
>
> Budu tam potřebovat hodně I/O, je dobrý nápad k tomu ESP32 dávat pár
> PCF8574 jako I/O expander nebo je něco robusnějšího?
>
> A další věc, je potřeba k ESP32 dávat externí WDT?
>
> HP
>
> st 26. 5. 2021 v 11:47 odesílatel Pavel Brychta <pavel.brychta na duhasys.eu>
> napsal:
> Tak zrovna to je exemplární případ, jak to určitě nedělat. Zde
>
> https://github.com/Alextros00/ESP32-MQTT-Relay-Control/blob/main/main/app_main.c
> není jediná zmínka, nebo náznak řešení nějakého failsafe mechanizmu.
> Celé to je na úrovni primitivního Arduino example, který se s detaily
> jako je třeba jméno topcu vůbec nezalamuje. MQTT failsafe samo o sobě
> nevyřeší ani omylem.
>
> P.B.
>
> Dne 26. 05. 21 v 11:28 T. Meinlschmidt napsal(a):
> > proto pisu mqtt. esp32 tu podporu mqtt ma pomerne slusnou. viz treba
> > takovy easy priklad
> >
> > https://github.com/Alextros00/Home-Automation-NodeRED-ESP-Telegram
> >
> > tm
> >
> > Dne 2021-05-26 10:54, Pavel Brychta napsal:
> >> ... až na to, že když pak lehne to Pi, nebo WiFi, tak zůstane třeba
> >> čerpadlo běžet stále, nebo uvaříte rybičky. Přiznám se, že takovouto
> >> cestou bych nikdy nešel, protože to znamená mít failsafe procesy v ESP
> >> a řídící logiku jinde, což pro účely automatizace považuji za hodně
> >> nešťastné řešení. Když už, tak autonomní pocesy na zařízení a API pro
> >> parametrizaci do toho rPi...
> >>
> >> P.B.
> >>
> >> Dne 26. 05. 21 v 10:49 T. Meinlschmidt napsal(a):
> >>> dobre dopoledne.
> >>>
> >>> ja se priznam, ze bych vubec nesel touhle cestou, ale mel ESP ciste
> >>> na hw veci a sber nejakych dat,
> >>> a celou tu logiku nechal v node-red + mqtt (treba na rpi). Casem na
> >>> to muzete navazat mobil, UI si udelate podle sebe pomerne jednoduse,
> >>> navic to umi spoustu veci z jinych zdroju.
> >>>
> >>> tm
> >>>
> >>> Dne 2021-05-26 10:32, Jan Půhoný napsal:
> >>>> Dobré dopoledne,
> >>>>
> >>>> Ještě bych potřeboval poradit co použít za systém na ESP32.
> >>>> Jedná se mi o to, že do ESP32 přepisuji z Atmegy 2560 něco jako
> >>>> řízení topení a různých zdrojů tepla a různých hejblátek
> >>>> doma. Do teď to běží na ATMEGA 2560 a mám tam jednoduchý
> >>>> "multitasking" pomocí millis. Jedná se v podstatě jen o čtení
> >>>> teplotních čidel, webserver a pak různé výstupy v podobě SSR
> >>>> relé + vstupy a logika mezi tím. Nic složitého. Na druhou stranu
> >>>> za ty roky to celkem naboptnalo co se kódu týče a ten webserver na
> >>>> té AT2560 je takový dost líný. Navíc tam potřebuji číst http
> >>>> requesty data z komerční meteostanice a na to už to moc není.
> >>>>
> >>>> Neexistuje nějaký opensource projekt na ESP32, kde by byly
> >>>> vyřešeny základní věci jako webserver + nějaká grafika a
> >>>> hejblátka abych to nemusel psát úplně od začátku. Líbilo by se
> >>>> mi už https a základní struktura a dopsal bych si do toho jen tu
> >>>> vlastní logiku a ovládání vstupů a výstupů.
> >>>>
> >>>> Je dobrý nápad na to ESP dávat FreeRTOS, nebo to už je překonané
> >>>> a používáte něco lepšího? Případně víte o nějakém open
> >>>> source projektu pro domácí automatizaci pro ESP32?
> >>>>
> >>>> Ano, googlil jsem, ale serp je zaplaven videi geeků kteří připojí
> >>>> k pár relátkům esp a myslí si co nevymysleli a trochu se v tom
> >>>> ztrácím. Já bych potřeboval něco trochu robusnějšího.
> >>>>
> >>>> Díky za nápady.
> >>>>
> >>>> HP
> >>>> _______________________________________________
> >>>> HW-list mailing list - sponsored by www.HW.cz
> >>>> Hw-list na list.hw.cz
> >>>> http://list.hw.cz/mailman/listinfo/hw-list
> >>> _______________________________________________
> >>> HW-list mailing list - sponsored by www.HW.cz
> >>> Hw-list na list.hw.cz
> >>> http://list.hw.cz/mailman/listinfo/hw-list
> >> _______________________________________________
> >> HW-list mailing list - sponsored by www.HW.cz
> >> Hw-list na list.hw.cz
> >> http://list.hw.cz/mailman/listinfo/hw-list
> > _______________________________________________
> > HW-list mailing list - sponsored by www.HW.cz
> > Hw-list na list.hw.cz
> > http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________ HW-list mailing list -
> sponsored by www.HW.cz Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________ HW-list mailing list -
> sponsored by www.HW.cz Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________ HW-list mailing list -
> sponsored by www.HW.cz Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________ HW-list mailing list -
> sponsored by www.HW.cz Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210731/0941989d/attachment-0001.html>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 1624 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210731/0941989d/attachment-0001.png>
Další informace o konferenci Hw-list