Skocz do zawartości

ESP8266 - strona do wprowadzania własnych ustawień WiFi


Bullseye

Pomocna odpowiedź

PlatformIO

Nabazgrałem sobie kod, dość prosty. Staram się połączyć z siecią WiFi, jeśli się nie uda to odpala się w trybie AP gdzie przez WWW mogę wprowadzić swoje dane i zapisać. Po kliknięciu zapisz, ESP się restartuje (kod restartu):
 

ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3460, room 16 
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4
tail 4
chksum 0xc9
csum 0xc9
v00051560
~ld

 

Wstając wypisuje w serial monitorze poprawne dane ale z siecią się nie łączy i znowu tworzy AP. Po restarcie guzikiem przestaje pokazywać dane zapisane tak jakby nie umieścił ich w pliku.
Pomożecie i nakierujecie co robię nie tak ? Kod poniżej:

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <LittleFS.h>

#dane do AP
String ssidbac = "Tryb AP";
String passbac = "12345678";

#dane do zapisanej sieci WiFi
String ssid = "";
String password = "";
const char* fsFilename = "wifi.txt";

ESP8266WebServer server(80);

void setup() {

  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  readWifiCredentials();
  WiFi.begin(ssid, password);
  int counter = 0;
  
  while (WiFi.status() != WL_CONNECTED && counter < 40) {
    delay(250);
    ESP.wdtFeed();
    Serial.println("Laczenie...");
    counter++;
    Serial.print("SSID: ");
    Serial.println(ssid);
    Serial.print("PASS: ");
    Serial.println(password);
  }
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Tworze AP...");
    WiFi.mode(WIFI_AP);
    WiFi.softAP(ssidbac, passbac);
    LittleFS.begin();
    LittleFS.format();

    startWebServer();
    Serial.println("AP Wystartowalo!");
  } else {
    Serial.println("Laczenie z WiFi");
    Serial.println("IP address: ");
    startWebServer();
    Serial.println("Wlasciwa WWW dziala!");
    Serial.println(WiFi.localIP());

  }
}

void loop() {
  server.handleClient();
}

void readWifiCredentials() {
  if (LittleFS.begin()) {
    if (LittleFS.exists(fsFilename)) {
      File file = LittleFS.open(fsFilename, "r");
      if (file) {
        ssid = file.readStringUntil('\n').c_str();
        password = file.readStringUntil('\n').c_str();
        file.close();
      }
    }
  }
}

void writeWifiCredentials(String ssid, String password) {
  if (LittleFS.begin()) {
    File file = LittleFS.open(fsFilename, "w");
    ESP.wdtFeed();
      file.println(ssid);
      file.println(password);
      file.close();
  }
}

void handleRoot() {
  String html = "<html><body>";
  html += "<h1>ESP8266 WiFi Credentials</h1>";
  html += "<form action='/set' method='post'>";
  html += "SSID: <input type='text' name='ssid' value='" + String(ssid) + "'><br>";
  html += "PASSWORD: <input type='text' name='password' value='" + String(password) + "'><br>";
  html += "<input type='submit' value='Save'>";
  html += "</form>";
  html += "</body></html>";
  server.send(200, "text/html", html);
}

void handleSet() {
  if (server.hasArg("ssid") && server.hasArg("password")) {
    writeWifiCredentials(server.arg("ssid"), server.arg("password"));
    ESP.restart();
  }
}

void startWebServer() {
  server.on("/", handleRoot);
  server.on("/set", handleSet);
  server.begin();
}

 

Edytowano przez Bullseye
Link do komentarza
Share on other sites

Po co w pierwszym while watch dog? Uprość całość, bez sensu jest w pętli wywoływać nazwę sieci i tą całą resztę. Najpierw sprawdź czy zadziała tobie połączenie z kodem jak poniżej. Jak zadziała to rozwijaj to dalej, zamiast komplikować prostą pętlę.

WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
	delay(1000);
    Serial.print(".");
}

 

Link do komentarza
Share on other sites

Nic dziwnego - po wyjściu z readWifiCredentials() zmienne ssid i password wskazują na jakiś randomowy obszar w pamięci - c_str() nie tworzy kopii napisu!

Albo zdeklaruj je globalnie jako String, czyli coś w stylu:

String ssid, password;
...
ssid=file.readStringUntil('\n');

albo użyj jakichś statycznych buforów czy ręcznie zallokuj pamięć, coś jak:

char *ssid, *password;
...
ssid=strdup(file.readStringUntil('\n').c_str());

Ogólnie kłaniają się podstawy C++ (zasięg zmiennych i takie tam).

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Tylko zauwaz ze w monitorze mam poprawne dane wyswietlane juz po odczycie z panieci - i to mnie mylilo.

PS. Zmienne mam zadeklarowane globalnie, zerknij w kodzie na poczatku 😞

sprawdze jak zadziala z twoimi poprawkami, dzieki za pomoc.

podpowiesz co powinienem doczytac zeby nie popelniac dalej takich gaf?

Edytowano przez Bullseye
Link do komentarza
Share on other sites

Tak na szybko: sprawdź jeszcze czy nie zapałętał się tam jakiś nadmiarowy '\r', np.:

printf("<%s>\r\n", ssid.c_str());

(printf doskonale działa w ESP8266, nie trzeba się bawić w fafnaście Serial.print())

Link do komentarza
Share on other sites

7 godzin temu, kostuch napisał:

A po co po połączeniu z siecią formatujesz fs?

Poza tym wygodniej używać na esp wifimulti zamiast wifi (ale to już tzw kwestia religii)

Bo skoro sie nie polaczyl to znaczy ze sa zle dane w pliku wifi i wprowadzam nowe.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.