Sari la conținut
ELFORUM - Forumul electronistilor

ESP8266 WiFiManager


Untold

Postări Recomandate

  • 4 luni mai târziu...
  • Răspunsuri 41
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

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

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 de Bandi Szasz
Link spre comentariu

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 de zvonacfirst
Link spre comentariu

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 de Bandi Szasz
Link spre comentariu
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

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 de zvonacfirst
Link spre comentariu
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

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 de zvonacfirst
Link spre comentariu
  • 3 săptămâni mai târziu...

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări