ESP8266 WLAN und Passwort abfragen

Hallo,

ich bin bzgl. ESP8266 Module noch sehr unerfahren.

Habe ein Modul ESP-01. Ich möchte damit gerne einen DHT22 Sensor auslesen und diese Werte grafisch auf einem Webserver darstellen. Zudem soll das Modul dann über die IP per Handy, PC usw ansprechbar sein.

Nun habe ich folgende Fragen:

  1. Habt ihr gute Links, wo man sich einiges anlesen kann?

  2. Ich möchte gerne, wenn das Modul zum ersten mal gestartet wird und noch kein Eintrag vorhanden ist, eine Art Abfrage bekommen, welches Wlan ich nutzen möchte und auch eine Passwortabfrage. Ich möchte keine festen Wlannetze und Passwörter vergeben. Wie kann ich das umsetzen? Wäre das im Browser möglich? Wenn ja wie?

  3. Wie gehe ich damit um, wenn sich die SSID und PW ändert? Nach 10 Fehlversuche erneute Eingabe mit Speicherung dieser Daten?

  4. Wie kann ich die Daten dann später am besten speichern und grafisch darstellen? Gibt es dafür Tools?

Hoffe ihr habt gute Idee, Tipps.

Danke

Nun habe ich folgende Fragen:

  1. Habt ihr gute Links, wo man sich einiges anlesen kann?
    -> Google und im ESP Forum

  2. Ich möchte gerne, wenn das Modul zum ersten mal gestartet wird und noch kein Eintrag vorhanden ist, eine Art Abfrage bekommen, welches Wlan ich nutzen möchte und auch eine Passwortabfrage. Ich möchte keine festen Wlannetze und Passwörter vergeben. Wie kann ich das umsetzen? Wäre das im Browser möglich? Wenn ja wie?
    ->Wie soll das gehen? Wenn du keine Verbindung über WLAN hast, kannst du doch auch nichts einstellen! Ich hab keine Ahnung, ob der ESP im Auslieferungszustand einen WLAN-Knoten aufmacht. Beim YUN ging das.

  3. Wie gehe ich damit um, wenn sich die SSID und PW ändert? Nach 10 Fehlversuche erneute Eingabe mit Speicherung dieser Daten?
    -> Das liegt an dir. Würde nach 3 Fehlversuchen nur nach erneuter Anforderung (zB Button) wieder einen Verbindungsaufbau zulassen.

  4. Wie kann ich die Daten dann später am besten speichern und grafisch darstellen? Gibt es dafür Tools?
    Ja gibts. Kommt aber darauf an, was du wohin speicherst. SQL und PHP würde sich da auf einem lokalen Webserver anbieten (-> Raspberry)

Ein guter Einstieg in Dein Projekt ist hier; klick
Damit hab ich auch begonnen. Da hier aber nur ein Sensor ausgewertet wurde und die Daten nicht dauerhaft abgespeichert werden, hab ich dann aufgerüstet. Mittlerweile hab ich bisher drei separate ESP8266 mit DHT22-Sensor, die alle 15 Minuten ihre Messwerte in eine MySQL-Datenbank auf einem Raspberry schicken. An der grafischen Auswertung per Web-Interface arbeite ich gerade. Das ist aber nicht besonders problematisch, nur eine Fleißarbeit, die allerdings keinen rechten Spaß bereitet :confused: .
Deine Fragen unter 2) und 3) kann ich nicht so recht einordnen! Hast Du bei Dir wechselnde WLAN's, oder willst Du Deinen Sensor mobil durch die Gegend tragen? Beides scheint mir etwas sonderbar ...
Dennoch frohes Schaffen.

Gruß eMeS

Hallo,

zu 2) habe ich letzte Woche selber rumgesucht und dieses Projekt gefunden. Ich habe mich aber noch nicht näher damit beschäftigt.

Hallo,

nein habe kein wechselndes WLAN.

Möchte gerne einen Freund eine kleine Schaltung bauen und habe keine Lust, dass wenn er mal die SSID oder Password ändert ich immer neu flashen muss. Ggf könnte man diese Schaltung ja später auch verkaufen. Dann sollte es einstellbar sein.

Habe ein Beispiel gefunden, wo ich zuerst über AP mich zum Modul verbinde und dann dort mein WLAN mit Password auswählen kann.

Danach ist der ESP dann über meine vergebene IP im Router aufrufbar.

Das ist das was ich suche. Das Problem ist nun dass diese Datei nur als Bin Datei vorliegt und ich somit nicht den Quellcode habe.

Habe einen Raspberry Pi den ich dann als Server/Speicher nutzen kann.

Wichtig ist mir nur,dass meine Daten auch lokal bei mir bleiben.

Machbar ist das alles, und wenn man es in einzelne Schritte zerlegt, auch nicht sooo kompliziert.

Daher die Gretchenfrage: Wieviel Ahnung hast du?

Zu #1 und #4:

Zu #2 und #3:

ha64:
Zu #2 und #3:
tzapu.com/esp8266-wifi-connection-manager-library-arduino-ide/

Wie geil ist das denn??
Hast ein paar Karmas verdient für den Link.

Es gibt wohl nichts, was noch nicht erfunden wurde :slight_smile:

Hab es nicht ganz kapiert. Was macht der besser?

tzapu.com/esp8266-wifi-connection-manager-library-arduino-ide/

Besser wie was/wer?

@stoni99: Eventuell besser als smart config?

Oder das hier:
www.john-lassen.de/index.php/projects/esp-8266-arduino-ide-webconfig

... müsste man mal ausprobieren ...

Ich hab den wifi connection manager kurz angetestet. Einfach einzubinden, professioneller Look.
Und mein iPhone macht nach dem verbinden sofort die Anmeldeseite auf.

Na ich meine:

So wie ich das verstanden habe kann ich die WIFI Anmeldung per ESP generierter Webseite machen.

Kann ich doch auch gleich im code machen "WiFi.begin(ssid, password);"!?

ElEspanol:
Besser wie was/wer?

stoni99:
Kann ich doch auch gleich im code machen "WiFi.begin(ssid, password);"!?

Laut intensos Anfrage sollte aber erst zur Laufzeit password und ssid angeben werden. D.h. Beim Ersten Aufruf wird das Netz ausgewählt, ssid/pw eingegeben und im eeprom abgespeichert. Beim nächsten mal werden die gespeicherten Verbindungsdaten verwendet - kommt keine Verbindung zustande, können die Parameter entsprechend abgeändert werden...

Genau. Ist der AP nicht erreichbar, z.B. nach einem Passwortwechsel, macht der ESP einen auf AP und man kann die Netze scannen und eines auswählen, dann das neue Passwort rein, und fertig. Das bleibt gespeichtert.

Ich hab mal den Thesen Webserver erweitert, so dass man die Zugangsdaten auch über die Webseite löschen kann, um das ganze besser zu veranschaulichen:

/*--------------------------------------------------
HTTP 1.1 Webserver as AccessPoint for ESP8266 
for ESP8266 adapted Arduino IDE

by Stefan Thesen 08/2015 - free for anyone

Does HTTP 1.1 with defined connection closing.
Handles empty requests in a defined manner.
Handle requests for non-exisiting pages correctly.

This demo allows to switch two functions:
Function 1 creates serial output and toggels GPIO2
Function 2 just creates serial output.

Serial output can e.g. be used to steer an attached
Arduino, Raspberry etc.
--------------------------------------------------


Modifiziert mit dem https://github.com/tzapu/WiFiManager

Man muss nach dem Wifi Zugangsdaten loeschen über die Webseite den Resetknopf am ESP drücken

*/
#include <ESP8266WiFi.h>

//needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>         //https://github.com/tzapu/WiFiManager


#include <Wire.h>
#include <LiquidCrystal_I2C.h>


const byte ledPin = 0;

unsigned long ulReqcount;
unsigned long ulReconncount;


// Create an instance of the server on Port 80
WiFiServer server(80);
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C 2004 address

void setup()
{
  Serial.begin(115200);
  WiFiManager wifiManager;

  wifiManager.autoConnect("ESP_Steckdose1");
  Serial.println("connected...yeey :)");

  Wire.begin();   //   SDA an D2 (GPIO 4),  entspricht SCL an D1(GPIO 5)
  lcd.begin(20, 4);              // initialize the lcd

  //  ulReqcount = 0;
  //  ulReconncount = 0;

  // prepare GPIO2
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, 0);

  server.begin();
  Serial.println("Server started");
  lcd.setCursor ( 0, 0 );
  lcd.print("Server started");
  // Print the IP address
  Serial.println(WiFi.localIP());
  lcd.setCursor ( 0, 1 );
  lcd.print(WiFi.localIP());
}


void loop()
{

  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client)
  {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  lcd.setCursor ( 0, 0 );
  lcd.print("new client          ");
  unsigned long ultimeout = millis() + 250;
  while (!client.available() && (millis() < ultimeout) )
  {
    delay(1);
  }
  if (millis() > ultimeout)
  {
    Serial.println("client connection time-out!");
    lcd.setCursor ( 0, 0 );
    lcd.print("connection time-out!");
    return;
  }

  // Read the first line of the request
  String sRequest = client.readStringUntil('\r');
  //Serial.println(sRequest);
  client.flush();

  // stop client, if request is empty
  if (sRequest == "")
  {
    Serial.println("empty request! - stopping client");
    client.stop();
    lcd.setCursor ( 0, 0 );
    lcd.print("empty request!      ");
    return;
  }

  // get path; end of path is either space or ?
  // Syntax is e.g. GET /?pin=MOTOR1STOP HTTP/1.1
  String sPath = "", sParam = "", sCmd = "";
  String sGetstart = "GET ";
  int iStart, iEndSpace, iEndQuest;
  iStart = sRequest.indexOf(sGetstart);
  if (iStart >= 0)
  {
    iStart += +sGetstart.length();
    iEndSpace = sRequest.indexOf(" ", iStart);
    iEndQuest = sRequest.indexOf("?", iStart);

    // are there parameters?
    if (iEndSpace > 0)
    {
      if (iEndQuest > 0)
      {
        // there are parameters
        sPath  = sRequest.substring(iStart, iEndQuest);
        sParam = sRequest.substring(iEndQuest, iEndSpace);
      }
      else
      {
        // NO parameters
        sPath  = sRequest.substring(iStart, iEndSpace);
      }
    }
  }

  ///////////////////////////////////////////////////////////////////////////////
  // output parameters to serial, you may connect e.g. an Arduino and react on it
  ///////////////////////////////////////////////////////////////////////////////
  if (sParam.length() > 0)
  {
    int iEqu = sParam.indexOf("=");
    if (iEqu >= 0)
    {
      sCmd = sParam.substring(iEqu + 1, sParam.length());
      Serial.println(sCmd);
      lcd.setCursor ( 0, 1 );
      lcd.print("                    ");
      lcd.setCursor ( 0, 1 );
      lcd.print(sCmd);
    }


  }


  ///////////////////////////
  // format the html response
  ///////////////////////////
  String sResponse, sHeader;

  ////////////////////////////
  // 404 for non-matching path
  ////////////////////////////
  if (sPath != "/")
  {
    sResponse = "<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>";

    sHeader  = "HTTP/1.1 404 Not found\r\n";
    sHeader += "Content-Length: ";
    sHeader += sResponse.length();
    sHeader += "\r\n";
    sHeader += "Content-Type: text/html\r\n";
    sHeader += "Connection: close\r\n";
    sHeader += "\r\n";
  }
  ///////////////////////
  // format the html page
  ///////////////////////
  else
  {
    ulReqcount++;
    sResponse  = "<html><head><title>Demo f&uumlr ESP8266 Steuerung</title> </head><body>";
    sResponse += "<font color=\"#000000\"><body bgcolor=\"#d0d0f0\">";
    sResponse += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">";
    sResponse += "<h1>Demo f&uumlr ESP8266 Steuerung</h1>";
    sResponse += "Funktion 1 schaltet GPIO2 und erzeugt eine serielle Ausgabe.
";
    sResponse += "Funktion 2 erzeugt nur eine serielle Ausgabe.
";
    sResponse += "<FONT SIZE=+1>";
    sResponse += "<p>Funktion 1 <a href=\"?pin=FUNCTION1ON\"><button>einschalten</button></a>&nbsp;<a href=\"?pin=FUNCTION1OFF\"><button>ausschalten</button></a></p>";
    sResponse += "<p>Funktion 2 <a href=\"?pin=FUNCTION2ON\"><button>einschalten</button></a>&nbsp;<a href=\"?pin=FUNCTION2OFF\"><button>ausschalten</button></a></p>";
    sResponse += "<p>Funktion 2 <a href=\"?pin=reset\"><button>Wifi Zugangsdaten loeschen</button></a></p>";

    //////////////////////
    // react on parameters
    //////////////////////
    if (sCmd.length() > 0)
    {
      // write received command to html page
      sResponse += "Kommando:" + sCmd + "
";

      // switch GPIO
      if (sCmd.indexOf("FUNCTION1ON") >= 0)
      {
        digitalWrite(ledPin, 1);
        lcd.setCursor ( 0, 1 );
        lcd.print("                    ");
        lcd.setCursor ( 0, 1 );
        lcd.print("FUNCTION1ON");
      }
      else if (sCmd.indexOf("FUNCTION1OFF") >= 0)
      {
        digitalWrite(ledPin, 0);
        lcd.setCursor ( 0, 1 );
        lcd.print("                    ");
        lcd.setCursor ( 0, 1 );
        lcd.print("FUNCTION1OFF");
      }
      else if (sCmd.indexOf("reset") >= 0)
      {
        digitalWrite(ledPin, 0);
        lcd.setCursor ( 0, 1 );
        lcd.print("                    ");
        lcd.setCursor ( 0, 1 );
        lcd.print("Reset ausgefuehrt!");
          WiFiManager wifiManager;
        wifiManager.resetSettings();
      }

    }

    sResponse += "<FONT SIZE=-2>";
    sResponse += "
Aufrufz&auml;hler=";
    sResponse += ulReqcount;
    sResponse += " - Verbindungsz&auml;hler=";
    sResponse += ulReconncount;
    sResponse += "
";
    sResponse += "Stefan Thesen 04/2015
";
    sResponse += "</body></html>";

    sHeader  = "HTTP/1.1 200 OK\r\n";
    sHeader += "Content-Length: ";
    sHeader += sResponse.length();
    sHeader += "\r\n";
    sHeader += "Content-Type: text/html\r\n";
    sHeader += "Connection: close\r\n";
    sHeader += "\r\n";
  }

  // Send the response to the client
  client.print(sHeader);
  client.print(sResponse);

  // and stop the client
  client.stop();
  sResponse = "Aufrufe=";
  sResponse += ulReqcount;

  Serial.println("Client disonnected");
  lcd.setCursor ( 0, 0 );
  lcd.print("Client disonnected");
  lcd.setCursor ( 0, 3 );
  lcd.print(sResponse);
  sResponse = "Verbindung=";
  sResponse += ulReconncount;
  lcd.setCursor ( 0, 2 );
  lcd.print(sResponse);
}