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