gabitzu2006 Postat Martie 12, 2024 Partajează Postat Martie 12, 2024 Mulțumesc frumos! Link spre comentariu
zvonacfirst Postat Iulie 23, 2024 Partajează Postat Iulie 23, 2024 Va salut. Redeschid acest topic pentru ca ma lovesc de o problema pe care nu stiu sa o rezolv si am nevoie de ajutor. Am in provincie un Wemos cu un server web si cu WiFi Manager pentru modificarea si salvarea credentialelor pentru retea. Reteaua WiFi este a unui vecin, sunt conectat cu acordul lui dar nu am acces la configurarea ei. Problema mea este legata de faptul ca nu reusesc inhibarea pornirii serverului web dupa restart (o pana de curent) daca Wemos-ul nu reuseste sa se conecteze la WiFi (din diferite motive). De ce vreau acest lucru: Wemos-ul este la 100 de km distanta. La un moment dat, probabil ca la o cadere de curent, nu am mai functionat si l-am gasit cu web serverul pornit. A trebuit sa merg pana acolo sa ii fac reset, ceea ce nu este convenabil. Cand am ajuns am constata ca reteaua WiFi era functionala dar probabil ca isi revenise dupa expirarea timeoutului de 30 de secunde pe care il aveam in cod. wifiManager.setConnectTimeout(30); Am incercat sa gasesc o solutie, asa cum vedeti in codul urmator. Am descris ce am reusit si ce nu am reusit sa rezolv, sper sa fie suficient de clar. Bineinteles ca as putea sa ii dau un timeout mai mare in care sa tot incerce sa se conecteze, nu stiu cat de lung trebuie sa fie. Multumesc in avans. /* --------------------------------------------------------------------------------------------- Ce merge: * daca la pornire credentialele NU SUNT salvate in eeprom trebuie sa porneasca serverul web. Cu WiFi Manager sunt introduse credentialele care sunt salvate in eeprom. * daca la pornire credentialele SUNT salvate in eeprom, se incearca conectarea la wifi * dupa ce s-a conectat la wifi, apasarea butonului conectat la pinul D7 duce la stergerea credentialelor salvate în EEPROM si apoi la resetare -> se reia ciclul --------------------------------------------------------------------------------------------- Ce nu am reusit sa fac sa mearga: * conectarea securizata la serverul web cu userul si parola definite * daca la pornire credentialele SUNT salvate in eeprom DAR conectarea la WiFi esueaza -> SERVERUL WEB NU TREBUIE SA PORNEASCA, trebuie sa incerce reconectarea pana cand reuseste --------------------------------------------------------------------------------------------- */ #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <WiFiManager.h> #include <EEPROM.h> // Definirea pinului pentru buton const int buttonPin = 13; // Definirea userului si parolei pentru conectarea la serverul web const char* www_username = "BereRece"; const char* www_password = "****"; // Initializeaza serverul web pe portul 80 ESP8266WebServer server(80); // Functia de autentificare bool is_authenticated() { if (!server.authenticate(www_username, www_password)) { server.requestAuthentication(); return false; } return true; } void handleRoot() { if (!is_authenticated()) { return; } server.send(200, "text/plain", "Welcome, you are authenticated!"); } // Functia pentru stergerea credentialelor si restartarea Wemos D1 Mini void handleReset() { if (digitalRead(buttonPin) == LOW) { Serial.println("Button pressed, resetting WiFi credentials."); WiFiManager wifiManager; wifiManager.resetSettings(); delay(1000); ESP.restart(); } } // Functia de initializare a serverului web void startWebServer() { server.on("/", handleRoot); server.begin(); Serial.println("Web server started."); } void setup() { Serial.begin(115200); // Initializarea pinului pentru buton pinMode(buttonPin, INPUT_PULLUP); // Initializarea EEPROM EEPROM.begin(512); // Verifica daca exista credentiale salvate WiFiManager wifiManager; if (!WiFi.SSID()) { Serial.println("No saved credentials, starting WiFiManager."); wifiManager.autoConnect("WemosAP"); if (WiFi.status() == WL_CONNECTED) { Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); startWebServer(); } } else { Serial.println("Connecting to saved WiFi."); WiFi.begin(); if (WiFi.waitForConnectResult() == WL_CONNECTED) { Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); startWebServer(); } else { Serial.println("Failed to connect to saved WiFi. Starting WiFiManager."); wifiManager.autoConnect("WemosAP"); } } } void loop() { if (WiFi.status() == WL_CONNECTED) { server.handleClient(); handleReset(); // Verifica daca butonul este apasat pentru // resetarea credentialelor si pornirea serverului web } } Link spre comentariu
Bandi Szasz Postat Iulie 23, 2024 Partajează Postat Iulie 23, 2024 (editat) Sa nu stau sa recitesc tot topicul, daca am inteles bine problema ta este faptul ca dupa o pana de curent sau din varii motive cand Wemos porneste si nu se poate conecta la router acesta intra in setup-ul de WiFi Manager si ramane agatat acolo ? Daca da atunci WiFi Manager poate fi setat in mod de "on demand" adica sa porneasca doar la cerere cand se apasa un buton, apoi se poate face o functie temporizata care sa verifice daca este connectat la wifi iar daca nu sa incerce din nou, un fell de auto re-connect pana porneste routerul . Cam asta ai dorii as faci ? Editat Iulie 23, 2024 de Bandi Szasz Link spre comentariu
zvonacfirst Postat Iulie 23, 2024 Partajează Postat Iulie 23, 2024 (editat) Mulțumesc @Bandi Szasz. Nu trebuie recitit tot topicul ci doar ultima mea postare. După o pană de curent, dacă nu se poate conecta la WiFi, chiar daca credențialele sunt scrise in eeprom este pornit serverul web care așteaptă să mă conectez la el pentru a accesa interfața WiFi Manager iar accesarea online devine imposibilă. Așa cum am scris în explicațiile de la începutul codului, eu aș vrea să pornească serverul numai dacă credentialele pentru conectare la WiFi nu au fost salvate anterior în eeprom sau la apăsarea butonului de pe pinul GPIO13. Deci dacă găsește eeprom-ul gol pornește serverul, dacă nu este gol reîncearcă în mod repetat conectarea la WiFi cu credențialele pe care le găsește în eeprom. Editat Iulie 23, 2024 de zvonacfirst Link spre comentariu
Bandi Szasz Postat Iulie 23, 2024 Partajează Postat Iulie 23, 2024 (editat) Bun, in cazul asta: Scoti: wifiManager.autoConnect("WemosAP"); pentru ca el este cel care porneste interfata web wifiManager Mai declari un buton iar cand este apasat apelezi: wifiManager.startConfigPortal("WemosAP"), asta o sa porneasca wifiManager, este modul de "on-demand" porneste doar cand chiar vrei tu sa porneasca. Faci o functie sa zicem "checkWifiConnection" pe care cu ajutorul lui "millis()" il temporizezi la 30-60s si il apelezi din loop, in interiorul lui verifici daca este connectat la WIFI daca nu atunci incerci sa te connectezi din nou in idea in care routerul acum a reusit sa plece: uint32_t timerWIFI = 0; void checkWifiConnection() { if (WiFi.status() != WL_CONNECTED && millis() - timerWIFI > 30000) { WiFi.disconnect(); WiFi.begin(); timerWIFI = millis(); } } Editat Iulie 23, 2024 de Bandi Szasz Link spre comentariu
cloudy Postat Iulie 23, 2024 Partajează Postat Iulie 23, 2024 Sau: wifiManager.setConfigPortalTimeout(secunde); Link spre comentariu
Bandi Szasz Postat Iulie 23, 2024 Partajează Postat Iulie 23, 2024 Acum 2 ore, cloudy a spus: Sau: wifiManager.setConfigPortalTimeout(secunde); Sau asa cu mentiunea ca in felul acesta Wemos va ramane fara WIFI pentru ca dupa ce expira timeout WifiManager elibereaza callstack-ul si va rula programul din loop fara a mai incerca o conexiune catre router Link spre comentariu
zvonacfirst Postat Iulie 23, 2024 Partajează Postat Iulie 23, 2024 (editat) Multumesc tuturor. Rezolvarea se regaseste in codul modificat postat mai jos. Acum functioneaza exact asa cum am exprimat cerintele din postarea mea de mai sus. * daca la pornire credentialele NU SUNT salvate in eeprom porneste serverul web. Cu WiFi Manager sunt introduse credentialele si sunt salvate in eeprom. * daca la pornire credentialele SUNT salvate in eeprom, se incearca conectarea la WiFi * dupa ce s-a conectat la wifi, apasarea butonului conectat la pinul D7 duce la stergerea credentialelor salvate în EEPROM si apoi la resetare -> se reia ciclul * daca la pornire credentialele SUNT salvate in eeprom DAR conectarea la WiFi esueaza -> SERVERUL WEB NU PORNESTE si incearca reconectarea pana cand reuseste Concluzie: * serverul web si interfata WiFi Manager pornesc numai daca: - nu exista credentialele de conectare la WiFi stocate in eeprom (de ex. la prima pornire) - este apasat butonul conectat la pinul D7 (GPIO13). Apasarea butonului duce la stergerea datelor din eeprom si la resetarea Wemos-ului => ciclul se reia Bucla de reconectare care este acum in cod functioneaza practic la infinit, asa ca riscul de a porni interfata WiFi Manager este eliminat. Daca routerul WiFi nu este disponibil cateva zile (apare un blocaj, cum de altfel cred ca s-a intamplat in descrierea mea initiala), la prima revenire a retelei se rezolva si conectarea. #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <WiFiManager.h> #include <EEPROM.h> // Definirea pinului pentru buton const int buttonPin = 13; // Definirea userului si parolei pentru serverul web const char* www_username = "BereRece"; const char* www_password = "****"; // Initializarea serverului web pe portul 80 ESP8266WebServer server(80); // Functia de autentificare bool is_authenticated() { if (!server.authenticate(www_username, www_password)) { server.requestAuthentication(); return false; } return true; } void handleRoot() { if (!is_authenticated()) { return; } server.send(200, "text/plain", "Welcome, you are authenticated!"); } // Functia pentru stergerea credentialelor si resetarea Wemos D1 Mini void handleReset() { if (digitalRead(buttonPin) == LOW) { Serial.println("Button pressed, resetting WiFi credentials."); WiFiManager wifiManager; wifiManager.resetSettings(); delay(1000); ESP.restart(); } } // Functia de initializare a serverului web void startWebServer() { server.on("/", handleRoot); server.begin(); Serial.println("Web server started."); } void setup() { Serial.begin(115200); // Initializarea pinului pentru buton pinMode(buttonPin, INPUT_PULLUP); // Initializarea EEPROM EEPROM.begin(512); // Verificarea daca exista credentiale salvate WiFiManager wifiManager; bool credentialsSaved = WiFi.SSID().length() > 0; // Conditie 1: Daca nu exista credentiale salvate, porneste WiFiManager if (!credentialsSaved) { Serial.println("No saved credentials, starting WiFiManager."); wifiManager.autoConnect("WemosAP"); if (WiFi.status() == WL_CONNECTED) { Serial.println("WiFi connected after configuration."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } startWebServer(); // Porneste serverul web pentru configurare } else { // Condiție 2: Daca exista credentiale, incearca sa se conecteze la WiFi Serial.println("Connecting to saved WiFi."); WiFi.begin(); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); // Verifica daca butonul este apasat pentru resetarea credentialelor if (digitalRead(buttonPin) == LOW) { Serial.println("Button pressed during connection attempt, resetting WiFi credentials."); wifiManager.resetSettings(); delay(1000); ESP.restart(); } } Serial.println("\nWiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } } void loop() { if (WiFi.status() == WL_CONNECTED) { // Daca serverul web este pornit, trateaza cererile server.handleClient(); // Verifica daca butonul este apasat pentru resetarea credentialelor handleReset(); } else { // Daca nu este conectat la WiFi, verifica daca butonul este apasat if (digitalRead(buttonPin) == LOW) { Serial.println("Button pressed, starting web server for configuration."); startWebServer(); } } } Editat Iulie 23, 2024 de zvonacfirst Link spre comentariu
cloudy Postat Iulie 23, 2024 Partajează Postat Iulie 23, 2024 28 minutes ago, zvonacfirst said: * daca la pornire credentialele SUNT salvate in eeprom DAR conectarea la WiFi esueaza -> SERVERUL WEB NU PORNESTE si incearca reconectarea pana cand reuseste * daca la pornire credentialele (ce aiurea sună acest cuvânt !) SUNT salvate in eeprom ... dar au fost schimbate ... credentialele din router ? Link spre comentariu
zvonacfirst Postat Iulie 23, 2024 Partajează Postat Iulie 23, 2024 (editat) Posibil ca vreodată să schimb modalitatea de conectare la net. Poate îmi instalez propriul router sau las un modem mobil la locatie, cine stie? Codul este pregătit să pot modifica credentialele (mie nu-mi suna aiurea, ci foarte cuprinzător, prefer așa în loc de user și parolă) fără să port laptopul cu mine. Apăs un buton și rezolv de pe telefon. Editat Iulie 23, 2024 de zvonacfirst Link spre comentariu
mpopica Postat August 10, 2024 Partajează Postat August 10, 2024 Am scris un program asemănător pt. un coleg. - Are Wi-Fi Manager. se pot introduce acreditările de la doua router-e, - daca pierde semnalul de la unu se reconectează automat la celălalt - daca din diferite motive ESP8266 se deconectează : lipsa tensiune, reset dispozitiv, reset router, etc. la pornire ESP8266 încearcă sa se conecteze la unul din cele doua routere (daca sunt introduse acreditările pt. doua routere ) daca nu reușește intru-n anumit timp pornește Wi-Fi Manager. Releele sunt la GPIO 13, 12, 14, 16, Se poate conecta prin internet de oriunde prin DDNS softul se poate actualiza OTA ( prin internet) se poate conecta display LCD_I2C 1602 la pini GPIO4-SCL, GPIO5-SDA pt afișare ip. rețea DDNS. etc Las aici bin-ul daca vrei sa îl încerci , se încarcă cu "ESP-Flasher-Windows-x86.exe" ESP8266 WiFi Manager are SSID - ProiectPM, password = 1234567890 ip. 192.168.4.1 autentificare WEB username = nik password = florea proiect4relee.bin Link spre comentariu
mpopica Postat August 10, 2024 Partajează Postat August 10, 2024 Aici un proiect realizat cu ESP32 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