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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.