nico_2010 Postat Aprilie 27, 2022 Partajează Postat Aprilie 27, 2022 Acum 7 minute, Liviu.Mihaiu a spus: @nico_2010 Aplicatie practica (cu vocabular controlat) : Softul de mai sus se poate adapta pentru a controla o drona folosind pagina web. Vom adauga un senzor de proximitate pentru a evita ca drona sa se loveasca de obstacole. Daca de fiecare data cand se pierde conexiunea wireless softul din drona tot face "delay", este foarte probabil sa o gasim lipita de un perete. "Vocabular controlat" se referea la altceva, dar daca vrei sa gasim spini te asigur ca vom gasi chiar in locuri in care nu te-ai astepta sa gasim! Inca odata, in limba romana: delay() foloseste un timer si da, este o functie care blocheaza activitatea uC pe o perioada determinata de timp. Pe de alta parte, in aplicatia de care vorbim (nu de drone si alte ozeneuri), nu este nicio problema in a folosi delay(). In plus, initiatorul topicului a afirmat clar ca sketch-ul poate fi optimizat in fel si chip, asa ca daca tot te lauzi ca esti bun la programare, refa sketch-ul conform propriei tale viziuni si posteaza-l! Te asigur ca va fi apreciat efortul, altfel ... doar vorbe! Este ultima oara cand iti permit sa folosesti un vocabular deplasat, urmatoarea abatere te trimite in functia de sleep() pentru o perioada de timp, determinata sau nu! Link spre comentariu
Vizitator Postat Aprilie 27, 2022 Partajează Postat Aprilie 27, 2022 Oricum nu este frumos ca ceasul sa stea pina se reface conexiunea iar apoi sa sara brusc cu 3-4-100 secunde inainte. Daca setez o alarma la ora 06:00:00 iar ceasul meu este oprit din cauza ca asteapta refacerea conexiunii wireless ? Ma scuz pentru ca a intraziat la munca din cauza de delay() ? Ca asa a scris unul pe net ca se face :) Pina la urma, proiectul prezentat este al unui ceas. Deci ceasul trebuie sa mearga/afiseze la secunda. Parerea mea. 3 minutes ago, nico_2010 said: Este ultima oara cand iti permit sa folosesti un vocabular deplasat, urmatoarea abatere te trimite in functia de sleep() pentru o perioada de timp, determinata sau nu! Eu zic sa lasi amenintarile si sa fim la subiect. Link spre comentariu
nico_2010 Postat Aprilie 27, 2022 Partajează Postat Aprilie 27, 2022 Acum 11 minute, Liviu.Mihaiu a spus: Oricum nu este frumos ca ceasul sa stea pina se reface conexiunea iar apoi sa sara brusc cu 3-4-100 secunde inainte. Daca setez o alarma la ora 06:00:00 iar ceasul meu este oprit din cauza ca asteapta refacerea conexiunii wireless ? Ma scuz pentru ca a intraziat la munca din cauza de delay() ? Ca asa a scris unul pe net ca se face Pina la urma, proiectul prezentat este al unui ceas. Deci ceasul trebuie sa mearga/afiseze la secunda. Parerea mea. Eu zic sa lasi amenintarile si sa fim la subiect. Se pare ca aptitudinile tale de programare sunt doar de tine observate si apreciate, altfel daca urmareai postarea initiatorului ai fi observat ca pentru ceas foloseste DS3231, asa ca indiferent daca exista o conexiune wireless sau nu, ceasul va functiona bine multumesc cu toate functiile lui (ceas, alarma, temperatura)! Da, lipsa conexiunii wireless face ca utilizatorul sa nu poata regla intensitatea luminoasa, culoarea si eventual sa seteze ora si minutul, insa doar atat. Lasa aroganta la o parte, concentreaza-te cand faci afirmatii si nu ignora avertismentul pe care ti l-am dat! Link spre comentariu
merck Postat Aprilie 27, 2022 Partajează Postat Aprilie 27, 2022 26 minutes ago, nico_2010 said: Lasa aroganta la o parte, concentreaza-te cand faci afirmatii si nu ignora avertismentul pe care ti l-am dat! Esti moderator pe aceasta sectiune? Link spre comentariu
nico_2010 Postat Aprilie 27, 2022 Partajează Postat Aprilie 27, 2022 Da, la fel si in sectiunile"Microcontrollere Atmel" si "Microcontrollere ARM". Ai vreo problema cu asta? Link spre comentariu
Vizitator Postat Aprilie 27, 2022 Partajează Postat Aprilie 27, 2022 1 hour ago, nico_2010 said: Se pare ca aptitudinile tale de programare sunt doar de tine observate si apreciate, altfel daca urmareai postarea initiatorului ai fi observat ca pentru ceas foloseste DS3231, asa ca indiferent daca exista o conexiune wireless sau nu, ceasul va functiona bine multumesc cu toate functiile lui (ceas, alarma, temperatura)! Da, lipsa conexiunii wireless face ca utilizatorul sa nu poata regla intensitatea luminoasa, culoarea si eventual sa seteze ora si minutul, insa doar atat. Cred ca vorbim despre lucruri diferite. Si asta poate sa si fie cauza vorbelor aruncate de tine la adresa mea. Eu am crezut ca am spus clar ca acest ceas ramane blocat (ingheata afisarea) pe durata cat ESP sta blocat (delay) pe facerea conexiunii WiFi. Putin conteaza ca merge sau nu DS3231. Nici nu mai are rost sa tratez o eventuala alarma daca Wifi revine activ dupa 14 ore :) Si nu este vorba numai desprea softul de mai sus. Nu are ce cauta un delay asa mare (cautare router, conectare wifi) intr-un proiect care alt scop principal: "Ceas" in acest caz. In cazul de fata, nici nu porneste ceasul daca nu are conexiune WiFi (desi nu are nevoie de ea pentru functionare). Link spre comentariu
nico_2010 Postat Aprilie 27, 2022 Partajează Postat Aprilie 27, 2022 Acum 3 ore, nico_2010 a spus: In plus, initiatorul topicului a afirmat clar ca sketch-ul poate fi optimizat in fel si chip, asa ca daca tot te lauzi ca esti bun la programare, refa sketch-ul conform propriei tale viziuni si posteaza-l! Te asigur ca va fi apreciat efortul, altfel ... doar vorbe! Dupa cum vezi, te-am invitat sa prezinti propriul sketch! Se pare ca ai chef de dispute care, in aceasta sectiune, sunt inutile si nu fac decat sa tensioneze atmosfera! Acum 46 minute, Liviu.Mihaiu a spus: Si asta poate sa si fie cauza vorbelor aruncate de tine la adresa mea Ti-am cerut sa iti revizuiesti vocabularul si atitudinea, insa continui! O sa iei o vacanta si, la revenire, poate iti prezinti propria varianta de sketch care ar inlatura disfunctiile constatate de tine! Link spre comentariu
Vizitator Postat Aprilie 29, 2022 Partajează Postat Aprilie 29, 2022 @nico_2010 Nu comentez. #include <ESP8266WiFi.h> #include <ESPAsyncWebServer.h> bool Wifi_UP=false; int my_time=0; char html[] = "Ceas cu CUCI"; AsyncWebServer server(80); void setup() { Serial.begin(115200); WiFi.onEvent([](WiFiEvent_t event){ Wifi_UP=true; }, WiFiEvent_t::WIFI_EVENT_STAMODE_GOT_IP); WiFi.onEvent([](WiFiEvent_t event){ Wifi_UP=false;}, WiFiEvent_t::WIFI_EVENT_STAMODE_DISCONNECTED); WiFi.begin("ssid", "pass"); server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){request->send(200, "text/html", html);}); server.begin(); } void loop() { if(millis()-my_time>1000 && (my_time=millis())) Serial.println(Wifi_UP?WiFi.localIP().toString():"Down"); } Link spre comentariu
Liviu M Postat Aprilie 29, 2022 Partajează Postat Aprilie 29, 2022 Ce sa zic, codul imi place , mi-a luat o ora sa ma prind cum functioneaza (nu codul in sine, ci sa descopar ca daca pierde legatura cu AP, ESP8266 incearca sa se conecteze "pe sestache" si genereaza evenimente). Din pacate inca nu m-am prins cu ce e mai bun *) ca codul din primul post la partea de reconectare, exceptand cazul in care ESP8266 pierde legatura cu AP din cauza de "i **) s-a luat curentul". Ca delay(1000) ala "loveste" fix o data, cand bagi ceasul in priza si-l potrivesti. Cum oricum esti cu el in mana... Da' primesc cu placere lectii de genul celei mai de sus, mai capat si eu cate un rid pe sinapsa. *) Exagerez, evident, ca e clar ca e mai bine sa n-ai cod blocant, da' in conditii "normale" utilizatorul nu vede (aproape) nici o diferenta. **) Daca i se ia curentul ESP8266-ului nu routerului. Link spre comentariu
Vizitator Postat Aprilie 29, 2022 Partajează Postat Aprilie 29, 2022 (editat) In aplicatia initiala "ceas" prezentata de user @Kreator, programul ramane blocat la pornire daca nu are conexiune WiFi: while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi.."); } Si cred ca aceste linii de cod sunt repetate pe net de milioane de ori. Ideea este ca "you might consider adding a call to delay function to keep the WiFi stack running smoothly" citat dintr-o documentatie de user @merck nu este neaparat de respectat. Stiva WiFi se "actualizeaza" si la fiecare terminare de loop(). Nu numai atunci cand se apeleaza delay(). Adica nu trebuie sa blochez un program cu delay. Cel putin asa rezulta din ce am postat. Editat Aprilie 29, 2022 de Vizitator Link spre comentariu
Liviu M Postat Aprilie 29, 2022 Partajează Postat Aprilie 29, 2022 (editat) Eu am pus link-ul la documentatie respectiva si era reactie la afirmatia On 4/26/2022 at 7:08 PM, Liviu.Mihaiu said: Nu stiu altii cum sunt, dar eu cand vad utilizata delay() am ceva de comentat. pe care o consider exagerata in gramezi de cazuri. Chiar, sunt curios, la scrierea in EEPROM-uri e nevoie sa astepti niste ms. Cum implementezi o functie writeEeprom() fara delay()? Mai mult, ai incercat s-o "consolidezi" cu On 4/27/2022 at 9:09 AM, Liviu.Mihaiu said: Daca de fiecare data cand se pierde conexiunea wireless softul din drona tot face "delay", este foarte probabil sa o gasim lipita de un perete. On 4/27/2022 at 9:24 AM, Liviu.Mihaiu said: Daca setez o alarma la ora 06:00:00 iar ceasul meu este oprit din cauza ca asteapta refacerea conexiunii wireless ? da' nu prea se potriveste, ca delay() ala maaare din setup() nu se repeta. Asa ca nici ceasul, nici drona nu se blocheaza asteptand sa se reconecteze. Nu din cauza delay()-ului din setup(). Si restul delay()-urilor din programul initial sunt rezonabile - delay(10), delay(40)... Deci da, daca pierde legatura drona se va lipi de pereti, da' pen'ca nu mai are cine s-o comande, nu ca e blocata cautand-o. Da' cum ziceam, abia astept sa mai postezi cod, ca ca lectii de programare e super. Editat Aprilie 29, 2022 de Liviu M Link spre comentariu
Kreator Postat Aprilie 29, 2022 Autor Partajează Postat Aprilie 29, 2022 (editat) Am rescris codul (dupa cum m-am priceput) sa porneasca cu sau fara legatura la WiFi si am eliminat necesitatea bibliotecii "DallasTemperature". Cum sa-l fac sa se reconecteze automat cand pierde legatuta WiFi? #include <ESP8266WiFi.h> #include <ESPAsyncTCP.h> #include <ESPAsyncWebServer.h> #include <Wire.h> #include <Adafruit_NeoPixel.h> #include <OneWire.h> // Pinul conectat la DS18b20 OneWire ds(D6); // Pinul conectat INPUT Data display #define LED_PIN D7 // Nr de leduri al display-ului #define LED_COUNT 256 // Intensitatea, 0 {min) to 255 {max) // #define BRIGHTNESS 5 // Set BRIGHTNESS to about 1/5 {max = 255) // DS3231_I2C_ADDRESS #define DS3231_I2C_ADDRESS 0x68 #define EEPROM_I2C_ADDRESS 0x57 // Declare our NeoPixel strip object: Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); // Replace with your network credentials const char* ssid = "xxxxx"; //reteaua WiFi la care se conecteaza const char* password = "xxxxx"; // parola pt conectare la retea String sliderValue1 = "128"; // valoare initiala pt slider1 String sliderValue2 = "128"; // valoare initiala pt slider2 String sliderValue3 = "128"; // valoare initiala pt slider3 String sliderValue4 = "5"; // valoare initiala pt slider4 String ora_new = "20"; // valoare initiala pt ora_new String minut_new = "05"; // valoare initiala pt minut_new String ora_change = "0"; // valoare initiala pt ora_change (daca se schimba ora trece in 1) String minut_change = "0"; // valoare initiala pt minut_change (daca se schimba minut trece in 1) String sliderValue1_new = "0"; String sliderValue2_new = "0"; String sliderValue3_new = "0"; String sliderValue4_new = "0"; String sliderValue1_change = "0"; // valoare initiala pt sliderValue1_change (daca se schimba ora trece in 1) String sliderValue2_change = "0"; // valoare initiala pt sliderValue2_change (daca se schimba minut trece in 1) String sliderValue3_change = "0"; // valoare initiala pt sliderValue3_change (daca se schimba minut trece in 1) String sliderValue4_change = "0"; // valoare initiala pt sliderValue4_change (daca se schimba minut trece in 1) String ora_val = "20"; // valoare initiala pt ora String minut_val = "14"; // valoare initiala pt minut const char* PARAM_INPUT1 = "value1"; //valoare folosita pentru cautarea valorii lui slider1 // vezi in xhr.open("GET", "/slider?value1="+sliderValue1, true); const char* PARAM_INPUT1_CHANGE = "value1_change"; //valoare folosita pentru alerta schimbarii slider1 // vezi in xhr.open("GET", "/slider?value1_change="+sliderValue1, true); const char* PARAM_INPUT2 = "value2"; //valoare folosita pentru cautarea valorii lui slider2 // vezi in xhr.open("GET", "/slider?value2="+sliderValue2, true); const char* PARAM_INPUT2_CHANGE = "value2_change"; //valoare folosita pentru cautarea valorii lui slider4 // vezi in xhr.open("GET", "/slider?value2_change="+sliderValue2, true); const char* PARAM_INPUT3 = "value3"; //valoare folosita pentru cautarea valorii lui slider3 // vezi in xhr.open("GET", "/slider?value3="+sliderValue3, true); const char* PARAM_INPUT3_CHANGE = "value3_change"; //valoare folosita pentru cautarea valorii lui slider4 // vezi in xxhr.open("GET", "/slider?value3_change="+sliderValue3, true); const char* PARAM_INPUT4 = "value4"; //valoare folosita pentru cautarea valorii lui slider4 // vezi in xhr.open("GET", "/slider?value4="+sliderValue4, true); const char* PARAM_INPUT4_CHANGE = "value4_change"; //valoare folosita pentru cautarea valorii lui slider4 // vezi in xhr.open("GET", "/slider?value4_change="+sliderValue4, true); const char* PARAM_INPUT_ORA = "value_ora"; //valoare folosita pentru cautarea valorii ora // vezi in /xhr.open("GET", "/slider?value_ora="+ora_new, true); const char* PARAM_INPUT_MINUT = "value_minut"; //valoare folosita pentru cautarea valorii minut // vezi in xhr.open("GET", "/slider?value_minut="+minut_new, true); // Create AsyncWebServer object on port 80 AsyncWebServer server(80); AsyncWebSocket ws("/ws"); byte rosu = 100, verde = 0, albastru = 50, BRIGHTNESS = 5; byte red, green, blue, umin, zmin, uhour, zhour; byte dsp_ora [32], dsp_th [32], dsp_tot[96]; byte ma[8], sa[8], za[8], uua[8], utmp[8], ztmp[8], stmp[8], ltmp[8], rtmp[8], mtmp[8]; byte dsp[32], dsp_tmp[32]; byte second, minute, hour, dp; byte th0, th1, tsgn, kt=0, k, k_con = 0; byte s0, s1, m0, m1, h0, h1; byte array_disp[256]; float t_read; int xxx; byte addr_DS[8]; //to hold 64-bit ROM Codes of DS18B20 byte data_temperature[9]; //buffer to hold data coming from Scratchpad memory of DS18B20 byte dsRes[] = {0x00, 0x00, 0x7F};//, 0x1F(0 R1 R0 11111)/0x3F/0x5F/0x7F for 9-10-11-12-bit Resolution byte x = 0; // SET resolution of DS18B20 const byte resolution = 9; // 9-10-11-12-bit Resolution // Set LED GPIO const int ledPin1 = LED_BUILTIN; // pin atasat la INT RTC const byte interruptPin = D5; // litere si cifre const byte alfabet [17] [7]= {{126, 255, 195, 195, 255, 126, 0}, //0 { 1, 255, 255, 97, 32, 0, 0}, //1 { 99, 243, 219, 207, 199, 99, 0}, //2 { 102,255, 219, 219, 195, 102, 0}, //3 { 5, 255, 255, 101, 60 ,28, 0}, //4 { 78, 223, 211, 211, 251, 250, 0}, //5 { 78, 223, 211, 211, 255, 126, 0}, //6 {224, 240, 223, 207, 192, 192, 0}, //7 {110, 255, 219, 219, 255, 110, 0}, //8 {126, 255, 203, 203, 251, 114, 0}, //9 { 0, 0, 0, 0, 0, 0, 0}, //blank {102, 102, 0, 0, 0, 0, 0}, //dp {102, 195, 195, 195, 255, 126, 0}, //C {112, 248, 136, 248, 112, 0, 0}, //` {110, 255, 211, 211, 255, 255, 0}, //B { 48, 48, 24, 63, 63, 0, 0}, //r { 24, 24, 24, 0, 0, 0, 0}}; //- // Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val) { return( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return( (val/16*10) + (val%16) ); } byte readEEPROM(int deviceaddress, unsigned int eeaddress ) { byte rdata = 0xFF; Wire.beginTransmission(deviceaddress); Wire.write((int)(eeaddress >> 8)); //writes the MSB Wire.write((int)(eeaddress & 0xFF)); //writes the LSB Wire.endTransmission(); delay(10); Wire.requestFrom(deviceaddress,1); if (Wire.available()) rdata = Wire.read(); return rdata; } // incepe serverul html const char index_html[] PROGMEM = R"rawliteral( <!DOCTYPE HTML><html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>CEAS RGB</title> <style> html { font-family: Arial, Helvetica, sans-serif; display: inline-block; text-align: center; } h1 { font-size: 1.8rem; color: white; } p { font-size: 1.4rem; } .topnav { overflow: hidden; background-color: #034078; } body { margin: 0; } .content { padding: 30px; } .card-grid { max-width: 500px; margin: 0 auto; display: grid; grid-gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } .card { background-color: white; box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); } } .card-title { font-size: 1.2rem; font-weight: bold; color: #034078 } .state { font-size: 1.2rem; color:#1282A2; } .slider { -webkit-appearance: none; margin: 0 auto; width: 90%; height: 15px; border-radius: 10px; background: #C0C0C0; outline: none; } .slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 30px; height: 30px; border-radius: 50 ; background: #034078; cursor: pointer; } .switch { padding-left: 5; } </style> </head> <body> <div class="topnav"> <h1><span style="color:white">CEAS </span><span style="color:#ff3300">R</span><span style="color:#33cc33">G</span><span style="color:#3399ff">B</span></h1> </div> <p> </p> <span class="inlineinput"><input type="number" onchange="update_ora(this)" id="ora" value="%VAL_ORA%" style='display: inline; width: 120px; font-size:4rem ; text-align: center; color:#ff3300;font-weight: bold; box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); class="slider"'/></span> <span style='display: inline; font-size: 4rem ; text-align: center; color:#ff3300 ; font-weight: bold;'>:</span> <span class="inlineinput"> <input type="number" onchange="update_minut(this)" id="minut" value="%VAL_MINUT%" style='display: inline; width: 120px; font-size:4rem ; text-align: center; color:#ff3300; font-weight: bold;box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); class="slider"'/></span> <div class="content"> <div class="card-grid"> <div class="card"> <p class="switch"> <input type="range" onchange="Slider1_change(this)" oninput="updateSlider1(this)" id="Sliderx1" min="0" max="255" value="%SLIDERVALUE1%" step="1" class="slider"></p> <p class="state"><span style='color:#ff0000; font-weight: bold;'>ROSU=<span id="textSlider1Value">%SLIDERVALUE1%</span></p> </div> <div class="card"> <p class="switch"> <input type="range" onchange="Slider2_change(this)" oninput="updateSlider2(this)" id="Sliderx2" min="0" max="255" value="%SLIDERVALUE2%" step="1" class="slider"></p> <p class="state"><span style='color:#33cc33; font-weight: bold;'>VERDE=<span id="textSlider2Value">%SLIDERVALUE2%</span></p> </div> <div class="card"> <p class="switch"> <input type="range" onchange="Slider3_change(this)" oninput="updateSlider3(this)" id="Sliderx3" min="0" max="255" value="%SLIDERVALUE3%" step="1" class="slider"></p> <p class="state"><span style='color:#0000ff; font-weight: bold;'>ALBASTRU=<span id="textSlider3Value">%SLIDERVALUE3%</span></p> </div> <div class="card"> <p class="switch"> <input type="range" onchange="Slider4_change(this)" oninput="updateSlider4(this)" id="Sliderx4" min="1" max="255" value="%SLIDERVALUE4%" step="1" class="slider"></p> <p class="state"><span style='color: #797979; font-weight: bold;'>STRALUCIRE=<span id="textSlider4Value">%SLIDERVALUE4%</span></p> </div> </div> </div> <script> function updateSlider1(element) { var sliderValue1 = document.getElementById("Sliderx1").value; document.getElementById("textSlider1Value").innerHTML = sliderValue1; console.log(sliderValue1); var xhr = new XMLHttpRequest(); xhr.open("GET", "/slider?value1="+sliderValue1, true); xhr.send(); } function Slider1_change(element) { var sliderValue1 = document.getElementById("Sliderx1").value; document.getElementById("textSlider1Value").innerHTML = sliderValue1; console.log(sliderValue1); var xhr = new XMLHttpRequest(); xhr.open("GET", "/slider?value1_change="+sliderValue1, true); xhr.send(); } function updateSlider2(element) { var sliderValue2 = document.getElementById("Sliderx2").value; document.getElementById("textSlider2Value").innerHTML = sliderValue2; console.log(sliderValue2); var xhr = new XMLHttpRequest(); xhr.open("GET", "/slider?value2="+sliderValue2, true); xhr.send(); } function Slider2_change(element) { var sliderValue2 = document.getElementById("Sliderx2").value; document.getElementById("textSlider2Value").innerHTML = sliderValue2; console.log(sliderValue2); var xhr = new XMLHttpRequest(); xhr.open("GET", "/slider?value2_change="+sliderValue2, true); xhr.send(); } function updateSlider3(element) { var sliderValue3 = document.getElementById("Sliderx3").value; document.getElementById("textSlider3Value").innerHTML = sliderValue3; console.log(sliderValue3); var xhr = new XMLHttpRequest(); xhr.open("GET", "/slider?value3="+sliderValue3, true); xhr.send(); } function Slider3_change(element) { var sliderValue3 = document.getElementById("Sliderx3").value; document.getElementById("textSlider3Value").innerHTML = sliderValue3; console.log(sliderValue3); var xhr = new XMLHttpRequest(); xhr.open("GET", "/slider?value3_change="+sliderValue3, true); xhr.send(); } function updateSlider4(element) { var sliderValue4 = document.getElementById("Sliderx4").value; document.getElementById("textSlider4Value").innerHTML = sliderValue4; console.log(sliderValue4); var xhr = new XMLHttpRequest(); xhr.open("GET", "/slider?value4="+sliderValue4, true); xhr.send(); } function Slider4_change(element) { var sliderValue4 = document.getElementById("Sliderx4").value; document.getElementById("textSlider4Value").innerHTML = sliderValue4; console.log(sliderValue4); var xhr = new XMLHttpRequest(); xhr.open("GET", "/slider?value4_change="+sliderValue4, true); xhr.send(); } function update_ora(element) { var ora_new = document.getElementById("ora").value; console.log(ora_new); var xhr = new XMLHttpRequest(); xhr.open("GET", "/slider?value_ora="+ora_new, true); xhr.send(); } function update_minut(element) { var minut_new = document.getElementById("minut").value; console.log(minut_new); var xhr = new XMLHttpRequest(); xhr.open("GET", "/slider?value_minut="+minut_new, true); xhr.send(); } </script> </body> </html> )rawliteral"; // sfarsitul serverului html // Replaces placeholder with button section in your web page String processor(const String& var){ //Serial.println(var); if (var == "SLIDERVALUE1"){ return sliderValue1; } if (var == "SLIDERVALUE2"){ return sliderValue2; } if (var == "SLIDERVALUE3"){ return sliderValue3; } if (var == "SLIDERVALUE4"){ return sliderValue4; } if (var == "VAL_ORA"){ return ora_val; } if (var == "VAL_MINUT"){ return minut_val; } return String(); } void setup(){ // Serial port for debugging purposes Serial.begin(115200); Wire.begin(D2, D1); ds.reset(); ds.search(addr_DS); //collect 64-bit ROM code from sensor (DS1)t switch (resolution) { case 9: dsRes[2] = 0x1F; break; case 10: dsRes[2] = 0x3F; break; case 11: dsRes[2] = 0x5F; break; case 12: dsRes[2] = 0x7F; break; } // init display strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED) strip.show(); // Turn OFF all pixels ASAP strip.setBrightness(BRIGHTNESS); strip.clear(); strip.show(); delay(500); /// Square wave is output on the INT/SQW pin Wire.beginTransmission(DS3231_I2C_ADDRESS); // transmit to DS3231 I2C_ADDRESS = 0x68 Wire.write(byte(0x0E)); // transmit adress memory Wire.write(0); // sends 0 = square output to INT pin Wire.endTransmission(); // stop transmitting //// pinMode(interruptPin, INPUT); pinMode(LED_BUILTIN, OUTPUT); //setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) //setDS3231time(0, 9, 00, 7, 18, 04, 22); sliderValue1 = String(readEEPROM(EEPROM_I2C_ADDRESS, 1)); sliderValue2 = String(readEEPROM(EEPROM_I2C_ADDRESS, 2)); sliderValue3 = String(readEEPROM(EEPROM_I2C_ADDRESS, 3)); sliderValue4 = String(readEEPROM(EEPROM_I2C_ADDRESS, 4)); // Connect to Wi-Fi WiFi.setSleepMode(WIFI_NONE_SLEEP); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi.."); k_con = k_con + 1; Serial.print("WiFi.status() = ");Serial.println(WiFi.status()); Serial.print("WL_CONNECTED = ");Serial.println(WL_CONNECTED); if (k_con == 10) { Serial.println("Fara conexiune la WiFi"); break; } } if (WiFi.status() == WL_CONNECTED) { Serial.print("WiFi.status() = ");Serial.println(WiFi.status()); Serial.print("WL_CONNECTED = ");Serial.println(WL_CONNECTED); send_web_page(); Serial.println("Conectat la WiFi"); } } void conv_temp_without_adress(){ ds.write(0x4E); ds.write_bytes(dsRes, 3); //set resolution bit //---------------------------------------------- ds.reset(); //bring 1-Wire into idle state ds.write(0xCC); //slect with DS-1 with address addr_DS ds.write(0x44); //conversion command } void read_temp_without_adress(){ ds.reset(); ds.write(0xCC); //selectimg the desired DS18B20 ds.write(0xBE); //Function command to read Scratchpad Memory (9Byte) ds.read_bytes(data_temperature, 9); //data comes from DS and are saved into buffer data[8] //------------------------------------------------------------ unsigned int rawTemp = (int)(data_temperature[1] << 4); //upper 4-bit of integer part of temperature byte n = data_temperature[0]; //n = lower 4-bit of integer part and 4-bit fractional part of temperature data_temperature[0] = data_temperature[0] >> 4; //lower 4-bit integer part of temperature rawTemp = rawTemp | (int)data_temperature[0]; //8-bit (including sign bit) integer part of temperature t_read = (float)rawTemp + 0.5 * bitRead(n, 3) + 0.25 * bitRead(n, 2) + 0.125 * bitRead(n, 1) + 0.0625 * bitRead(n, 0); //temp in float format xxx = t_read; if (xxx < 0) { tsgn = 16; xxx = -xxx; } else { tsgn = 10; } th0 = xxx / 10; th1 = xxx % 10; } void send_web_page() { // Print ESP Local IP Address Serial.println(WiFi.localIP()); // Route for root / web page server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", index_html, processor); }); // Send a GET request to <ESP_IP>/slider?value=<inputMessage> server.on("/slider", HTTP_GET, [] (AsyncWebServerRequest *request) { String inputMessageslider1; String inputMessageslider2; String inputMessageslider3; String inputMessageslider4; String inputMessageora; String inputMessageminut; // GET input1 value on <ESP_IP>/slider1?value1=<inputMessageslider1> if (request->hasParam(PARAM_INPUT1)) { inputMessageslider1 = request->getParam(PARAM_INPUT1)->value(); sliderValue1 = inputMessageslider1; } else { inputMessageslider1 = "No message sent"; } if (request->hasParam(PARAM_INPUT1_CHANGE)) { sliderValue1_change = "1"; inputMessageslider1 = request->getParam(PARAM_INPUT1_CHANGE)->value(); sliderValue1_new = inputMessageslider1; } else { inputMessageslider1 = "No message sent"; } // GET input1 value on <ESP_IP>/slider2?value2=<inputMessageslider2> if (request->hasParam(PARAM_INPUT2)) { inputMessageslider2 = request->getParam(PARAM_INPUT2)->value(); sliderValue2 = inputMessageslider2; } else { inputMessageslider2 = "No message sent"; } if (request->hasParam(PARAM_INPUT2_CHANGE)) { sliderValue2_change = "1"; inputMessageslider2 = request->getParam(PARAM_INPUT2_CHANGE)->value(); sliderValue2_new = inputMessageslider2; } else { inputMessageslider2 = "No message sent"; } // GET input1 value on <ESP_IP>/slider3?value3=<inputMessageslider3> if (request->hasParam(PARAM_INPUT3)) { inputMessageslider3 = request->getParam(PARAM_INPUT3)->value(); sliderValue3 = inputMessageslider3; } else { inputMessageslider3 = "No message sent"; } if (request->hasParam(PARAM_INPUT3_CHANGE)) { sliderValue3_change = "1"; inputMessageslider3 = request->getParam(PARAM_INPUT3_CHANGE)->value(); sliderValue3_new = inputMessageslider3; } else { inputMessageslider3 = "No message sent"; } if (request->hasParam(PARAM_INPUT4)) { inputMessageslider4 = request->getParam(PARAM_INPUT4)->value(); sliderValue4 = inputMessageslider4; } else { inputMessageslider4 = "No message sent"; } if (request->hasParam(PARAM_INPUT4_CHANGE)) { sliderValue4_change = "1"; inputMessageslider4 = request->getParam(PARAM_INPUT4_CHANGE)->value(); sliderValue4_new = inputMessageslider4; } else { inputMessageslider4 = "No message sent"; } // GET input1 value on <ESP_IP>/slider4?value4=<inputMessageslider4> if (request->hasParam(PARAM_INPUT_ORA)) { ora_change = "1"; inputMessageora = request->getParam(PARAM_INPUT_ORA)->value(); ora_new = inputMessageora; } else { inputMessageora = "No message sent"; } if (request->hasParam(PARAM_INPUT_MINUT)) { minut_change = "1"; inputMessageminut = request->getParam(PARAM_INPUT_MINUT)->value(); minut_new = inputMessageminut; } else { inputMessageminut = "No message sent"; } request->send(200, "text/plain", "OK"); }); // Start server server.begin(); } void I2Cwrite(byte ID, byte adress, byte value) { Wire.beginTransmission(ID); //select ID device Wire.write(adress); // move pointer to adress address Wire.write(value); // sends value Wire.endTransmission(); } void I2CRead(uint8_t ID, uint8_t adress, byte *xxx) { Wire.beginTransmission(ID); Wire.write(adress); // set DS3231 register pointer to 00h Wire.endTransmission(); Wire.requestFrom((uint8_t) ID, (uint8_t) 1); // request seven bytes of data from DS3231 starting from register 00h *xxx = Wire.read(); } void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) { // sets time and date data to DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set next input to start at the seconds register Wire.write(decToBcd(second)); // set seconds Wire.write(decToBcd(minute)); // set minutes Wire.write(decToBcd(hour)); // set hours Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday) Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31) Wire.write(decToBcd(month)); // set month Wire.write(decToBcd(year)); // set year (0 to 99) Wire.endTransmission(); } void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) { Wire.beginTransmission(deviceaddress); Wire.write((int)(eeaddress >> 8)); //writes the MSB Wire.write((int)(eeaddress & 0xFF)); //writes the LSB Wire.write(data); delay(10); Wire.endTransmission(); delay(10); } void read_RTC() { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set DS3231 register pointer to 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 3); // request seven bytes of data from DS3231 starting from register 00h second = bcdToDec(Wire.read() & 0x7f); s0 = second /10; s1 = second %10; minute = bcdToDec(Wire.read()); m0 = minute/10; m1 = minute %10; hour = bcdToDec(Wire.read() & 0x3f); h0 = hour/10; h1 = hour %10; if (hour <= 9) { ora_val = "0" + String(hour); } else { ora_val = String(hour); } if (minute <= 9) { minut_val = "0" + String(minute); } else { minut_val = String(minute); } } //Prepare hour data void prepare_to_show_hour(byte m, byte s_, byte z_, byte u_i, byte dp1){ for(int i = 0; i <= 31; i++) { dsp_ora [i] = 0; } for(int i=0; i<=2; i++) { if (dp ==1) { dsp_ora [i+14] = alfabet [11] [i]; } else { dsp_ora [i+14] = alfabet [10] [i]; } } for(int i = 0; i <= 5; i++) { dsp_ora [i] = alfabet [u_i] [i]; dsp_ora [i+7] = alfabet [z_] [i]; dsp_ora [i+17] = alfabet [s_] [i]; dsp_ora [i+24] = alfabet [m] [i]; } for(int i = 0; i <= 31; i++) { dsp_tot[i] = dsp_ora [i] ; dsp_tot[i+64] = dsp_ora [i] ; } for(int i=0; i<=255; i++) { // For each pixel in strip... k = i % 16; byte j = i/8; byte k1 = 8*(j+1)-(i % 8) - 1; int bt = bitRead(dsp_ora [j], i%8); array_disp[i] = bt; } } // Prepare Temperature data void prepare_to_show_temp(byte tsgn, byte iz_, byte iu){ for(int i = 0; i <= 31; i++) { dsp_th [i] = 0; } for(int i = 0; i <= 5; i++) { dsp_th [i+1] = alfabet [12] [i]; dsp_th [i+8] = alfabet [13] [i]; dsp_th [i+14] = alfabet [iu] [i]; dsp_th [i+21] = alfabet [iz_] [i]; dsp_th [i+28] = alfabet [tsgn] [i]; } for(int i = 0; i <= 31; i++) { dsp_tot[i+32] = dsp_th [i] ; } for(int i=0; i<=255; i++) { // For each pixel in strip... k = i % 16; byte j = i/8; byte k1 = 8*(j+1)-(i % 8) - 1; int bt = bitRead(dsp_th [j], i%8); array_disp[i] = bt; } } void tranz_display(byte kk) { for(byte i = 0; i <= 31; i++) { dsp_tmp[i] = dsp_tot[i+64 - kk]; } for(int i=0; i<=255; i++) { // For each pixel in strip... k = i % 16; byte j = i/8; byte k1 = 8*(j+1)-(i % 8) - 1; int bt = bitRead(dsp_tmp[j], i%8); array_disp[i] = bt; } } void read_sliders() { rosu = sliderValue1.toInt(); verde = sliderValue2.toInt(); albastru = sliderValue3.toInt(); BRIGHTNESS= sliderValue4.toInt(); } void change_controls(){ if (ora_change.toInt() == 1) { ora_change = "0"; I2Cwrite(DS3231_I2C_ADDRESS, 2, decToBcd(ora_new.toInt())); } if (minut_change.toInt() == 1) { minut_change = "0"; I2Cwrite(DS3231_I2C_ADDRESS, 1, decToBcd(minut_new.toInt())); I2Cwrite(DS3231_I2C_ADDRESS, 0, 0); } if (sliderValue1_change.toInt() == 1) { sliderValue1_change = "0"; writeEEPROM(EEPROM_I2C_ADDRESS, 1, sliderValue1_new.toInt()); } if (sliderValue2_change.toInt() == 1) { sliderValue2_change = "0"; writeEEPROM(EEPROM_I2C_ADDRESS, 2, sliderValue2_new.toInt()); } if (sliderValue3_change.toInt() == 1) { sliderValue3_change = "0"; writeEEPROM(EEPROM_I2C_ADDRESS, 3, sliderValue3_new.toInt()); } if (sliderValue4_change.toInt() == 1) { sliderValue4_change = "0"; writeEEPROM(EEPROM_I2C_ADDRESS, 4, sliderValue4_new.toInt()); } } void show_data(){ read_sliders(); strip.setBrightness(BRIGHTNESS); dp = digitalRead(interruptPin); digitalWrite(LED_BUILTIN, !dp); for(int i=0; i<=255; i++) { // For each pixel in strip... byte k = i % 16; byte j = i/8; byte k1 = 8*(j+1)-(i % 8) - 1; byte bt = array_disp[i]; red = rosu * bt ; green = verde * bt ; blue = albastru * bt ; if (k <=7) { strip.setPixelColor(i, red,green,blue); // Set pixel's color (in RAM) } else { strip.setPixelColor(k1, red,green,blue); // Set pixel's color (in RAM) } } strip.show(); } void show_hour(){ prepare_to_show_hour(h0, h1, m0, m1, dp); prepare_to_show_temp(tsgn, th0, th1); tranz_display(0); show_data(); } void show_hour_to_temp(){ dp = 1; for(int yy = 0; yy <= 32; yy++) { tranz_display(yy); show_data(); delay(40); } } void show_temp(){ tranz_display(32); show_data(); for(int yy = 0; yy <= 300; yy++) { show_data(); delay(1); } } void show_temp_to_hour(){ for(int yy = 0; yy <= 32; yy++) { tranz_display(yy+32); show_data(); delay(40); } } void loop() { if (dp != digitalRead(interruptPin)) { //Serial.println( ESP.getFreeHeap()); kt = kt + 1; if (kt == 28) { kt = 0; } dp = digitalRead(interruptPin); digitalWrite(LED_BUILTIN, !dp); if ((kt % 4) == 0) { conv_temp_without_adress(); } else { if ((kt % 4) == 2) { read_temp_without_adress(); } } } change_controls(); read_RTC(); show_hour(); if (dp == 1) { if ((second == 5) || (second == 25) || (second == 45)) { show_hour_to_temp(); show_temp(); show_temp_to_hour(); } } ws.cleanupClients(); } Editat Aprilie 29, 2022 de Kreator Link spre comentariu
Liviu M Postat Aprilie 29, 2022 Partajează Postat Aprilie 29, 2022 (editat) Din câte am înțeles și eu acum câteva ore din documentația bibliotecii ESP8266WiFi, nu trebuie să faci nimic deosebit, se întâmplă în mod magic: Quote Note: if connection is established, and then lost for some reason, ESP will automatically reconnect to the last used access point once it is again back on-line. This will be done automatically by Wi-Fi library, without any user intervention. Editat Aprilie 29, 2022 de Liviu M Link spre comentariu
Vizitator Postat Aprilie 30, 2022 Partajează Postat Aprilie 30, 2022 Acum 22 ore, Liviu M a spus: Chiar, sunt curios, la scrierea in EEPROM-uri e nevoie sa astepti niste ms. Cum implementezi o functie writeEeprom() fara delay()? Se poate implementa o stiva FIFO si R/W sa se faca asincron. Dar in cazul de fata se putea utiliza biblioteca ESP EEPROM emulation (foloseste memoria flash a ESP pentru a simula un EEPROM). Acum 22 ore, Liviu M a spus: Si restul delay()-urilor din programul initial sunt rezonabile - delay(10), delay(40)... Exista bucle for() cu 32*40 ms (enorm). Link spre comentariu
cimitavita Postat Aprilie 30, 2022 Partajează Postat Aprilie 30, 2022 Este o greșeală să bagi întârzieri la scrierea sau la citirea din eeprom. Înainte de a începe o operație de scriere sau citire eeprom, trebuie verificat dacă eepromul e liber cu ajutorul bitului EECR.EEWE. Pentru citire, dacă eepromul e liber, se încarcă în EEARH și EEARL adresa ce urmează a fi citită. Apoi EECR.EERE se pune pe 1 și în EEDR avem imediat rezultatul citirii. Pentru scriere, dacă eepromul e liber, imediat în EEARH și EEARL se încarcă adresa eeprom, apoi în EEDR se încarcă data de scris după care biții EECR.EEMWE și EECR.EEWE se pun pe 1 în această ordine iar scrierea începe după ce EEWE devine 1. În acest timp programul poate continua cu altceva dacă nu are de făcut încă o scriere în eeprom, caz în care trebuie să aștepte liber de la EECR.EEWE. În timpul scrierii în eeprom este recomandat ca toate întreruperile să fie oprite în special dacă urmează să fie scriși mai mulți octeți la rând. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum