<div dir="ltr">Dobrý večer,<div><br></div><div>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.<div><br></div><div>Např: nad setup jsem přidal funkci <span style="font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre;background-color:rgb(30,30,30);color:rgb(86,156,214)">void</span><span style="color:rgb(212,212,212);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre;background-color:rgb(30,30,30)"> </span><span style="font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre;background-color:rgb(30,30,30);color:rgb(220,220,170)">heartBeat</span> ,která by mi měla hýbat pinem pro externí WDT.  Do setupu jsem dal xTaskCreate, zkoušel jsem i xTaskCreatePinnedToCore.</div><div><br></div><div><div style="color:rgb(212,212,212);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre"><span style="color:rgb(106,153,85)">//xTaskCreate(</span></div><div style="color:rgb(212,212,212);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre">  <span style="color:rgb(220,220,170)">xTaskCreatePinnedToCore</span>(</div><div style="color:rgb(212,212,212);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre">    <span style="color:rgb(220,220,170)">heartBeat</span>,<span style="color:rgb(106,153,85)">    // Function that should be called</span></div><div style="color:rgb(212,212,212);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre">    <span style="color:rgb(206,145,120)">"heartBeatPin change"</span>,<span style="color:rgb(106,153,85)">   // Name of the task (for debugging)</span></div><div style="color:rgb(212,212,212);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre">    <span style="color:rgb(181,206,168)">1000</span>,<span style="color:rgb(106,153,85)">            // Stack size (bytes)</span></div><div style="color:rgb(212,212,212);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre">    <span style="color:rgb(86,156,214)">NULL</span>,<span style="color:rgb(106,153,85)">            // Parameter to pass</span></div><div style="color:rgb(212,212,212);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre">    <span style="color:rgb(181,206,168)">1</span>,<span style="color:rgb(106,153,85)">               // Task priority</span></div><div style="color:rgb(212,212,212);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre">    <span style="color:rgb(86,156,214)">NULL</span>,<span style="color:rgb(106,153,85)">            // Task handle</span></div><div style="color:rgb(212,212,212);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre">    <span style="color:rgb(181,206,168)">1</span><span style="color:rgb(106,153,85)">            // Core 1/0</span></div><div style="color:rgb(212,212,212);font-family:Consolas,"Courier New",monospace;font-size:14px;white-space:pre">  );</div></div><div><br></div><div>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.</div><div><br></div><div>Resetuje se to s tímto:</div><div><br></div><div>rst:0x1 (POWERON_RESET),boot:0x12 (SPI_FAST_FLASH_BOOT)<br>configsip: 0, SPIWP:0xee<br>clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00<br>mode:DIO, clock div:2<br>load:0x3fff0018,len:4<br>load:0x3fff001c,len:1044<br>load:0x40078000,len:10124<br>load:0x40080400,len:5828<br>entry 0x400806a8<br></div><div><br></div><div>Když vyhodím xTaskCreate nebo xTaskCreatePinnedToCore neresetuje se to.</div><div><br></div><div>Kde je ten zakopaný pes?</div><div><br></div><div><b>Díky </b>za nápady, celý kód níže.</div><div><br></div><div>HP</div></div><div><br></div><div><div style="color:rgb(212,212,212);background-color:rgb(30,30,30);font-family:Consolas,"Courier New",monospace;font-size:14px;line-height:19px;white-space:pre"><div><span style="color:rgb(106,153,85)">/*</span></div><div><span style="color:rgb(106,153,85)">  -----------------------------</span></div><div><span style="color:rgb(106,153,85)">  ESPDASH Lite - Interactive Example</span></div><div><span style="color:rgb(106,153,85)">  -----------------------------</span></div><div><span style="color:rgb(106,153,85)">  Skill Level: Intermediate</span></div><div><span style="color:rgb(106,153,85)">  In this example we will be creating a interactive dashboard which consists </span></div><div><span style="color:rgb(106,153,85)">  of a button and a slider.</span></div><div><span style="color:rgb(106,153,85)">  Github: <a href="https://github.com/ayushsharma82/ESP-DASH">https://github.com/ayushsharma82/ESP-DASH</a></span></div><div><span style="color:rgb(106,153,85)">  WiKi: <a href="https://ayushsharma82.github.io/ESP-DASH/">https://ayushsharma82.github.io/ESP-DASH/</a></span></div><div><span style="color:rgb(106,153,85)">  Works with both ESP8266 & ESP32</span></div><div><span style="color:rgb(106,153,85)">  -------------------------------</span></div><div><span style="color:rgb(106,153,85)">  Upgrade to ESP-DASH Pro: <a href="https://espdash.pro">https://espdash.pro</a></span></div><div><span style="color:rgb(106,153,85)">*/</span></div><br><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><Arduino.h></span></div><br><div><span style="color:rgb(106,153,85)">  /* ESP32 Dependencies */</span></div><div><span style="color:rgb(86,156,214)">  </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><WiFi.h></span></div><div><span style="color:rgb(86,156,214)">  </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><AsyncTCP.h></span></div><div><span style="color:rgb(86,156,214)">  </span><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><ESPAsyncWebServer.h></span></div><br><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><ESPDash.h></span></div><br><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><ArduinoOTA.h></span></div><br><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)">"uptime.h"</span></div><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)">"uptime_formatter.h"</span></div><br><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><Wire.h></span></div><br><div><span style="color:rgb(197,134,192)">#include</span><span style="color:rgb(86,156,214)"> </span><span style="color:rgb(206,145,120)"><esp_wifi.h></span></div><br><div><span style="color:rgb(78,201,176)">uint8_t</span> <span style="color:rgb(156,220,254)">current_protocol</span>;</div><div><span style="color:rgb(78,201,176)">esp_interface_t</span> <span style="color:rgb(156,220,254)">current_esp_interface</span>;</div><div><span style="color:rgb(78,201,176)">wifi_interface_t</span> <span style="color:rgb(156,220,254)">current_wifi_interface</span>;</div><br><div><span style="color:rgb(106,153,85)">/* Your WiFi Credentials */</span></div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">char</span>* <span style="color:rgb(156,220,254)">ssid</span> = <span style="color:rgb(206,145,120)">"*****"</span>;<span style="color:rgb(106,153,85)"> // SSID</span></div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">char</span>* <span style="color:rgb(156,220,254)">password</span> = <span style="color:rgb(206,145,120)">"*****"</span>;<span style="color:rgb(106,153,85)"> // Password</span></div><br><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">char</span>* <span style="color:rgb(156,220,254)">OTAhostname</span> = <span style="color:rgb(206,145,120)">"ESP-puhy"</span>;</div><br><div><span style="color:rgb(106,153,85)">/* Start Webserver */</span></div><div><span style="color:rgb(78,201,176)">AsyncWebServer</span> <span style="color:rgb(156,220,254)">server</span>(<span style="color:rgb(181,206,168)">80</span>);</div><br><div><span style="color:rgb(106,153,85)">/* Attach ESP-DASH to AsyncWebServer */</span></div><div><span style="color:rgb(78,201,176)">ESPDash</span> <span style="color:rgb(156,220,254)">dashboard</span>(&<span style="color:rgb(156,220,254)">server</span>); </div><br><div><span style="color:rgb(106,153,85)">/* </span></div><div><span style="color:rgb(106,153,85)">  Button Card</span></div><div><span style="color:rgb(106,153,85)">  Format - (Dashboard Instance, Card Type, Card Name)</span></div><div><span style="color:rgb(106,153,85)">*/</span></div><div><span style="color:rgb(78,201,176)">Card</span> <span style="color:rgb(156,220,254)">button1</span>(&<span style="color:rgb(156,220,254)">dashboard</span>, <span style="color:rgb(79,193,255)">BUTTON_CARD</span>, <span style="color:rgb(206,145,120)">"Zalévej 1"</span>);</div><div><span style="color:rgb(78,201,176)">Card</span> <span style="color:rgb(156,220,254)">button2</span>(&<span style="color:rgb(156,220,254)">dashboard</span>, <span style="color:rgb(79,193,255)">BUTTON_CARD</span>, <span style="color:rgb(206,145,120)">"Zalévej 2"</span>);</div><div><span style="color:rgb(78,201,176)">Card</span> <span style="color:rgb(156,220,254)">button3</span>(&<span style="color:rgb(156,220,254)">dashboard</span>, <span style="color:rgb(79,193,255)">BUTTON_CARD</span>, <span style="color:rgb(206,145,120)">"Zalévej 3"</span>);</div><div><span style="color:rgb(78,201,176)">Card</span> <span style="color:rgb(156,220,254)">button4</span>(&<span style="color:rgb(156,220,254)">dashboard</span>, <span style="color:rgb(79,193,255)">BUTTON_CARD</span>, <span style="color:rgb(206,145,120)">"Zalévej 4"</span>);</div><br><br><div><span style="color:rgb(78,201,176)">Card</span> <span style="color:rgb(156,220,254)">uptimeCard</span>(&<span style="color:rgb(156,220,254)">dashboard</span>, <span style="color:rgb(79,193,255)">STATUS_CARD</span>, <span style="color:rgb(206,145,120)">"Uptime"</span>, <span style="color:rgb(206,145,120)">"success"</span>);</div><div><span style="color:rgb(78,201,176)">Card</span> <span style="color:rgb(156,220,254)">signalCard</span>(&<span style="color:rgb(156,220,254)">dashboard</span>, <span style="color:rgb(79,193,255)">STATUS_CARD</span>, <span style="color:rgb(206,145,120)">"Signal"</span>, <span style="color:rgb(206,145,120)">"success"</span>);</div><br><br><div><span style="color:rgb(106,153,85)">/* </span></div><div><span style="color:rgb(106,153,85)">  Slider Card</span></div><div><span style="color:rgb(106,153,85)">  Format - (Dashboard Instance, Card Type, Card Name, Card Symbol(optional), int min, int max)</span></div><div><span style="color:rgb(106,153,85)">*/</span></div><div><span style="color:rgb(78,201,176)">Card</span> <span style="color:rgb(156,220,254)">slider</span>(&<span style="color:rgb(156,220,254)">dashboard</span>, <span style="color:rgb(79,193,255)">SLIDER_CARD</span>, <span style="color:rgb(206,145,120)">"Test Slider"</span>, <span style="color:rgb(206,145,120)">""</span>, <span style="color:rgb(181,206,168)">0</span>, <span style="color:rgb(181,206,168)">255</span>);</div><br><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">ledPinBlue</span> = <span style="color:rgb(181,206,168)">2</span>;</div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">ledPinRed</span> = <span style="color:rgb(181,206,168)">27</span>;</div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">ledPinGreen</span> = <span style="color:rgb(181,206,168)">26</span>;</div><br><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">ventMain1</span> = <span style="color:rgb(181,206,168)">18</span>;</div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">ventOn1</span> = <span style="color:rgb(181,206,168)">5</span>;</div><br><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">ventMain2</span> = <span style="color:rgb(181,206,168)">19</span>;</div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">ventOn2</span> = <span style="color:rgb(181,206,168)">21</span>;</div><br><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">ventMain3</span> = <span style="color:rgb(181,206,168)">32</span>;</div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">ventOn3</span> = <span style="color:rgb(181,206,168)">33</span>;</div><br><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">ventMain4</span> = <span style="color:rgb(181,206,168)">35</span>;</div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">ventOn4</span> = <span style="color:rgb(181,206,168)">34</span>;</div><br><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">heartBeatPin</span> = <span style="color:rgb(181,206,168)">12</span>;</div><br><div><span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">blinkOnTime</span> = <span style="color:rgb(181,206,168)">0</span>;</div><div><span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">blinkRepeatTime</span> = <span style="color:rgb(181,206,168)">0</span>;</div><div><span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">wlanLedState</span> = <span style="color:rgb(181,206,168)">0</span>;</div><div><span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">wlanConnected</span> = <span style="color:rgb(181,206,168)">0</span>;</div><br><br><br><div><span style="color:rgb(106,153,85)">// setting PWM properties</span></div><br><div><span style="color:rgb(106,153,85)">//int dutyCycle;</span></div><div><span style="color:rgb(106,153,85)">/* Setting PWM Properties */</span></div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">PWMFreq</span> = <span style="color:rgb(181,206,168)">5000</span>;<span style="color:rgb(106,153,85)"> /* 5 KHz */</span></div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">PWMChannel</span> = <span style="color:rgb(181,206,168)">0</span>;</div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">PWMResolution</span> = <span style="color:rgb(181,206,168)">8</span>;</div><div><span style="color:rgb(86,156,214)">const</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">MAX_DUTY_CYCLE</span> = (<span style="color:rgb(86,156,214)">int</span>)(<span style="color:rgb(220,220,170)">pow</span>(<span style="color:rgb(181,206,168)">2</span>, <span style="color:rgb(156,220,254)">PWMResolution</span>) - <span style="color:rgb(181,206,168)">1</span>);</div><br><br><div><span style="color:rgb(106,153,85)">// Variables will change:</span></div><div><span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">prevState</span> = <span style="color:rgb(86,156,214)">LOW</span>;<span style="color:rgb(106,153,85)">             // state used to set heardbeat</span></div><br><div><span style="color:rgb(106,153,85)">// Generally, you should use "unsigned long" for variables that hold time</span></div><div><span style="color:rgb(106,153,85)">// The value will quickly become too large for an int to store</span></div><div><span style="color:rgb(86,156,214)">unsigned</span> <span style="color:rgb(86,156,214)">long</span> <span style="color:rgb(156,220,254)">previousMillis</span> = <span style="color:rgb(181,206,168)">0</span>;<span style="color:rgb(106,153,85)">        // will store last time heartbeat was updated</span></div><div><span style="color:rgb(86,156,214)">unsigned</span> <span style="color:rgb(86,156,214)">long</span> <span style="color:rgb(156,220,254)">previousMillisLED</span> = <span style="color:rgb(181,206,168)">0</span>;<span style="color:rgb(106,153,85)">        // will store last time LED was updated</span></div><br><div><span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(220,220,170)">heartBeat</span>(<span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(86,156,214)">*</span> <span style="color:rgb(156,220,254)">parameter</span>){</div><div>  <span style="color:rgb(197,134,192)">for</span>(;;){<span style="color:rgb(106,153,85)"> // infinite loop</span></div><br><div>    </div><div>    <span style="color:rgb(220,220,170)">digitalWrite</span>(<span style="color:rgb(156,220,254)">heartBeatPin</span>, <span style="color:rgb(86,156,214)">LOW</span>);</div><br><div><span style="color:rgb(106,153,85)">    // Pause the task for 20ms</span></div><div>    <span style="color:rgb(220,220,170)">vTaskDelay</span>(<span style="color:rgb(181,206,168)">20</span> / <span style="color:rgb(86,156,214)">portTICK_PERIOD_MS</span>);</div><br><div>    </div><div>    <span style="color:rgb(220,220,170)">digitalWrite</span>(<span style="color:rgb(156,220,254)">heartBeatPin</span>, <span style="color:rgb(86,156,214)">HIGH</span>);</div><br><div><span style="color:rgb(106,153,85)">    // Pause the task again for 500ms</span></div><div>    <span style="color:rgb(220,220,170)">vTaskDelay</span>(<span style="color:rgb(181,206,168)">500</span> / <span style="color:rgb(86,156,214)">portTICK_PERIOD_MS</span>);</div><div>  }</div><div>}</div><br><div><span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(220,220,170)">uptimeUpdate</span>(<span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(86,156,214)">*</span> <span style="color:rgb(156,220,254)">parameter</span>){</div><div>  <span style="color:rgb(197,134,192)">for</span>(;;){<span style="color:rgb(106,153,85)"> // infinite loop</span></div><br><div>    </div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(78,201,176)">uptime_formatter</span>::<span style="color:rgb(220,220,170)">getUptime</span>());</div><br><div><span style="color:rgb(156,220,254)">uptimeCard</span>.<span style="color:rgb(220,220,170)">update</span>(<span style="color:rgb(78,201,176)">uptime_formatter</span>::<span style="color:rgb(220,220,170)">getUptime</span>());</div><br><div><span style="color:rgb(106,153,85)">// Pause the task again for 2000ms</span></div><div>    <span style="color:rgb(220,220,170)">vTaskDelay</span>(<span style="color:rgb(181,206,168)">2000</span> / <span style="color:rgb(86,156,214)">portTICK_PERIOD_MS</span>);</div><br><div> </div><div>  }</div><div>}</div><br><br><div><span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(220,220,170)">I2CRead</span>(<span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(86,156,214)">*</span> <span style="color:rgb(156,220,254)">parameter</span>){</div><div>  <span style="color:rgb(197,134,192)">for</span>(;;){<span style="color:rgb(106,153,85)"> // infinite loop</span></div><br><div>    </div><div>    <span style="color:rgb(78,201,176)">byte</span> <span style="color:rgb(156,220,254)">error</span>, <span style="color:rgb(156,220,254)">address</span>;</div><div>  <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">nDevices</span>;</div><div>  <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"Scanning..."</span>);</div><div>  <span style="color:rgb(156,220,254)">nDevices</span> = <span style="color:rgb(181,206,168)">0</span>;</div><div>  <span style="color:rgb(197,134,192)">for</span>(<span style="color:rgb(156,220,254)">address</span> = <span style="color:rgb(181,206,168)">1</span>; <span style="color:rgb(156,220,254)">address</span> < <span style="color:rgb(181,206,168)">127</span>; <span style="color:rgb(156,220,254)">address</span>++ ) {</div><div>    <span style="color:rgb(156,220,254)">Wire</span>.<span style="color:rgb(220,220,170)">beginTransmission</span>(<span style="color:rgb(156,220,254)">address</span>);</div><div>    <span style="color:rgb(156,220,254)">error</span> = <span style="color:rgb(156,220,254)">Wire</span>.<span style="color:rgb(220,220,170)">endTransmission</span>();</div><div>    <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">error</span> == <span style="color:rgb(181,206,168)">0</span>) {</div><div>      <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">print</span>(<span style="color:rgb(206,145,120)">"I2C device found at address 0x"</span>);</div><div>      <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">address</span><<span style="color:rgb(181,206,168)">16</span>) {</div><div>        <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">print</span>(<span style="color:rgb(206,145,120)">"0"</span>);</div><div>      }</div><div>      <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(156,220,254)">address</span>,<span style="color:rgb(86,156,214)">HEX</span>);</div><div>      <span style="color:rgb(156,220,254)">nDevices</span>++;</div><div>    }</div><div>    <span style="color:rgb(197,134,192)">else</span> <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">error</span>==<span style="color:rgb(181,206,168)">4</span>) {</div><div>      <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">print</span>(<span style="color:rgb(206,145,120)">"Unknow error at address 0x"</span>);</div><div>      <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">address</span><<span style="color:rgb(181,206,168)">16</span>) {</div><div>        <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">print</span>(<span style="color:rgb(206,145,120)">"0"</span>);</div><div>      }</div><div>      <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(156,220,254)">address</span>,<span style="color:rgb(86,156,214)">HEX</span>);</div><div>    }    </div><div>  }</div><div>  <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">nDevices</span> == <span style="color:rgb(181,206,168)">0</span>) {</div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"No I2C devices found</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span>);</div><div>  }</div><div>  <span style="color:rgb(197,134,192)">else</span> {</div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"done</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span>);</div><div>  }</div><br><div><span style="color:rgb(106,153,85)">// Pause the task again for 2000ms</span></div><div>    <span style="color:rgb(220,220,170)">vTaskDelay</span>(<span style="color:rgb(181,206,168)">5000</span> / <span style="color:rgb(86,156,214)">portTICK_PERIOD_MS</span>);</div><br><div> </div><div>  }</div><div>}</div><br><div><span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(220,220,170)">cardUpdate</span>(<span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(86,156,214)">*</span> <span style="color:rgb(156,220,254)">parameter</span>){</div><div>  <span style="color:rgb(197,134,192)">for</span>(;;){<span style="color:rgb(106,153,85)"> // infinite loop</span></div><br><div>    </div><div>    <span style="color:rgb(156,220,254)">signalCard</span>.<span style="color:rgb(220,220,170)">update</span>(<span style="color:rgb(156,220,254)">WiFi</span>.<span style="color:rgb(220,220,170)">RSSI</span>());</div><br><div><span style="color:rgb(106,153,85)">// Pause the task again for 2000ms</span></div><div>    <span style="color:rgb(220,220,170)">vTaskDelay</span>(<span style="color:rgb(181,206,168)">2000</span> / <span style="color:rgb(86,156,214)">portTICK_PERIOD_MS</span>);</div><br><div> </div><div>  }</div><div>}</div><br><br><br><br><br><br><br><br><br><div><span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(220,220,170)">setup</span>() {  </div><br><br><br><br><div>  </div><div>  <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">begin</span>(<span style="color:rgb(181,206,168)">9600</span>);</div><br><div><span style="color:rgb(220,220,170)">pinMode</span> (<span style="color:rgb(156,220,254)">heartBeatPin</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><div> </div><div><span style="color:rgb(220,220,170)">pinMode</span> (<span style="color:rgb(156,220,254)">ledPinRed</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><div><span style="color:rgb(220,220,170)">pinMode</span> (<span style="color:rgb(156,220,254)">ledPinGreen</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><div><span style="color:rgb(220,220,170)">pinMode</span> (<span style="color:rgb(156,220,254)">ledPinBlue</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><br><div><span style="color:rgb(220,220,170)">pinMode</span> ( <span style="color:rgb(156,220,254)">ventMain1</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><div><span style="color:rgb(220,220,170)">pinMode</span> ( <span style="color:rgb(156,220,254)">ventOn1</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><br><div><span style="color:rgb(220,220,170)">pinMode</span> ( <span style="color:rgb(156,220,254)">ventMain2</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><div><span style="color:rgb(220,220,170)">pinMode</span> ( <span style="color:rgb(156,220,254)">ventOn2</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><br><div><span style="color:rgb(220,220,170)">pinMode</span> ( <span style="color:rgb(156,220,254)">ventMain3</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><div><span style="color:rgb(220,220,170)">pinMode</span> ( <span style="color:rgb(156,220,254)">ventOn3</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><br><div><span style="color:rgb(220,220,170)">pinMode</span> ( <span style="color:rgb(156,220,254)">ventMain4</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><div><span style="color:rgb(220,220,170)">pinMode</span> ( <span style="color:rgb(156,220,254)">ventOn4</span>, <span style="color:rgb(86,156,214)">OUTPUT</span>);</div><br><div>  <span style="color:rgb(220,220,170)">ledcSetup</span>(<span style="color:rgb(156,220,254)">PWMChannel</span>, <span style="color:rgb(156,220,254)">PWMFreq</span>, <span style="color:rgb(156,220,254)">PWMResolution</span>);</div><div><span style="color:rgb(106,153,85)">  /* Attach the LED PWM Channel to the GPIO Pin */</span></div><div>  <span style="color:rgb(220,220,170)">ledcAttachPin</span>(<span style="color:rgb(156,220,254)">ledPinGreen</span>, <span style="color:rgb(156,220,254)">PWMChannel</span>);</div><br><div>  <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">begin</span>(<span style="color:rgb(181,206,168)">115200</span>);</div><br><div><span style="color:rgb(106,153,85)">  /* Connect WiFi */</span></div><br><div> </div><div>  <span style="color:rgb(156,220,254)">WiFi</span>.<span style="color:rgb(220,220,170)">mode</span>(<span style="color:rgb(86,156,214)">WIFI_STA</span>);</div><br><div><span style="color:rgb(106,153,85)">  //check_protocol();</span></div><div><span style="color:rgb(106,153,85)">   // esp_wifi_set_protocol(current_wifi_interface, WIFI_PROTOCOL_11B|WIFI_PROTOCOL_11G|WIFI_PROTOCOL_11N);</span></div><div><span style="color:rgb(106,153,85)">   //vynucení 11N wifi protokolu</span></div><div>     <span style="color:rgb(220,220,170)">esp_wifi_set_protocol</span>(<span style="color:rgb(156,220,254)">current_wifi_interface</span>, <span style="color:rgb(86,156,214)">WIFI_PROTOCOL_11N</span>);</div><div><span style="color:rgb(106,153,85)">    //check_protocol();</span></div><br><br><div><span style="color:rgb(106,153,85)">//vypnutí save režimu wifi</span></div><div>  <span style="color:rgb(220,220,170)">esp_wifi_set_ps</span>(<span style="color:rgb(79,193,255)">WIFI_PS_NONE</span>);</div><br><div>  <span style="color:rgb(156,220,254)">WiFi</span>.<span style="color:rgb(220,220,170)">begin</span>(<span style="color:rgb(156,220,254)">ssid</span>, <span style="color:rgb(156,220,254)">password</span>);</div><br><div>  </div><div>  <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">WiFi</span>.<span style="color:rgb(220,220,170)">waitForConnectResult</span>() != <span style="color:rgb(79,193,255)">WL_CONNECTED</span>) {</div><div>      <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">printf</span>(<span style="color:rgb(206,145,120)">"WiFi Failed!</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">"</span>);</div><div>      <span style="color:rgb(197,134,192)">return</span>;</div><div>  }</div><div>  <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">print</span>(<span style="color:rgb(206,145,120)">"IP Address: "</span>);</div><div>  <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(156,220,254)">WiFi</span>.<span style="color:rgb(220,220,170)">localIP</span>());</div><br><div><span style="color:rgb(106,153,85)">  /* Attach Button Callback */</span></div><div>  <span style="color:rgb(156,220,254)">button1</span>.<span style="color:rgb(220,220,170)">attachCallback</span>([&](<span style="color:rgb(86,156,214)">bool</span> <span style="color:rgb(156,220,254)">value</span>){</div><div><span style="color:rgb(106,153,85)">    /* Print our new button value received from dashboard */</span></div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"Button Triggered: "</span><span style="color:rgb(220,220,170)">+</span><span style="color:rgb(78,201,176)">String</span>((<span style="color:rgb(156,220,254)">value</span>)?<span style="color:rgb(206,145,120)">"true"</span>:<span style="color:rgb(206,145,120)">"false"</span>));</div><div><span style="color:rgb(106,153,85)">    /* Make sure we update our button's value and send update to dashboard */</span></div><div>    <span style="color:rgb(156,220,254)">button1</span>.<span style="color:rgb(220,220,170)">update</span>(<span style="color:rgb(156,220,254)">value</span>);</div><div>    <span style="color:rgb(220,220,170)">digitalWrite</span> (<span style="color:rgb(156,220,254)">ledPinRed</span>, <span style="color:rgb(156,220,254)">value</span>);</div><br><div>    <span style="color:rgb(220,220,170)">digitalWrite</span> (<span style="color:rgb(156,220,254)">ventMain1</span>, <span style="color:rgb(181,206,168)">1</span>);</div><div>    <span style="color:rgb(220,220,170)">digitalWrite</span> (<span style="color:rgb(156,220,254)">ventOn1</span>, <span style="color:rgb(156,220,254)">value</span>);</div><br><div>    <span style="color:rgb(156,220,254)">dashboard</span>.<span style="color:rgb(220,220,170)">sendUpdates</span>();</div><div>  });</div><br><br><div><span style="color:rgb(156,220,254)">button2</span>.<span style="color:rgb(220,220,170)">attachCallback</span>([&](<span style="color:rgb(86,156,214)">bool</span> <span style="color:rgb(156,220,254)">value</span>){</div><div><span style="color:rgb(106,153,85)">    /* Print our new button value received from dashboard */</span></div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"Button Triggered: "</span><span style="color:rgb(220,220,170)">+</span><span style="color:rgb(78,201,176)">String</span>((<span style="color:rgb(156,220,254)">value</span>)?<span style="color:rgb(206,145,120)">"true"</span>:<span style="color:rgb(206,145,120)">"false"</span>));</div><div><span style="color:rgb(106,153,85)">    /* Make sure we update our button's value and send update to dashboard */</span></div><div>    <span style="color:rgb(156,220,254)">button2</span>.<span style="color:rgb(220,220,170)">update</span>(<span style="color:rgb(156,220,254)">value</span>);</div><div>    <span style="color:rgb(220,220,170)">digitalWrite</span> (<span style="color:rgb(156,220,254)">ledPinRed</span>, <span style="color:rgb(156,220,254)">value</span>);</div><div>    <span style="color:rgb(156,220,254)">dashboard</span>.<span style="color:rgb(220,220,170)">sendUpdates</span>();</div><div>  });</div><br><br><div>  <span style="color:rgb(156,220,254)">button3</span>.<span style="color:rgb(220,220,170)">attachCallback</span>([&](<span style="color:rgb(86,156,214)">bool</span> <span style="color:rgb(156,220,254)">value</span>){</div><div><span style="color:rgb(106,153,85)">    /* Print our new button value received from dashboard */</span></div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"Button Triggered: "</span><span style="color:rgb(220,220,170)">+</span><span style="color:rgb(78,201,176)">String</span>((<span style="color:rgb(156,220,254)">value</span>)?<span style="color:rgb(206,145,120)">"true"</span>:<span style="color:rgb(206,145,120)">"false"</span>));</div><div><span style="color:rgb(106,153,85)">    /* Make sure we update our button's value and send update to dashboard */</span></div><div>    <span style="color:rgb(156,220,254)">button3</span>.<span style="color:rgb(220,220,170)">update</span>(<span style="color:rgb(156,220,254)">value</span>);</div><div>    <span style="color:rgb(220,220,170)">digitalWrite</span> (<span style="color:rgb(156,220,254)">ledPinRed</span>, <span style="color:rgb(156,220,254)">value</span>);</div><div>    <span style="color:rgb(156,220,254)">dashboard</span>.<span style="color:rgb(220,220,170)">sendUpdates</span>();</div><div>  });</div><br><div>  <span style="color:rgb(156,220,254)">button4</span>.<span style="color:rgb(220,220,170)">attachCallback</span>([&](<span style="color:rgb(86,156,214)">bool</span> <span style="color:rgb(156,220,254)">value</span>){</div><div><span style="color:rgb(106,153,85)">    /* Print our new button value received from dashboard */</span></div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"Button Triggered: "</span><span style="color:rgb(220,220,170)">+</span><span style="color:rgb(78,201,176)">String</span>((<span style="color:rgb(156,220,254)">value</span>)?<span style="color:rgb(206,145,120)">"true"</span>:<span style="color:rgb(206,145,120)">"false"</span>));</div><div><span style="color:rgb(106,153,85)">    /* Make sure we update our button's value and send update to dashboard */</span></div><div>    <span style="color:rgb(156,220,254)">button4</span>.<span style="color:rgb(220,220,170)">update</span>(<span style="color:rgb(156,220,254)">value</span>);</div><div>    <span style="color:rgb(220,220,170)">digitalWrite</span> (<span style="color:rgb(156,220,254)">ledPinRed</span>, <span style="color:rgb(156,220,254)">value</span>);</div><div>    <span style="color:rgb(156,220,254)">dashboard</span>.<span style="color:rgb(220,220,170)">sendUpdates</span>();</div><div>  });</div><br><br><div><span style="color:rgb(106,153,85)">  /* Attach Slider Callback */</span></div><div>  <span style="color:rgb(156,220,254)">slider</span>.<span style="color:rgb(220,220,170)">attachCallback</span>([&](<span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">value</span>){</div><div><span style="color:rgb(106,153,85)">    /* Print our new slider value received from dashboard */</span></div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"Slider Triggered: "</span><span style="color:rgb(220,220,170)">+</span><span style="color:rgb(78,201,176)">String</span>(<span style="color:rgb(156,220,254)">value</span>));</div><div><span style="color:rgb(106,153,85)">    /* Make sure we update our slider's value and send update to dashboard */</span></div><div>    <span style="color:rgb(156,220,254)">slider</span>.<span style="color:rgb(220,220,170)">update</span>(<span style="color:rgb(156,220,254)">value</span>);</div><div>    <span style="color:rgb(220,220,170)">ledcWrite</span>(<span style="color:rgb(156,220,254)">PWMChannel</span>, <span style="color:rgb(156,220,254)">value</span>);</div><div>    <span style="color:rgb(156,220,254)">dashboard</span>.<span style="color:rgb(220,220,170)">sendUpdates</span>();</div><div>  });</div><br><div><span style="color:rgb(106,153,85)">  /* Start AsyncWebServer */</span></div><div>  <span style="color:rgb(156,220,254)">server</span>.<span style="color:rgb(220,220,170)">begin</span>();</div><br><br><div><span style="color:rgb(156,220,254)">ArduinoOTA</span>.<span style="color:rgb(220,220,170)">setHostname</span>(<span style="color:rgb(206,145,120)">"VentControl"</span>);</div><br><div>  <span style="color:rgb(156,220,254)">ArduinoOTA</span>.<span style="color:rgb(220,220,170)">onStart</span>([]()</div><div>  {</div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"Start"</span>);</div><div>  });</div><div>  <span style="color:rgb(156,220,254)">ArduinoOTA</span>.<span style="color:rgb(220,220,170)">onEnd</span>([]()</div><div>  {</div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"</span><span style="color:rgb(215,186,125)">\n</span><span style="color:rgb(206,145,120)">End"</span>);</div><div>  });</div><div>  <span style="color:rgb(156,220,254)">ArduinoOTA</span>.<span style="color:rgb(220,220,170)">onProgress</span>([](<span style="color:rgb(86,156,214)">unsigned</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">progress</span>, <span style="color:rgb(86,156,214)">unsigned</span> <span style="color:rgb(86,156,214)">int</span> <span style="color:rgb(156,220,254)">total</span>)</div><div>  {</div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">printf</span>(<span style="color:rgb(206,145,120)">"Progress: </span><span style="color:rgb(156,220,254)">%u%%</span><span style="color:rgb(215,186,125)">\r</span><span style="color:rgb(206,145,120)">"</span>, (<span style="color:rgb(156,220,254)">progress</span> / (<span style="color:rgb(156,220,254)">total</span> / <span style="color:rgb(181,206,168)">100</span>)));</div><div>  });</div><div>  <span style="color:rgb(156,220,254)">ArduinoOTA</span>.<span style="color:rgb(220,220,170)">onError</span>([](<span style="color:rgb(78,201,176)">ota_error_t</span> <span style="color:rgb(156,220,254)">error</span>)</div><div>  {</div><div>    <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">printf</span>(<span style="color:rgb(206,145,120)">"Error[</span><span style="color:rgb(156,220,254)">%u</span><span style="color:rgb(206,145,120)">]: "</span>, <span style="color:rgb(156,220,254)">error</span>);</div><div>    <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">error</span> == <span style="color:rgb(79,193,255)">OTA_AUTH_ERROR</span>) <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"Auth Failed"</span>);</div><div>    <span style="color:rgb(197,134,192)">else</span> <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">error</span> == <span style="color:rgb(79,193,255)">OTA_BEGIN_ERROR</span>) <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"Begin Failed"</span>);</div><div>    <span style="color:rgb(197,134,192)">else</span> <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">error</span> == <span style="color:rgb(79,193,255)">OTA_CONNECT_ERROR</span>) <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"Connect Failed"</span>);</div><div>    <span style="color:rgb(197,134,192)">else</span> <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">error</span> == <span style="color:rgb(79,193,255)">OTA_RECEIVE_ERROR</span>) <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"Receive Failed"</span>);</div><div>    <span style="color:rgb(197,134,192)">else</span> <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">error</span> == <span style="color:rgb(79,193,255)">OTA_END_ERROR</span>) <span style="color:rgb(156,220,254)">Serial</span>.<span style="color:rgb(220,220,170)">println</span>(<span style="color:rgb(206,145,120)">"End Failed"</span>);</div><div>  });</div><div>  <span style="color:rgb(156,220,254)">ArduinoOTA</span>.<span style="color:rgb(220,220,170)">begin</span>();</div><br><br><br><div><span style="color:rgb(106,153,85)">  //xTaskCreate(</span></div><div>  <span style="color:rgb(220,220,170)">xTaskCreatePinnedToCore</span>(</div><div>    <span style="color:rgb(220,220,170)">heartBeat</span>,<span style="color:rgb(106,153,85)">    // Function that should be called</span></div><div>    <span style="color:rgb(206,145,120)">"heartBeatPin change"</span>,<span style="color:rgb(106,153,85)">   // Name of the task (for debugging)</span></div><div>    <span style="color:rgb(181,206,168)">1000</span>,<span style="color:rgb(106,153,85)">            // Stack size (bytes)</span></div><div>    <span style="color:rgb(86,156,214)">NULL</span>,<span style="color:rgb(106,153,85)">            // Parameter to pass</span></div><div>    <span style="color:rgb(181,206,168)">1</span>,<span style="color:rgb(106,153,85)">               // Task priority</span></div><div>    <span style="color:rgb(86,156,214)">NULL</span>,<span style="color:rgb(106,153,85)">            // Task handle</span></div><div>    <span style="color:rgb(181,206,168)">1</span><span style="color:rgb(106,153,85)">            // Core 1/0</span></div><div>  );</div><br><br><div>  <span style="color:rgb(220,220,170)">xTaskCreatePinnedToCore</span>(</div><div>    <span style="color:rgb(220,220,170)">uptimeUpdate</span>,<span style="color:rgb(106,153,85)">    // Function that should be called</span></div><div>    <span style="color:rgb(206,145,120)">"uptimeUpdate"</span>,<span style="color:rgb(106,153,85)">   // Name of the task (for debugging)</span></div><div>    <span style="color:rgb(181,206,168)">1000</span>,<span style="color:rgb(106,153,85)">            // Stack size (bytes)</span></div><div>    <span style="color:rgb(86,156,214)">NULL</span>,<span style="color:rgb(106,153,85)">            // Parameter to pass</span></div><div>    <span style="color:rgb(181,206,168)">1</span>,<span style="color:rgb(106,153,85)">               // Task priority</span></div><div>    <span style="color:rgb(86,156,214)">NULL</span>,<span style="color:rgb(106,153,85)">            // Task handle</span></div><div>    <span style="color:rgb(181,206,168)">1</span><span style="color:rgb(106,153,85)">            // Core 1/0</span></div><div>  );</div><br><div>  <span style="color:rgb(220,220,170)">xTaskCreatePinnedToCore</span>(</div><div>    <span style="color:rgb(220,220,170)">I2CRead</span>,<span style="color:rgb(106,153,85)">    // Function that should be called</span></div><div>    <span style="color:rgb(206,145,120)">"I2CRead"</span>,<span style="color:rgb(106,153,85)">   // Name of the task (for debugging)</span></div><div>    <span style="color:rgb(181,206,168)">1000</span>,<span style="color:rgb(106,153,85)">            // Stack size (bytes)</span></div><div>    <span style="color:rgb(86,156,214)">NULL</span>,<span style="color:rgb(106,153,85)">            // Parameter to pass</span></div><div>    <span style="color:rgb(181,206,168)">1</span>,<span style="color:rgb(106,153,85)">               // Task priority</span></div><div>    <span style="color:rgb(86,156,214)">NULL</span>,<span style="color:rgb(106,153,85)">            // Task handle</span></div><div>    <span style="color:rgb(181,206,168)">0</span><span style="color:rgb(106,153,85)">            // Core 1/0</span></div><div>  );</div><br><div>  <span style="color:rgb(220,220,170)">xTaskCreatePinnedToCore</span>(</div><div>    <span style="color:rgb(220,220,170)">cardUpdate</span>,<span style="color:rgb(106,153,85)">    // Function that should be called</span></div><div>    <span style="color:rgb(206,145,120)">"cardUpdate"</span>,<span style="color:rgb(106,153,85)">   // Name of the task (for debugging)</span></div><div>    <span style="color:rgb(181,206,168)">1000</span>,<span style="color:rgb(106,153,85)">            // Stack size (bytes)</span></div><div>    <span style="color:rgb(86,156,214)">NULL</span>,<span style="color:rgb(106,153,85)">            // Parameter to pass</span></div><div>    <span style="color:rgb(181,206,168)">1</span>,<span style="color:rgb(106,153,85)">               // Task priority</span></div><div>    <span style="color:rgb(86,156,214)">NULL</span>,<span style="color:rgb(106,153,85)">            // Task handle</span></div><div>    <span style="color:rgb(181,206,168)">0</span><span style="color:rgb(106,153,85)">            // Core 1/0</span></div><div>  );</div><br><div>  </div><br><br><div>  </div><br><br><br><br><div>}<span style="color:rgb(106,153,85)">//setup</span></div><br><br><br><br><br><br><div><span style="color:rgb(86,156,214)">void</span> <span style="color:rgb(220,220,170)">loop</span>() {</div><div><span style="color:rgb(106,153,85)">  /* Nothing so far */</span></div><div> <span style="color:rgb(156,220,254)">ArduinoOTA</span>.<span style="color:rgb(220,220,170)">handle</span>();</div><br><br><div> </div><br><div><span style="color:rgb(106,153,85)">  // here is where you'd put code that needs to be running all the time.</span></div><br><div><span style="color:rgb(106,153,85)">  // check to see if it's time to blink the LED; that is, if the difference</span></div><div><span style="color:rgb(106,153,85)">  // between the current time and last time you blinked the LED is bigger than</span></div><div><span style="color:rgb(106,153,85)">  // the interval at which you want to blink the LED.</span></div><div>  </div><br><br><div><span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">WiFi</span>.<span style="color:rgb(220,220,170)">softAPgetStationNum</span>()) {<span style="color:rgb(106,153,85)">                     // AP client connected, mostly on</span></div><div>  <span style="color:rgb(156,220,254)">blinkOnTime</span> = <span style="color:rgb(181,206,168)">275</span>;       </div><div>  <span style="color:rgb(156,220,254)">blinkRepeatTime</span> = <span style="color:rgb(181,206,168)">300</span>;</div><div>} <span style="color:rgb(197,134,192)">else</span> <span style="color:rgb(197,134,192)">if</span> (<span style="color:rgb(156,220,254)">WiFi</span>.<span style="color:rgb(220,220,170)">status</span>() == <span style="color:rgb(79,193,255)">WL_CONNECTED</span>) {<span style="color:rgb(106,153,85)">           // Connected as STA (or AP), flash 1/sec</span></div><div>  <span style="color:rgb(156,220,254)">wlanConnected</span> = <span style="color:rgb(86,156,214)">true</span>;</div><div>  <span style="color:rgb(156,220,254)">blinkOnTime</span> = <span style="color:rgb(181,206,168)">200</span>;</div><div>  <span style="color:rgb(156,220,254)">blinkRepeatTime</span> = <span style="color:rgb(181,206,168)">1000</span>;</div><div>} <span style="color:rgb(197,134,192)">else</span> {<span style="color:rgb(106,153,85)">                                              // no connections, every 10 sec</span></div><div>  <span style="color:rgb(156,220,254)">blinkOnTime</span> = <span style="color:rgb(181,206,168)">25</span>;</div><div>  <span style="color:rgb(156,220,254)">blinkRepeatTime</span> = <span style="color:rgb(181,206,168)">10000</span>;  </div><div>}</div><br><div><span style="color:rgb(197,134,192)">if</span> (((<span style="color:rgb(220,220,170)">millis</span>() - <span style="color:rgb(156,220,254)">previousMillisLED</span>) > <span style="color:rgb(156,220,254)">blinkRepeatTime</span>) && <span style="color:rgb(156,220,254)">wlanLedState</span>) {</div><div>  <span style="color:rgb(156,220,254)">previousMillisLED</span> = <span style="color:rgb(220,220,170)">millis</span>();</div><div>  <span style="color:rgb(156,220,254)">wlanLedState</span> = <span style="color:rgb(86,156,214)">false</span>;</div><div>  <span style="color:rgb(220,220,170)">digitalWrite</span>(<span style="color:rgb(156,220,254)">ledPinBlue</span>, <span style="color:rgb(156,220,254)">wlanLedState</span>);</div><div>} <span style="color:rgb(197,134,192)">else</span> <span style="color:rgb(197,134,192)">if</span> (((<span style="color:rgb(220,220,170)">millis</span>() - <span style="color:rgb(156,220,254)">previousMillisLED</span>) > <span style="color:rgb(156,220,254)">blinkOnTime</span>) && !<span style="color:rgb(156,220,254)">wlanLedState</span>) {</div><div>  <span style="color:rgb(156,220,254)">wlanLedState</span> = <span style="color:rgb(86,156,214)">true</span>;</div><div>  <span style="color:rgb(220,220,170)">digitalWrite</span>(<span style="color:rgb(156,220,254)">ledPinBlue</span>, <span style="color:rgb(156,220,254)">wlanLedState</span>);</div><div>}</div><br><br><br><br><br><div><span style="color:rgb(106,153,85)">//</span></div><br><br><div>  </div><div>  </div><div><span style="color:rgb(106,153,85)">  //delay(5000);          </span></div><br><br><br><br><div>  </div><br><br><div>  }</div><br><br><br><br><div>  </div><br><br><br><br><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">st 2. 6. 2021 v 11:58 odesílatel Tomáš Hamouz <<a href="mailto:konfery.tomas.hamouz@seznam.cz">konfery.tomas.hamouz@seznam.cz</a>> napsal:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


<div>
<span style="font-family:"Courier New";font-size:10pt">Zajímalo, od toho to přece je konference ;-)<br>
<br>
Tomáš<br>
<br>
<br>
</span><table>
<tbody><tr>
<td width="2" bgcolor="#0000ff"><br>
</td>
<td><span style="font-family:"courier new";font-size:10pt">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.<br>
P.B.<br>
Dne 02. 06. 21 v 10:51 Jan Půhoný napsal(a):<br>
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í. <br>
<br>
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ě?<br>
<br>
<span style="font-family:consolas;font-size:11pt;color:rgb(212,212,212)">  <span style="color:rgb(197,134,192)">if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">waitForConnectResult<span style="color:rgb(212,212,212)">() != <span style="color:rgb(79,193,255)">WL_CONNECTED<span style="color:rgb(212,212,212)">) {   <br>

<br>
<span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">mode<span style="color:rgb(212,212,212)">(<span style="color:rgb(86,156,214)">WIFI_STA<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">begin<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">ssid<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">password<span style="color:rgb(212,212,212)">);<br>

<br>
  }<br>
<br>
<span style="font-family:"courier new";font-size:10pt;color:rgb(0,0,0)">Díky,<br>
<br>
HP<br>
<br>
po 31. 5. 2021 v 12:06 odesílatel Pavel Brychta <</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><a style="font-family:"courier new";font-size:10pt" href="mailto:pavel.brychta@duhasys.eu" target="_blank">pavel.brychta@duhasys.eu</a><span style="font-family:"courier new";font-size:10pt">> napsal:<br>
DD,<br>
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 </span><a style="font-family:"courier new";font-size:10pt" href="https://savjee.be/2020/01/multitasking-esp32-arduino-freertos/" target="_blank">https://savjee.be/2020/01/multitasking-esp32-arduino-freertos/</a><span style="font-family:"courier new";font-size:10pt"> 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 </span><a style="font-family:"courier new";font-size:10pt" href="https://github.com/Pablo2048/Interval" target="_blank">https://github.com/Pablo2048/Interval</a><span style="font-family:"courier new";font-size:10pt"> (teď koukám, že by zasloužila aktualizovat - tak zkuste třeba aktuálnější verzi z </span><a style="font-family:"courier new";font-size:10pt" href="https://git.xpablo.cz/pablo2048/Interval" target="_blank">https://git.xpablo.cz/pablo2048/Interval</a><span style="font-family:"courier new";font-size:10pt"> ). 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ý...)<br>
P.B.<br>
Dne 31. 05. 21 v 11:17 Jan Půhoný napsal(a):<br>
Díky, <br>
<br>
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? <br>
<br>
void vATaskFunction( void *pvParameters )<br>
    {<br>
        for( ;; )<br>
        {<br>
            -- Task application code here. --<br>
        }<br>
<br>
        /* Tasks must not attempt to return from their implementing<br>
        function or otherwise exit.  In newer FreeRTOS port<br>
        attempting to do so will result in an configASSERT() being<br>
        called if it is defined.  If it is necessary for a task to<br>
        exit then have the task call vTaskDelete( NULL ) to ensure<br>
        its exit is clean. */<br>
        vTaskDelete( NULL );<br>
    } <br>
<br>
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: <br>
<br>
<span style="font-family:consolas;font-size:11pt;color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><Arduino.h><br>
<span style="color:rgb(106,153,85)">  /* ESP32 Dependencies */<br>
<span style="color:rgb(86,156,214)">  <span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><WiFi.h><br>
<span style="color:rgb(86,156,214)">  <span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><AsyncTCP.h><br>
<span style="color:rgb(86,156,214)">  <span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><ESPAsyncWebServer.h><br>
<span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><ESPDash.h><br>
<span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><WiFiUdp.h><br>
<span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><ArduinoOTA.h><br>
<span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)">"uptime.h"<br>
<span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)">"uptime_formatter.h"<br>
<span style="color:rgb(106,153,85)">/* Your WiFi Credentials */<br>
<span style="color:rgb(86,156,214)">const char<span style="color:rgb(212,212,212)">* <span style="color:rgb(156,220,254)">ssid<span style="color:rgb(212,212,212)"> = <span style="color:rgb(206,145,120)">"puhy_iot"<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)"> // SSID<br>
<span style="color:rgb(86,156,214)">const char<span style="color:rgb(212,212,212)">* <span style="color:rgb(156,220,254)">password<span style="color:rgb(212,212,212)"> = <span style="color:rgb(206,145,120)">"iot44puhy"<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)"> // Password<br>
<span style="color:rgb(86,156,214)">const char<span style="color:rgb(212,212,212)">* <span style="color:rgb(156,220,254)">OTAhostname<span style="color:rgb(212,212,212)"> = <span style="color:rgb(206,145,120)">"ESP-puhy"<span style="color:rgb(212,212,212)">;<br>
<span style="color:rgb(106,153,85)">/* Start Webserver */<br>
<span style="color:rgb(78,201,176)">AsyncWebServer <span style="color:rgb(156,220,254)">server<span style="color:rgb(212,212,212)">(<span style="color:rgb(181,206,168)">80<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(106,153,85)">/* Attach ESP-DASH to AsyncWebServer */<br>
<span style="color:rgb(78,201,176)">ESPDash <span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">server<span style="color:rgb(212,212,212)">); <br>
<span style="color:rgb(106,153,85)">/* <br>
  Button Card<br>
  Format - (Dashboard Instance, Card Type, Card Name)<br>
*/<br>
<span style="color:rgb(78,201,176)">Card <span style="color:rgb(156,220,254)">button<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">, <span style="color:rgb(78,201,176)">BUTTON_CARD<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"Zalévej"<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(78,201,176)">Card <span style="color:rgb(156,220,254)">button1<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">, <span style="color:rgb(78,201,176)">BUTTON_CARD<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"Čisti"<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(78,201,176)">Card <span style="color:rgb(156,220,254)">button2<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">, <span style="color:rgb(78,201,176)">BUTTON_CARD<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"Zatop"<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(78,201,176)">Card <span style="color:rgb(156,220,254)">uptimeCard<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">, <span style="color:rgb(78,201,176)">STATUS_CARD<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"Uptime"<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"success"<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(106,153,85)">/* <br>
  Slider Card<br>
  Format - (Dashboard Instance, Card Type, Card Name, Card Symbol(optional), int min, int max)<br>
*/<br>
<span style="color:rgb(78,201,176)">Card <span style="color:rgb(156,220,254)">slider<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">, <span style="color:rgb(78,201,176)">SLIDER_CARD<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"Test Slider"<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">""<span style="color:rgb(212,212,212)">, <span style="color:rgb(181,206,168)">0<span style="color:rgb(212,212,212)">, <span style="color:rgb(181,206,168)">255<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">ledHeartBeatPin<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">2<span style="color:rgb(212,212,212)">;<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">ledPin<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">5<span style="color:rgb(212,212,212)">;<br>
<span style="color:rgb(106,153,85)">// setting PWM properties<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">ledPinPWM<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">13<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)">  /* GPIO13 */<br>
//int dutyCycle;<br>
/* Setting PWM Properties */<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">PWMFreq<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">5000<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)"> /* 5 KHz */<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">PWMChannel<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">0<span style="color:rgb(212,212,212)">;<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">PWMResolution<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">8<span style="color:rgb(212,212,212)">;<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">MAX_DUTY_CYCLE<span style="color:rgb(212,212,212)"> = (<span style="color:rgb(86,156,214)">int<span style="color:rgb(212,212,212)">)(<span style="color:rgb(220,220,170)">pow<span style="color:rgb(212,212,212)">(<span style="color:rgb(181,206,168)">2<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">PWMResolution<span style="color:rgb(212,212,212)">) - <span style="color:rgb(181,206,168)">1<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(106,153,85)">// Variables will change:<br>
<span style="color:rgb(86,156,214)">int <span style="color:rgb(156,220,254)">ledState<span style="color:rgb(212,212,212)"> = <span style="color:rgb(86,156,214)">LOW<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)">             // ledState used to set the LED<br>
// Generally, you should use "unsigned long" for variables that hold time<br>
// The value will quickly become too large for an int to store<br>
<span style="color:rgb(86,156,214)">unsigned long <span style="color:rgb(156,220,254)">previousMillis<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">0<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)">        // will store last time LED was updated<br>
// constants won't change:<br>
<span style="color:rgb(86,156,214)">long <span style="color:rgb(156,220,254)">heartBeatInterval<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">1000<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)">           // interval at which to blink (milliseconds)<br>
<span style="color:rgb(86,156,214)">void <span style="color:rgb(220,220,170)">setup<span style="color:rgb(212,212,212)">() {<br>
<span style="color:rgb(220,220,170)">pinMode<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">ledPin<span style="color:rgb(212,212,212)">, <span style="color:rgb(86,156,214)">OUTPUT<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(220,220,170)">pinMode<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">ledHeartBeatPin<span style="color:rgb(212,212,212)">, <span style="color:rgb(86,156,214)">OUTPUT<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(220,220,170)">pinMode<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">ledPinPWM<span style="color:rgb(212,212,212)">, <span style="color:rgb(86,156,214)">OUTPUT<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(220,220,170)">ledcSetup<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">PWMChannel<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">PWMFreq<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">PWMResolution<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(106,153,85)">  /* Attach the LED PWM Channel to the GPIO Pin */<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(220,220,170)">ledcAttachPin<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">ledPinPWM<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">PWMChannel<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">begin<span style="color:rgb(212,212,212)">(<span style="color:rgb(181,206,168)">115200<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(106,153,85)">  /* Connect WiFi */<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">mode<span style="color:rgb(212,212,212)">(<span style="color:rgb(86,156,214)">WIFI_STA<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">begin<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">ssid<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">password<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(197,134,192)">if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">waitForConnectResult<span style="color:rgb(212,212,212)">() != <span style="color:rgb(79,193,255)">WL_CONNECTED<span style="color:rgb(212,212,212)">) {<br>
      <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">printf<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"WiFi Failed!<span style="color:rgb(215,186,125)">\n<span style="color:rgb(206,145,120)">"<span style="color:rgb(212,212,212)">);<br>
      <span style="color:rgb(197,134,192)">return<span style="color:rgb(212,212,212)">;<br>
  }<br>
  <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">print<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"IP Address: "<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">localIP<span style="color:rgb(212,212,212)">());<br>
<span style="color:rgb(106,153,85)">  /* Attach Button Callback */<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(156,220,254)">button<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">attachCallback<span style="color:rgb(212,212,212)">([&](<span style="color:rgb(86,156,214)">bool <span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">){<br>
<span style="color:rgb(106,153,85)">    /* Print our new button value received from dashboard */<br>
<span style="color:rgb(212,212,212)">    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Button Triggered: "<span style="color:rgb(220,220,170)">+<span style="color:rgb(78,201,176)">String<span style="color:rgb(212,212,212)">((<span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">)?<span style="color:rgb(206,145,120)">"true"<span style="color:rgb(212,212,212)">:<span style="color:rgb(206,145,120)">"false"<span style="color:rgb(212,212,212)">));<br>
<span style="color:rgb(106,153,85)">    /* Make sure we update our button's value and send update to dashboard */<br>
<span style="color:rgb(212,212,212)">    <span style="color:rgb(156,220,254)">button<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">update<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(220,220,170)">digitalWrite<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">ledPin<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">sendUpdates<span style="color:rgb(212,212,212)">();<br>
  });<br>
<span style="color:rgb(106,153,85)">  /* Attach Slider Callback */<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(156,220,254)">slider<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">attachCallback<span style="color:rgb(212,212,212)">([&](<span style="color:rgb(86,156,214)">int <span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">){<br>
<span style="color:rgb(106,153,85)">    /* Print our new slider value received from dashboard */<br>
<span style="color:rgb(212,212,212)">    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Slider Triggered: "<span style="color:rgb(220,220,170)">+<span style="color:rgb(78,201,176)">String<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">));<br>
<span style="color:rgb(106,153,85)">    /* Make sure we update our slider's value and send update to dashboard */<br>
<span style="color:rgb(212,212,212)">    <span style="color:rgb(156,220,254)">slider<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">update<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(220,220,170)">ledcWrite<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">PWMChannel<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">sendUpdates<span style="color:rgb(212,212,212)">();<br>
  });<br>
<span style="color:rgb(106,153,85)">  /* Start AsyncWebServer */<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(156,220,254)">server<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">begin<span style="color:rgb(212,212,212)">();<br>
<span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">setHostname<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">OTAhostname<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">onStart<span style="color:rgb(212,212,212)">([]()<br>
  {<br>
    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Start"<span style="color:rgb(212,212,212)">);<br>
  });<br>
  <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">onEnd<span style="color:rgb(212,212,212)">([]()<br>
  {<br>
    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"<span style="color:rgb(215,186,125)">\n<span style="color:rgb(206,145,120)">End"<span style="color:rgb(212,212,212)">);<br>
  });<br>
  <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">onProgress<span style="color:rgb(212,212,212)">([](<span style="color:rgb(86,156,214)">unsigned int <span style="color:rgb(156,220,254)">progress<span style="color:rgb(212,212,212)">, <span style="color:rgb(86,156,214)">unsigned int <span style="color:rgb(156,220,254)">total<span style="color:rgb(212,212,212)">)<br>
  {<br>
    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">printf<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Progress: %u%%<span style="color:rgb(215,186,125)">\r<span style="color:rgb(206,145,120)">"<span style="color:rgb(212,212,212)">, (<span style="color:rgb(156,220,254)">progress<span style="color:rgb(212,212,212)"> / (<span style="color:rgb(156,220,254)">total<span style="color:rgb(212,212,212)"> / <span style="color:rgb(181,206,168)">100<span style="color:rgb(212,212,212)">)));<br>
  });<br>
  <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">onError<span style="color:rgb(212,212,212)">([](<span style="color:rgb(78,201,176)">ota_error_t <span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)">)<br>
  {<br>
    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">printf<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Error[%u]: "<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(197,134,192)">if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)"> == <span style="color:rgb(79,193,255)">OTA_AUTH_ERROR<span style="color:rgb(212,212,212)">) <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Auth Failed"<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(197,134,192)">else if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)"> == <span style="color:rgb(79,193,255)">OTA_BEGIN_ERROR<span style="color:rgb(212,212,212)">) <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Begin Failed"<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(197,134,192)">else if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)"> == <span style="color:rgb(79,193,255)">OTA_CONNECT_ERROR<span style="color:rgb(212,212,212)">) <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Connect Failed"<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(197,134,192)">else if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)"> == <span style="color:rgb(79,193,255)">OTA_RECEIVE_ERROR<span style="color:rgb(212,212,212)">) <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Receive Failed"<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(197,134,192)">else if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)"> == <span style="color:rgb(79,193,255)">OTA_END_ERROR<span style="color:rgb(212,212,212)">) <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"End Failed"<span style="color:rgb(212,212,212)">);<br>
  });<br>
  <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">begin<span style="color:rgb(212,212,212)">();<br>
}<br>
<span style="color:rgb(86,156,214)">void <span style="color:rgb(220,220,170)">loop<span style="color:rgb(212,212,212)">() {<br>
<span style="color:rgb(106,153,85)">  /* Nothing so far */<br>
 <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">handle<span style="color:rgb(212,212,212)">();<br>
<span style="color:rgb(106,153,85)">  // here is where you'd put code that needs to be running all the time.<br>
  // check to see if it's time to blink the LED; that is, if the difference<br>
  // between the current time and last time you blinked the LED is bigger than<br>
  // the interval at which you want to blink the LED.<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(86,156,214)">unsigned long <span style="color:rgb(156,220,254)">currentMillis<span style="color:rgb(212,212,212)"> = <span style="color:rgb(220,220,170)">millis<span style="color:rgb(212,212,212)">();<br>
  <span style="color:rgb(197,134,192)">if<span style="color:rgb(212,212,212)"> (</span><span style="color:rgb(156,220,254)">currentMillis</span><span style="color:rgb(212,212,212)"> - </span><span style="color:rgb(156,220,254)">previousMillis</span><span style="color:rgb(212,212,212)"> >= </span><span style="color:rgb(156,220,254)">heartBeatInterval</span><span style="color:rgb(212,212,212)">) {
</span><br><span style="color:rgb(106,153,85)">    // save the last time you blinked the LED
</span><br><span style="color:rgb(212,212,212)">    </span><span style="color:rgb(156,220,254)">previousMillis</span><span style="color:rgb(212,212,212)"> = </span><span style="color:rgb(156,220,254)">currentMillis</span><span style="color:rgb(212,212,212)">;
</span><br><span style="color:rgb(106,153,85)">    // if the LED is off turn it on and vice-versa:
</span><br><span style="color:rgb(212,212,212)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(212,212,212)"> (</span><span style="color:rgb(156,220,254)">ledState</span><span style="color:rgb(212,212,212)"> == </span><span style="color:rgb(86,156,214)">LOW</span><span style="color:rgb(212,212,212)">) {
      </span><br><span style="color:rgb(156,220,254)">ledState</span><span style="color:rgb(212,212,212)"> = </span><span style="color:rgb(86,156,214)">HIGH</span><span style="color:rgb(212,212,212)">;
      </span><br><span style="color:rgb(156,220,254)">heartBeatInterval</span><span style="color:rgb(212,212,212)"> = </span><span style="color:rgb(181,206,168)">2500</span><span style="color:rgb(212,212,212)">;
    } </span><br><span style="color:rgb(197,134,192)">else</span><span style="color:rgb(212,212,212)"> {
      </span><br><span style="color:rgb(156,220,254)">heartBeatInterval</span><span style="color:rgb(212,212,212)"> = </span><span style="color:rgb(181,206,168)">20</span><span style="color:rgb(212,212,212)">;
      </span><br><span style="color:rgb(156,220,254)">ledState</span><span style="color:rgb(212,212,212)"> = </span><span style="color:rgb(86,156,214)">LOW</span><span style="color:rgb(212,212,212)">;
    }
</span><br><br><span style="color:rgb(106,153,85)">    // set the LED with the ledState of the variable:
</span><br><span style="color:rgb(212,212,212)">    </span><span style="color:rgb(220,220,170)">digitalWrite</span><span style="color:rgb(212,212,212)">(</span><span style="color:rgb(156,220,254)">ledHeartBeatPin</span><span style="color:rgb(212,212,212)">, </span><span style="color:rgb(156,220,254)">ledState</span><span style="color:rgb(212,212,212)">);
</span><br><span style="color:rgb(156,220,254)">Serial</span><span style="color:rgb(212,212,212)">.</span><span style="color:rgb(220,220,170)">println</span><span style="color:rgb(212,212,212)">(</span><span style="color:rgb(78,201,176)">uptime_formatter</span><span style="color:rgb(212,212,212)">::</span><span style="color:rgb(220,220,170)">getUptime</span><span style="color:rgb(212,212,212)">());
</span><br><span style="color:rgb(156,220,254)">uptimeCard</span><span style="color:rgb(212,212,212)">.</span><span style="color:rgb(220,220,170)">update</span><span style="color:rgb(212,212,212)">(</span><span style="color:rgb(78,201,176)">uptime_formatter</span><span style="color:rgb(212,212,212)">::</span><span style="color:rgb(220,220,170)">getUptime</span><span style="color:rgb(212,212,212)">());
  }


</span><br><br><br><br><span style="font-family:"courier new";font-size:10pt;color:rgb(0,0,0)">Díky za podporu.

HP


pá 28. 5. 2021 v 6:10 odesílatel Pavel Brychta <</span><br><br><br><br><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><a style="font-family:"courier new";font-size:10pt" href="mailto:pavel.brychta@duhasys.eu" target="_blank">pavel.brychta@duhasys.eu</a><span style="font-family:"courier new";font-size:10pt">> napsal:<br>
DD,<br>
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 </span><a style="font-family:"courier new";font-size:10pt" href="https://s.click.aliexpress.com/e/_9j8PIP" target="_blank">https://s.click.aliexpress.com/e/_9j8PIP</a><span style="font-family:"courier new";font-size:10pt"> ).<br>
P.B.<br>
Dne 27. 05. 21 v 23:22 Jan Půhoný napsal(a):<br>
Dobrý večer,<br>
<br>
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.<br>
<br>
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.<br>
<br>
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.<br>
<br>
<img width="277" height="43" alt="" style="padding: 1px;" src="cid:17af960d7afcb971f161"><br>
<br>
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. <br>
<br>
Píše se ten OTA handler opravdu do loop?<br>
<br>
#include <Arduino.h><br>
#if defined(ESP8266)<br>
  /* ESP8266 Dependencies */<br>
  #include <ESP8266WiFi.h><br>
  #include <ESPAsyncTCP.h><br>
  #include <ESPAsyncWebServer.h><br>
#elif defined(ESP32)<br>
  /* ESP32 Dependencies */<br>
  #include <WiFi.h><br>
  #include <AsyncTCP.h><br>
  #include <ESPAsyncWebServer.h><br>
#endif<br>
#include <ESPDash.h><br>
<br>
<br>
#include <WiFiUdp.h><br>
<b>#include <ArduinoOTA.h><br>
<br>
</b>/* Your WiFi Credentials */<br>
const char* ssid = "******"; // SSID<br>
const char* password = "******"; // Password<br>
<br>
const char* OTAhostname = "ESP-puhy";<br>
<br>
/* Start Webserver */<br>
AsyncWebServer server(80);<br>
<br>
/* Attach ESP-DASH to AsyncWebServer */<br>
ESPDash dashboard(&server); <br>
<br>
/* <br>
  Button Card<br>
  Format - (Dashboard Instance, Card Type, Card Name)<br>
*/<br>
Card button(&dashboard, BUTTON_CARD, "Test Button");<br>
<br>
/* <br>
  Slider Card<br>
  Format - (Dashboard Instance, Card Type, Card Name, Card Symbol(optional), int min, int max)<br>
*/<br>
Card slider(&dashboard, SLIDER_CARD, "Test Slider", "", 0, 255);<br>
<br>
<br>
void setup() {<br>
  Serial.begin(115200);<br>
<br>
  /* Connect WiFi */<br>
  WiFi.mode(WIFI_STA);<br>
  WiFi.begin(ssid, password);<br>
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {<br>
      Serial.printf("WiFi Failed!\n");<br>
      return;<br>
  }<br>
  Serial.print("IP Address: ");<br>
  Serial.println(WiFi.localIP());<br>
<br>
  /* Attach Button Callback */<br>
  button.attachCallback([&](bool value){<br>
    /* Print our new button value received from dashboard */<br>
    Serial.println("Button Triggered: "+String((value)?"true":"false"));<br>
    /* Make sure we update our button's value and send update to dashboard */<br>
    button.update(value);<br>
    dashboard.sendUpdates();<br>
  });<br>
<br>
  /* Attach Slider Callback */<br>
  slider.attachCallback([&](int value){<br>
    /* Print our new slider value received from dashboard */<br>
    Serial.println("Slider Triggered: "+String(value));<br>
    /* Make sure we update our slider's value and send update to dashboard */<br>
    slider.update(value);<br>
    dashboard.sendUpdates();<br>
  });<br>
<br>
  /* Start AsyncWebServer */<br>
  server.begin();<br>
<br>
ArduinoOTA.setHostname(OTAhostname);<br>
  ArduinoOTA.onStart([]()<br>
  {<br>
    Serial.println("Start");<br>
  });<br>
  ArduinoOTA.onEnd([]()<br>
  {<br>
    Serial.println("\nEnd");<br>
  });<br>
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)<br>
  {<br>
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));<br>
  });<br>
  ArduinoOTA.onError([](ota_error_t error)<br>
  {<br>
    Serial.printf("Error[%u]: ", error);<br>
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");<br>
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");<br>
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");<br>
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");<br>
    else if (error == OTA_END_ERROR) Serial.println("End Failed");<br>
  });<br>
  ArduinoOTA.begin();<br>
}<br>
<br>
void loop() {<br>
  /* Nothing so far */<br>
<b> ArduinoOTA.handle();<br>
<br>
</b> delay(5000);<br>
<br>
}<br>
<br>
Díky,<br>
<br>
HP<br>
<br>
<br>
st 26. 5. 2021 v 13:45 odesílatel Pavel Brychta <</span><a style="font-family:"courier new";font-size:10pt" href="mailto:pavel.brychta@duhasys.eu" target="_blank">pavel.brychta@duhasys.eu</a><span style="font-family:"courier new";font-size:10pt">> napsal:<br>
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.<br>
P.B.<br>
Dne 26. 05. 21 v 13:30 Jan Půhoný napsal(a):<br>
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.  <br>
<br>
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í :-) <br>
<br>
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.<br>
<br>
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.<br>
<br>
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?<br>
<br>
A další věc, je potřeba k ESP32 dávat externí WDT?<br>
<br>
HP<br>
<br>
st 26. 5. 2021 v 11:47 odesílatel Pavel Brychta <</span><a style="font-family:"courier new";font-size:10pt" href="mailto:pavel.brychta@duhasys.eu" target="_blank">pavel.brychta@duhasys.eu</a><span style="font-family:"courier new";font-size:10pt">> napsal:<br>
Tak zrovna to je exemplární případ, jak to určitě nedělat. Zde <br>
</span><a style="font-family:"courier new";font-size:10pt" href="https://github.com/Alextros00/ESP32-MQTT-Relay-Control/blob/main/main/app_main.c" target="_blank">https://github.com/Alextros00/ESP32-MQTT-Relay-Control/blob/main/main/app_main.c</a> <br>
<span style="font-family:"courier new";font-size:10pt">není jediná zmínka, nebo náznak řešení nějakého failsafe mechanizmu. <br>
Celé to je na úrovni primitivního Arduino example, který se s detaily <br>
jako je třeba jméno topcu vůbec nezalamuje. MQTT failsafe samo o sobě <br>
nevyřeší ani omylem.<br>
<br>
P.B.<br>
<br>
Dne 26. 05. 21 v 11:28 T. Meinlschmidt napsal(a):<br>
> proto pisu mqtt. esp32 tu podporu mqtt ma pomerne slusnou. viz treba <br>
> takovy easy priklad<br>
><br>
> </span><a style="font-family:"courier new";font-size:10pt" href="https://github.com/Alextros00/Home-Automation-NodeRED-ESP-Telegram" target="_blank">https://github.com/Alextros00/Home-Automation-NodeRED-ESP-Telegram</a><br>
<span style="font-family:"courier new";font-size:10pt">><br>
> tm<br>
><br>
> Dne 2021-05-26 10:54, Pavel Brychta napsal:<br>
>> ... až na to, že když pak lehne to Pi, nebo WiFi, tak zůstane třeba<br>
>> čerpadlo běžet stále, nebo uvaříte rybičky. Přiznám se, že takovouto<br>
>> cestou bych nikdy nešel, protože to znamená mít failsafe procesy v ESP<br>
>> a řídící logiku jinde, což pro účely automatizace považuji za hodně<br>
>> nešťastné řešení. Když už, tak autonomní pocesy na zařízení a API pro<br>
>> parametrizaci do toho rPi...<br>
>><br>
>> P.B.<br>
>><br>
>> Dne 26. 05. 21 v 10:49 T. Meinlschmidt napsal(a):<br>
>>> dobre dopoledne.<br>
>>><br>
>>> ja se priznam, ze bych vubec nesel touhle cestou, ale mel ESP ciste <br>
>>> na hw veci a sber nejakych dat,<br>
>>> a celou tu logiku nechal v node-red + mqtt (treba na rpi). Casem na <br>
>>> to muzete navazat mobil, UI si udelate podle sebe pomerne jednoduse, <br>
>>> navic to umi spoustu veci z jinych zdroju.<br>
>>><br>
>>> tm<br>
>>><br>
>>> Dne 2021-05-26 10:32, Jan Půhoný napsal:<br>
>>>> Dobré dopoledne,<br>
>>>><br>
>>>> Ještě bych potřeboval poradit co použít za systém na ESP32.<br>
>>>> Jedná se mi o to, že do ESP32 přepisuji z Atmegy 2560 něco jako<br>
>>>> řízení topení a různých zdrojů tepla a různých hejblátek<br>
>>>> doma. Do teď to běží na ATMEGA 2560 a mám tam jednoduchý<br>
>>>> "multitasking" pomocí millis. Jedná se v podstatě jen o čtení<br>
>>>> teplotních čidel, webserver a pak různé výstupy v podobě SSR<br>
>>>> relé + vstupy a logika mezi tím. Nic složitého. Na druhou stranu<br>
>>>> za ty roky to celkem naboptnalo co se kódu týče a ten webserver na<br>
>>>> té AT2560 je takový dost líný. Navíc tam potřebuji číst http<br>
>>>> requesty data z komerční meteostanice a na to už to moc není.<br>
>>>><br>
>>>> Neexistuje nějaký opensource projekt na ESP32, kde by byly<br>
>>>> vyřešeny základní věci jako webserver + nějaká grafika a<br>
>>>> hejblátka abych to nemusel psát úplně od začátku. Líbilo by se<br>
>>>> mi už https a základní struktura a dopsal bych si do toho jen tu<br>
>>>> vlastní logiku a ovládání vstupů a výstupů.<br>
>>>><br>
>>>> Je dobrý nápad na to ESP dávat FreeRTOS, nebo to už je překonané<br>
>>>> a používáte něco lepšího? Případně víte o nějakém open<br>
>>>> source projektu pro domácí automatizaci pro ESP32?<br>
>>>><br>
>>>> Ano, googlil jsem, ale serp je zaplaven videi geeků kteří připojí<br>
>>>> k pár relátkům esp a myslí si co nevymysleli a trochu se v tom<br>
>>>> ztrácím. Já bych potřeboval něco trochu robusnějšího.<br>
>>>><br>
>>>> Díky za nápady.<br>
>>>><br>
>>>> HP<br>
>>>> _______________________________________________<br>
>>>> HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>>>> </span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>>>> </span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<span style="font-family:"courier new";font-size:10pt">>>> _______________________________________________<br>
>>> HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>>> </span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>>> </span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<span style="font-family:"courier new";font-size:10pt">>> _______________________________________________<br>
>> HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>> </span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>> </span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<span style="font-family:"courier new";font-size:10pt">> _______________________________________________<br>
> HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">> </span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">> </span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<span style="font-family:"courier new";font-size:10pt">_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br>
<span style="font-family:"courier new";font-size:10pt">_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><span style="font-family:"courier new";font-size:10pt">
<br>
_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br>
<span style="font-family:"courier new";font-size:10pt">_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><span style="font-family:"courier new";font-size:10pt">
<br>
_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br>
<span style="font-family:"courier new";font-size:10pt">_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><span style="font-family:"courier new";font-size:10pt">
<br>
_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br>
<span style="font-family:"courier new";font-size:10pt">_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><span style="font-family:"courier new";font-size:10pt">
</span></td>
</tr>
</tbody></table>
<span style="font-family:"courier new";font-size:10pt">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.<br>
P.B.<br>
Dne 02. 06. 21 v 10:51 Jan Půhoný napsal(a):<br>
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í. <br>
<br>
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ě?<br>
<br>
<span style="font-family:consolas;font-size:11pt;color:rgb(212,212,212)">  <span style="color:rgb(197,134,192)">if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">waitForConnectResult<span style="color:rgb(212,212,212)">() != <span style="color:rgb(79,193,255)">WL_CONNECTED<span style="color:rgb(212,212,212)">) {   <br>

<br>
<span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">mode<span style="color:rgb(212,212,212)">(<span style="color:rgb(86,156,214)">WIFI_STA<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">begin<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">ssid<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">password<span style="color:rgb(212,212,212)">);<br>

<br>
  }<br>
<br>
<span style="font-family:"courier new";font-size:10pt;color:rgb(0,0,0)">Díky,<br>
<br>
HP<br>
<br>
po 31. 5. 2021 v 12:06 odesílatel Pavel Brychta <</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><a style="font-family:"courier new";font-size:10pt" href="mailto:pavel.brychta@duhasys.eu" target="_blank">pavel.brychta@duhasys.eu</a><span style="font-family:"courier new";font-size:10pt">> napsal:<br>
DD,<br>
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 </span><a style="font-family:"courier new";font-size:10pt" href="https://savjee.be/2020/01/multitasking-esp32-arduino-freertos/" target="_blank">https://savjee.be/2020/01/multitasking-esp32-arduino-freertos/</a><span style="font-family:"courier new";font-size:10pt"> 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 </span><a style="font-family:"courier new";font-size:10pt" href="https://github.com/Pablo2048/Interval" target="_blank">https://github.com/Pablo2048/Interval</a><span style="font-family:"courier new";font-size:10pt"> (teď koukám, že by zasloužila aktualizovat - tak zkuste třeba aktuálnější verzi z </span><a style="font-family:"courier new";font-size:10pt" href="https://git.xpablo.cz/pablo2048/Interval" target="_blank">https://git.xpablo.cz/pablo2048/Interval</a><span style="font-family:"courier new";font-size:10pt"> ). 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ý...)<br>
P.B.<br>
Dne 31. 05. 21 v 11:17 Jan Půhoný napsal(a):<br>
Díky, <br>
<br>
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? <br>
<br>
void vATaskFunction( void *pvParameters )<br>
    {<br>
        for( ;; )<br>
        {<br>
            -- Task application code here. --<br>
        }<br>
<br>
        /* Tasks must not attempt to return from their implementing<br>
        function or otherwise exit.  In newer FreeRTOS port<br>
        attempting to do so will result in an configASSERT() being<br>
        called if it is defined.  If it is necessary for a task to<br>
        exit then have the task call vTaskDelete( NULL ) to ensure<br>
        its exit is clean. */<br>
        vTaskDelete( NULL );<br>
    } <br>
<br>
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: <br>
<br>
<span style="font-family:consolas;font-size:11pt;color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><Arduino.h><br>
<span style="color:rgb(106,153,85)">  /* ESP32 Dependencies */<br>
<span style="color:rgb(86,156,214)">  <span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><WiFi.h><br>
<span style="color:rgb(86,156,214)">  <span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><AsyncTCP.h><br>
<span style="color:rgb(86,156,214)">  <span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><ESPAsyncWebServer.h><br>
<span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><ESPDash.h><br>
<span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><WiFiUdp.h><br>
<span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)"><ArduinoOTA.h><br>
<span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)">"uptime.h"<br>
<span style="color:rgb(197,134,192)">#include <span style="color:rgb(206,145,120)">"uptime_formatter.h"<br>
<span style="color:rgb(106,153,85)">/* Your WiFi Credentials */<br>
<span style="color:rgb(86,156,214)">const char<span style="color:rgb(212,212,212)">* <span style="color:rgb(156,220,254)">ssid<span style="color:rgb(212,212,212)"> = <span style="color:rgb(206,145,120)">"puhy_iot"<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)"> // SSID<br>
<span style="color:rgb(86,156,214)">const char<span style="color:rgb(212,212,212)">* <span style="color:rgb(156,220,254)">password<span style="color:rgb(212,212,212)"> = <span style="color:rgb(206,145,120)">"iot44puhy"<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)"> // Password<br>
<span style="color:rgb(86,156,214)">const char<span style="color:rgb(212,212,212)">* <span style="color:rgb(156,220,254)">OTAhostname<span style="color:rgb(212,212,212)"> = <span style="color:rgb(206,145,120)">"ESP-puhy"<span style="color:rgb(212,212,212)">;<br>
<span style="color:rgb(106,153,85)">/* Start Webserver */<br>
<span style="color:rgb(78,201,176)">AsyncWebServer <span style="color:rgb(156,220,254)">server<span style="color:rgb(212,212,212)">(<span style="color:rgb(181,206,168)">80<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(106,153,85)">/* Attach ESP-DASH to AsyncWebServer */<br>
<span style="color:rgb(78,201,176)">ESPDash <span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">server<span style="color:rgb(212,212,212)">); <br>
<span style="color:rgb(106,153,85)">/* <br>
  Button Card<br>
  Format - (Dashboard Instance, Card Type, Card Name)<br>
*/<br>
<span style="color:rgb(78,201,176)">Card <span style="color:rgb(156,220,254)">button<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">, <span style="color:rgb(78,201,176)">BUTTON_CARD<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"Zalévej"<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(78,201,176)">Card <span style="color:rgb(156,220,254)">button1<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">, <span style="color:rgb(78,201,176)">BUTTON_CARD<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"Čisti"<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(78,201,176)">Card <span style="color:rgb(156,220,254)">button2<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">, <span style="color:rgb(78,201,176)">BUTTON_CARD<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"Zatop"<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(78,201,176)">Card <span style="color:rgb(156,220,254)">uptimeCard<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">, <span style="color:rgb(78,201,176)">STATUS_CARD<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"Uptime"<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"success"<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(106,153,85)">/* <br>
  Slider Card<br>
  Format - (Dashboard Instance, Card Type, Card Name, Card Symbol(optional), int min, int max)<br>
*/<br>
<span style="color:rgb(78,201,176)">Card <span style="color:rgb(156,220,254)">slider<span style="color:rgb(212,212,212)">(&<span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">, <span style="color:rgb(78,201,176)">SLIDER_CARD<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">"Test Slider"<span style="color:rgb(212,212,212)">, <span style="color:rgb(206,145,120)">""<span style="color:rgb(212,212,212)">, <span style="color:rgb(181,206,168)">0<span style="color:rgb(212,212,212)">, <span style="color:rgb(181,206,168)">255<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">ledHeartBeatPin<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">2<span style="color:rgb(212,212,212)">;<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">ledPin<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">5<span style="color:rgb(212,212,212)">;<br>
<span style="color:rgb(106,153,85)">// setting PWM properties<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">ledPinPWM<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">13<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)">  /* GPIO13 */<br>
//int dutyCycle;<br>
/* Setting PWM Properties */<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">PWMFreq<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">5000<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)"> /* 5 KHz */<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">PWMChannel<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">0<span style="color:rgb(212,212,212)">;<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">PWMResolution<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">8<span style="color:rgb(212,212,212)">;<br>
<span style="color:rgb(86,156,214)">const int <span style="color:rgb(156,220,254)">MAX_DUTY_CYCLE<span style="color:rgb(212,212,212)"> = (<span style="color:rgb(86,156,214)">int<span style="color:rgb(212,212,212)">)(<span style="color:rgb(220,220,170)">pow<span style="color:rgb(212,212,212)">(<span style="color:rgb(181,206,168)">2<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">PWMResolution<span style="color:rgb(212,212,212)">) - <span style="color:rgb(181,206,168)">1<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(106,153,85)">// Variables will change:<br>
<span style="color:rgb(86,156,214)">int <span style="color:rgb(156,220,254)">ledState<span style="color:rgb(212,212,212)"> = <span style="color:rgb(86,156,214)">LOW<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)">             // ledState used to set the LED<br>
// Generally, you should use "unsigned long" for variables that hold time<br>
// The value will quickly become too large for an int to store<br>
<span style="color:rgb(86,156,214)">unsigned long <span style="color:rgb(156,220,254)">previousMillis<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">0<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)">        // will store last time LED was updated<br>
// constants won't change:<br>
<span style="color:rgb(86,156,214)">long <span style="color:rgb(156,220,254)">heartBeatInterval<span style="color:rgb(212,212,212)"> = <span style="color:rgb(181,206,168)">1000<span style="color:rgb(212,212,212)">;<span style="color:rgb(106,153,85)">           // interval at which to blink (milliseconds)<br>
<span style="color:rgb(86,156,214)">void <span style="color:rgb(220,220,170)">setup<span style="color:rgb(212,212,212)">() {<br>
<span style="color:rgb(220,220,170)">pinMode<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">ledPin<span style="color:rgb(212,212,212)">, <span style="color:rgb(86,156,214)">OUTPUT<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(220,220,170)">pinMode<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">ledHeartBeatPin<span style="color:rgb(212,212,212)">, <span style="color:rgb(86,156,214)">OUTPUT<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(220,220,170)">pinMode<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">ledPinPWM<span style="color:rgb(212,212,212)">, <span style="color:rgb(86,156,214)">OUTPUT<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(220,220,170)">ledcSetup<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">PWMChannel<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">PWMFreq<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">PWMResolution<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(106,153,85)">  /* Attach the LED PWM Channel to the GPIO Pin */<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(220,220,170)">ledcAttachPin<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">ledPinPWM<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">PWMChannel<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">begin<span style="color:rgb(212,212,212)">(<span style="color:rgb(181,206,168)">115200<span style="color:rgb(212,212,212)">);<br>
<span style="color:rgb(106,153,85)">  /* Connect WiFi */<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">mode<span style="color:rgb(212,212,212)">(<span style="color:rgb(86,156,214)">WIFI_STA<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">begin<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">ssid<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">password<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(197,134,192)">if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">waitForConnectResult<span style="color:rgb(212,212,212)">() != <span style="color:rgb(79,193,255)">WL_CONNECTED<span style="color:rgb(212,212,212)">) {<br>
      <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">printf<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"WiFi Failed!<span style="color:rgb(215,186,125)">\n<span style="color:rgb(206,145,120)">"<span style="color:rgb(212,212,212)">);<br>
      <span style="color:rgb(197,134,192)">return<span style="color:rgb(212,212,212)">;<br>
  }<br>
  <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">print<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"IP Address: "<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">WiFi<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">localIP<span style="color:rgb(212,212,212)">());<br>
<span style="color:rgb(106,153,85)">  /* Attach Button Callback */<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(156,220,254)">button<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">attachCallback<span style="color:rgb(212,212,212)">([&](<span style="color:rgb(86,156,214)">bool <span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">){<br>
<span style="color:rgb(106,153,85)">    /* Print our new button value received from dashboard */<br>
<span style="color:rgb(212,212,212)">    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Button Triggered: "<span style="color:rgb(220,220,170)">+<span style="color:rgb(78,201,176)">String<span style="color:rgb(212,212,212)">((<span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">)?<span style="color:rgb(206,145,120)">"true"<span style="color:rgb(212,212,212)">:<span style="color:rgb(206,145,120)">"false"<span style="color:rgb(212,212,212)">));<br>
<span style="color:rgb(106,153,85)">    /* Make sure we update our button's value and send update to dashboard */<br>
<span style="color:rgb(212,212,212)">    <span style="color:rgb(156,220,254)">button<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">update<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(220,220,170)">digitalWrite<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">ledPin<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">sendUpdates<span style="color:rgb(212,212,212)">();<br>
  });<br>
<span style="color:rgb(106,153,85)">  /* Attach Slider Callback */<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(156,220,254)">slider<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">attachCallback<span style="color:rgb(212,212,212)">([&](<span style="color:rgb(86,156,214)">int <span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">){<br>
<span style="color:rgb(106,153,85)">    /* Print our new slider value received from dashboard */<br>
<span style="color:rgb(212,212,212)">    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Slider Triggered: "<span style="color:rgb(220,220,170)">+<span style="color:rgb(78,201,176)">String<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">));<br>
<span style="color:rgb(106,153,85)">    /* Make sure we update our slider's value and send update to dashboard */<br>
<span style="color:rgb(212,212,212)">    <span style="color:rgb(156,220,254)">slider<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">update<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(220,220,170)">ledcWrite<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">PWMChannel<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">value<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(156,220,254)">dashboard<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">sendUpdates<span style="color:rgb(212,212,212)">();<br>
  });<br>
<span style="color:rgb(106,153,85)">  /* Start AsyncWebServer */<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(156,220,254)">server<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">begin<span style="color:rgb(212,212,212)">();<br>
<span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">setHostname<span style="color:rgb(212,212,212)">(<span style="color:rgb(156,220,254)">OTAhostname<span style="color:rgb(212,212,212)">);<br>
  <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">onStart<span style="color:rgb(212,212,212)">([]()<br>
  {<br>
    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Start"<span style="color:rgb(212,212,212)">);<br>
  });<br>
  <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">onEnd<span style="color:rgb(212,212,212)">([]()<br>
  {<br>
    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"<span style="color:rgb(215,186,125)">\n<span style="color:rgb(206,145,120)">End"<span style="color:rgb(212,212,212)">);<br>
  });<br>
  <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">onProgress<span style="color:rgb(212,212,212)">([](<span style="color:rgb(86,156,214)">unsigned int <span style="color:rgb(156,220,254)">progress<span style="color:rgb(212,212,212)">, <span style="color:rgb(86,156,214)">unsigned int <span style="color:rgb(156,220,254)">total<span style="color:rgb(212,212,212)">)<br>
  {<br>
    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">printf<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Progress: %u%%<span style="color:rgb(215,186,125)">\r<span style="color:rgb(206,145,120)">"<span style="color:rgb(212,212,212)">, (<span style="color:rgb(156,220,254)">progress<span style="color:rgb(212,212,212)"> / (<span style="color:rgb(156,220,254)">total<span style="color:rgb(212,212,212)"> / <span style="color:rgb(181,206,168)">100<span style="color:rgb(212,212,212)">)));<br>
  });<br>
  <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">onError<span style="color:rgb(212,212,212)">([](<span style="color:rgb(78,201,176)">ota_error_t <span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)">)<br>
  {<br>
    <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">printf<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Error[%u]: "<span style="color:rgb(212,212,212)">, <span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(197,134,192)">if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)"> == <span style="color:rgb(79,193,255)">OTA_AUTH_ERROR<span style="color:rgb(212,212,212)">) <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Auth Failed"<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(197,134,192)">else if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)"> == <span style="color:rgb(79,193,255)">OTA_BEGIN_ERROR<span style="color:rgb(212,212,212)">) <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Begin Failed"<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(197,134,192)">else if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)"> == <span style="color:rgb(79,193,255)">OTA_CONNECT_ERROR<span style="color:rgb(212,212,212)">) <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Connect Failed"<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(197,134,192)">else if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)"> == <span style="color:rgb(79,193,255)">OTA_RECEIVE_ERROR<span style="color:rgb(212,212,212)">) <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"Receive Failed"<span style="color:rgb(212,212,212)">);<br>
    <span style="color:rgb(197,134,192)">else if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">error<span style="color:rgb(212,212,212)"> == <span style="color:rgb(79,193,255)">OTA_END_ERROR<span style="color:rgb(212,212,212)">) <span style="color:rgb(156,220,254)">Serial<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">println<span style="color:rgb(212,212,212)">(<span style="color:rgb(206,145,120)">"End Failed"<span style="color:rgb(212,212,212)">);<br>
  });<br>
  <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">begin<span style="color:rgb(212,212,212)">();<br>
}<br>
<span style="color:rgb(86,156,214)">void <span style="color:rgb(220,220,170)">loop<span style="color:rgb(212,212,212)">() {<br>
<span style="color:rgb(106,153,85)">  /* Nothing so far */<br>
 <span style="color:rgb(156,220,254)">ArduinoOTA<span style="color:rgb(212,212,212)">.<span style="color:rgb(220,220,170)">handle<span style="color:rgb(212,212,212)">();<br>
<span style="color:rgb(106,153,85)">  // here is where you'd put code that needs to be running all the time.<br>
  // check to see if it's time to blink the LED; that is, if the difference<br>
  // between the current time and last time you blinked the LED is bigger than<br>
  // the interval at which you want to blink the LED.<br>
<span style="color:rgb(212,212,212)">  <span style="color:rgb(86,156,214)">unsigned long <span style="color:rgb(156,220,254)">currentMillis<span style="color:rgb(212,212,212)"> = <span style="color:rgb(220,220,170)">millis<span style="color:rgb(212,212,212)">();<br>
  <span style="color:rgb(197,134,192)">if<span style="color:rgb(212,212,212)"> (<span style="color:rgb(156,220,254)">currentMillis<span style="color:rgb(212,212,212)"> - <span style="color:rgb(156,220,254)">previousMillis<span style="color:rgb(212,212,212)"> >= </span><span style="color:rgb(156,220,254)">heartBeatInterval</span><span style="color:rgb(212,212,212)">) {
</span><br><span style="color:rgb(106,153,85)">    // save the last time you blinked the LED
</span><br><span style="color:rgb(212,212,212)">    </span><span style="color:rgb(156,220,254)">previousMillis</span><span style="color:rgb(212,212,212)"> = </span><span style="color:rgb(156,220,254)">currentMillis</span><span style="color:rgb(212,212,212)">;
</span><br><span style="color:rgb(106,153,85)">    // if the LED is off turn it on and vice-versa:
</span><br><span style="color:rgb(212,212,212)">    </span><span style="color:rgb(197,134,192)">if</span><span style="color:rgb(212,212,212)"> (</span><span style="color:rgb(156,220,254)">ledState</span><span style="color:rgb(212,212,212)"> == </span><span style="color:rgb(86,156,214)">LOW</span><span style="color:rgb(212,212,212)">) {
      </span><br><span style="color:rgb(156,220,254)">ledState</span><span style="color:rgb(212,212,212)"> = </span><span style="color:rgb(86,156,214)">HIGH</span><span style="color:rgb(212,212,212)">;
      </span><br><span style="color:rgb(156,220,254)">heartBeatInterval</span><span style="color:rgb(212,212,212)"> = </span><span style="color:rgb(181,206,168)">2500</span><span style="color:rgb(212,212,212)">;
    } </span><br><span style="color:rgb(197,134,192)">else</span><span style="color:rgb(212,212,212)"> {
      </span><br><span style="color:rgb(156,220,254)">heartBeatInterval</span><span style="color:rgb(212,212,212)"> = </span><span style="color:rgb(181,206,168)">20</span><span style="color:rgb(212,212,212)">;
      </span><br><span style="color:rgb(156,220,254)">ledState</span><span style="color:rgb(212,212,212)"> = </span><span style="color:rgb(86,156,214)">LOW</span><span style="color:rgb(212,212,212)">;
    }
</span><br><br><span style="color:rgb(106,153,85)">    // set the LED with the ledState of the variable:
</span><br><span style="color:rgb(212,212,212)">    </span><span style="color:rgb(220,220,170)">digitalWrite</span><span style="color:rgb(212,212,212)">(</span><span style="color:rgb(156,220,254)">ledHeartBeatPin</span><span style="color:rgb(212,212,212)">, </span><span style="color:rgb(156,220,254)">ledState</span><span style="color:rgb(212,212,212)">);
</span><br><span style="color:rgb(156,220,254)">Serial</span><span style="color:rgb(212,212,212)">.</span><span style="color:rgb(220,220,170)">println</span><span style="color:rgb(212,212,212)">(</span><span style="color:rgb(78,201,176)">uptime_formatter</span><span style="color:rgb(212,212,212)">::</span><span style="color:rgb(220,220,170)">getUptime</span><span style="color:rgb(212,212,212)">());
</span><br><span style="color:rgb(156,220,254)">uptimeCard</span><span style="color:rgb(212,212,212)">.</span><span style="color:rgb(220,220,170)">update</span><span style="color:rgb(212,212,212)">(</span><span style="color:rgb(78,201,176)">uptime_formatter</span><span style="color:rgb(212,212,212)">::</span><span style="color:rgb(220,220,170)">getUptime</span><span style="color:rgb(212,212,212)">());
  }


</span><br><br><br><br><span style="font-family:"courier new";font-size:10pt;color:rgb(0,0,0)">Díky za podporu.

HP


pá 28. 5. 2021 v 6:10 odesílatel Pavel Brychta <</span><br><br><br><br><br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><a style="font-family:"courier new";font-size:10pt" href="mailto:pavel.brychta@duhasys.eu" target="_blank">pavel.brychta@duhasys.eu</a><span style="font-family:"courier new";font-size:10pt">> napsal:<br>
DD,<br>
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 </span><a style="font-family:"courier new";font-size:10pt" href="https://s.click.aliexpress.com/e/_9j8PIP" target="_blank">https://s.click.aliexpress.com/e/_9j8PIP</a><span style="font-family:"courier new";font-size:10pt"> ).<br>
P.B.<br>
Dne 27. 05. 21 v 23:22 Jan Půhoný napsal(a):<br>
Dobrý večer,<br>
<br>
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.<br>
<br>
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.<br>
<br>
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.<br>
<br>
<img width="277" height="43" alt="" style="padding: 1px;" src="cid:17af960d7afcb971f161"><br>
<br>
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. <br>
<br>
Píše se ten OTA handler opravdu do loop?<br>
<br>
#include <Arduino.h><br>
#if defined(ESP8266)<br>
  /* ESP8266 Dependencies */<br>
  #include <ESP8266WiFi.h><br>
  #include <ESPAsyncTCP.h><br>
  #include <ESPAsyncWebServer.h><br>
#elif defined(ESP32)<br>
  /* ESP32 Dependencies */<br>
  #include <WiFi.h><br>
  #include <AsyncTCP.h><br>
  #include <ESPAsyncWebServer.h><br>
#endif<br>
#include <ESPDash.h><br>
<br>
<br>
#include <WiFiUdp.h><br>
<b>#include <ArduinoOTA.h><br>
<br>
</b>/* Your WiFi Credentials */<br>
const char* ssid = "******"; // SSID<br>
const char* password = "******"; // Password<br>
<br>
const char* OTAhostname = "ESP-puhy";<br>
<br>
/* Start Webserver */<br>
AsyncWebServer server(80);<br>
<br>
/* Attach ESP-DASH to AsyncWebServer */<br>
ESPDash dashboard(&server); <br>
<br>
/* <br>
  Button Card<br>
  Format - (Dashboard Instance, Card Type, Card Name)<br>
*/<br>
Card button(&dashboard, BUTTON_CARD, "Test Button");<br>
<br>
/* <br>
  Slider Card<br>
  Format - (Dashboard Instance, Card Type, Card Name, Card Symbol(optional), int min, int max)<br>
*/<br>
Card slider(&dashboard, SLIDER_CARD, "Test Slider", "", 0, 255);<br>
<br>
<br>
void setup() {<br>
  Serial.begin(115200);<br>
<br>
  /* Connect WiFi */<br>
  WiFi.mode(WIFI_STA);<br>
  WiFi.begin(ssid, password);<br>
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {<br>
      Serial.printf("WiFi Failed!\n");<br>
      return;<br>
  }<br>
  Serial.print("IP Address: ");<br>
  Serial.println(WiFi.localIP());<br>
<br>
  /* Attach Button Callback */<br>
  button.attachCallback([&](bool value){<br>
    /* Print our new button value received from dashboard */<br>
    Serial.println("Button Triggered: "+String((value)?"true":"false"));<br>
    /* Make sure we update our button's value and send update to dashboard */<br>
    button.update(value);<br>
    dashboard.sendUpdates();<br>
  });<br>
<br>
  /* Attach Slider Callback */<br>
  slider.attachCallback([&](int value){<br>
    /* Print our new slider value received from dashboard */<br>
    Serial.println("Slider Triggered: "+String(value));<br>
    /* Make sure we update our slider's value and send update to dashboard */<br>
    slider.update(value);<br>
    dashboard.sendUpdates();<br>
  });<br>
<br>
  /* Start AsyncWebServer */<br>
  server.begin();<br>
<br>
ArduinoOTA.setHostname(OTAhostname);<br>
  ArduinoOTA.onStart([]()<br>
  {<br>
    Serial.println("Start");<br>
  });<br>
  ArduinoOTA.onEnd([]()<br>
  {<br>
    Serial.println("\nEnd");<br>
  });<br>
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)<br>
  {<br>
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));<br>
  });<br>
  ArduinoOTA.onError([](ota_error_t error)<br>
  {<br>
    Serial.printf("Error[%u]: ", error);<br>
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");<br>
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");<br>
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");<br>
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");<br>
    else if (error == OTA_END_ERROR) Serial.println("End Failed");<br>
  });<br>
  ArduinoOTA.begin();<br>
}<br>
<br>
void loop() {<br>
  /* Nothing so far */<br>
<b> ArduinoOTA.handle();<br>
<br>
</b> delay(5000);<br>
<br>
}<br>
<br>
Díky,<br>
<br>
HP<br>
<br>
<br>
st 26. 5. 2021 v 13:45 odesílatel Pavel Brychta <</span><a style="font-family:"courier new";font-size:10pt" href="mailto:pavel.brychta@duhasys.eu" target="_blank">pavel.brychta@duhasys.eu</a><span style="font-family:"courier new";font-size:10pt">> napsal:<br>
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.<br>
P.B.<br>
Dne 26. 05. 21 v 13:30 Jan Půhoný napsal(a):<br>
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.  <br>
<br>
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í :-) <br>
<br>
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.<br>
<br>
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.<br>
<br>
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?<br>
<br>
A další věc, je potřeba k ESP32 dávat externí WDT?<br>
<br>
HP<br>
<br>
st 26. 5. 2021 v 11:47 odesílatel Pavel Brychta <</span><a style="font-family:"courier new";font-size:10pt" href="mailto:pavel.brychta@duhasys.eu" target="_blank">pavel.brychta@duhasys.eu</a><span style="font-family:"courier new";font-size:10pt">> napsal:<br>
Tak zrovna to je exemplární případ, jak to určitě nedělat. Zde <br>
</span><a style="font-family:"courier new";font-size:10pt" href="https://github.com/Alextros00/ESP32-MQTT-Relay-Control/blob/main/main/app_main.c" target="_blank">https://github.com/Alextros00/ESP32-MQTT-Relay-Control/blob/main/main/app_main.c</a> <br>
<span style="font-family:"courier new";font-size:10pt">není jediná zmínka, nebo náznak řešení nějakého failsafe mechanizmu. <br>
Celé to je na úrovni primitivního Arduino example, který se s detaily <br>
jako je třeba jméno topcu vůbec nezalamuje. MQTT failsafe samo o sobě <br>
nevyřeší ani omylem.<br>
<br>
P.B.<br>
<br>
Dne 26. 05. 21 v 11:28 T. Meinlschmidt napsal(a):<br>
> proto pisu mqtt. esp32 tu podporu mqtt ma pomerne slusnou. viz treba <br>
> takovy easy priklad<br>
><br>
> </span><a style="font-family:"courier new";font-size:10pt" href="https://github.com/Alextros00/Home-Automation-NodeRED-ESP-Telegram" target="_blank">https://github.com/Alextros00/Home-Automation-NodeRED-ESP-Telegram</a><br>
<span style="font-family:"courier new";font-size:10pt">><br>
> tm<br>
><br>
> Dne 2021-05-26 10:54, Pavel Brychta napsal:<br>
>> ... až na to, že když pak lehne to Pi, nebo WiFi, tak zůstane třeba<br>
>> čerpadlo běžet stále, nebo uvaříte rybičky. Přiznám se, že takovouto<br>
>> cestou bych nikdy nešel, protože to znamená mít failsafe procesy v ESP<br>
>> a řídící logiku jinde, což pro účely automatizace považuji za hodně<br>
>> nešťastné řešení. Když už, tak autonomní pocesy na zařízení a API pro<br>
>> parametrizaci do toho rPi...<br>
>><br>
>> P.B.<br>
>><br>
>> Dne 26. 05. 21 v 10:49 T. Meinlschmidt napsal(a):<br>
>>> dobre dopoledne.<br>
>>><br>
>>> ja se priznam, ze bych vubec nesel touhle cestou, ale mel ESP ciste <br>
>>> na hw veci a sber nejakych dat,<br>
>>> a celou tu logiku nechal v node-red + mqtt (treba na rpi). Casem na <br>
>>> to muzete navazat mobil, UI si udelate podle sebe pomerne jednoduse, <br>
>>> navic to umi spoustu veci z jinych zdroju.<br>
>>><br>
>>> tm<br>
>>><br>
>>> Dne 2021-05-26 10:32, Jan Půhoný napsal:<br>
>>>> Dobré dopoledne,<br>
>>>><br>
>>>> Ještě bych potřeboval poradit co použít za systém na ESP32.<br>
>>>> Jedná se mi o to, že do ESP32 přepisuji z Atmegy 2560 něco jako<br>
>>>> řízení topení a různých zdrojů tepla a různých hejblátek<br>
>>>> doma. Do teď to běží na ATMEGA 2560 a mám tam jednoduchý<br>
>>>> "multitasking" pomocí millis. Jedná se v podstatě jen o čtení<br>
>>>> teplotních čidel, webserver a pak různé výstupy v podobě SSR<br>
>>>> relé + vstupy a logika mezi tím. Nic složitého. Na druhou stranu<br>
>>>> za ty roky to celkem naboptnalo co se kódu týče a ten webserver na<br>
>>>> té AT2560 je takový dost líný. Navíc tam potřebuji číst http<br>
>>>> requesty data z komerční meteostanice a na to už to moc není.<br>
>>>><br>
>>>> Neexistuje nějaký opensource projekt na ESP32, kde by byly<br>
>>>> vyřešeny základní věci jako webserver + nějaká grafika a<br>
>>>> hejblátka abych to nemusel psát úplně od začátku. Líbilo by se<br>
>>>> mi už https a základní struktura a dopsal bych si do toho jen tu<br>
>>>> vlastní logiku a ovládání vstupů a výstupů.<br>
>>>><br>
>>>> Je dobrý nápad na to ESP dávat FreeRTOS, nebo to už je překonané<br>
>>>> a používáte něco lepšího? Případně víte o nějakém open<br>
>>>> source projektu pro domácí automatizaci pro ESP32?<br>
>>>><br>
>>>> Ano, googlil jsem, ale serp je zaplaven videi geeků kteří připojí<br>
>>>> k pár relátkům esp a myslí si co nevymysleli a trochu se v tom<br>
>>>> ztrácím. Já bych potřeboval něco trochu robusnějšího.<br>
>>>><br>
>>>> Díky za nápady.<br>
>>>><br>
>>>> HP<br>
>>>> _______________________________________________<br>
>>>> HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>>>> </span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>>>> </span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<span style="font-family:"courier new";font-size:10pt">>>> _______________________________________________<br>
>>> HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>>> </span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>>> </span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<span style="font-family:"courier new";font-size:10pt">>> _______________________________________________<br>
>> HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>> </span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">>> </span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<span style="font-family:"courier new";font-size:10pt">> _______________________________________________<br>
> HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">> </span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<span style="font-family:"courier new";font-size:10pt">> </span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<span style="font-family:"courier new";font-size:10pt">_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br>
<span style="font-family:"courier new";font-size:10pt">_______________________________________________
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><span style="font-family:"courier new";font-size:10pt">
<br>
_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br>
<span style="font-family:"courier new";font-size:10pt">_______________________________________________
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><span style="font-family:"courier new";font-size:10pt">
<br>
_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br>
<span style="font-family:"courier new";font-size:10pt">_______________________________________________
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><span style="font-family:"courier new";font-size:10pt">
<br>
_______________________________________________<br>
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
<br>
<span style="font-family:"courier new";font-size:10pt">_______________________________________________
HW-list mailing list  -  sponsored by </span><a style="font-family:"courier new";font-size:10pt" href="http://www.HW.cz" target="_blank">www.HW.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><span style="font-family:"courier new";font-size:10pt">
</span><a style="font-family:"courier new";font-size:10pt" href="http://list.hw.cz/mailman/listinfo/hw-list" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><span style="font-family:"courier new";font-size:10pt">
</span></div>_______________________________________________<br>
HW-list mailing list  -  sponsored by <a href="http://www.HW.cz" rel="noreferrer" target="_blank">www.HW.cz</a><br>
<a href="mailto:Hw-list@list.hw.cz" target="_blank">Hw-list@list.hw.cz</a><br>
<a href="http://list.hw.cz/mailman/listinfo/hw-list" rel="noreferrer" target="_blank">http://list.hw.cz/mailman/listinfo/hw-list</a><br>
</blockquote></div>