WiFi Scanner Funktion in Wifi-Extender

Hallo Comm,
Ich hab folgendes Problem und zwar möchte ich gerne die Funktion:

if (numberOfNetworks <= 0)
  {
    numberOfNetworks = WiFi.scanNetworks();
    Serial.print(numberOfNetworks);
    Serial.println(F(" gefundene Netzwerke"));
  }
  else if (millis() - lastAusgabe > intervall)
  {
    numberOfNetworks--;
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Network-name: ");
    display.setCursor(0, 10);
    display.print(WiFi.SSID(numberOfNetworks));
    display.setCursor(0, 20);
    display.print("Signal strength: ");
    display.setCursor(0, 30);
    display.print(WiFi.RSSI(numberOfNetworks));
    display.display();
    Serial.print("Network name: ");
    Serial.println(WiFi.SSID(numberOfNetworks));
    Serial.print("Signal strength: ");
    Serial.println(WiFi.RSSI(numberOfNetworks));
    Serial.println("-----------------------");
    lastAusgabe = millis();
  }

Gerne im Webapge Bereich:

server.on("/oledscan", []() {
      server.send(200, "text/plain", "oledscan started");

      


    });

Einfügen, leider funktioniert die Obere Funktion nur im void loop() {}
Bereich.

Das hier hab ich mir zurechtgebastelt, leider ohne funktion.

#if LWIP_FEATURES && !LWIP_IPV6

  #define HAVE_NETDUMP 0

  #include <ESP8266WiFi.h>
  #include <ESP8266WebServer.h>
  #include <lwip/napt.h>
  #include <lwip/dns.h>
  #include <LwipDhcpServer.h>
  #include <SPI.h>
  #include <Wire.h>
  #include <Adafruit_GFX.h>
  #include <Adafruit_SSD1306.h>

  #define NAPT 1000
  #define NAPT_PORT 10

  #if HAVE_NETDUMP

  #include <NetDump.h>

  #define SCREEN_WIDTH 128
  #define SCREEN_HEIGHT 64
  #define OLED_RESET     -1
  #define SCREEN_ADDR 0x3C

  Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);





  void dump(int netif_idx, const char* data, size_t len, int out, int success) {
  (void)success;
    Serial.print(out ? F("out ") : F(" in "));
    Serial.printf("%d ", netif_idx);

    // optional filter example: if (netDump_is_ARP(data))
  {
      netDump(Serial, data, len);
      //netDumpHex(Serial, data, len);
  }
  }
  #endif

  // MY FUNCTIONS
  bool testwifi() {
    Serial.printf("\nTesting connection with '%s'\n", WiFi.SSID().c_str());
    int count = 0;
    digitalWrite(2,LOW);
    while (count < 20) {
      if (WiFi.status() == WL_CONNECTED) {
        Serial.printf("\nWiFi Connected! \nSTA: %s (dns: %s / %s)\n\n",
                      WiFi.localIP().toString().c_str(),
                      WiFi.dnsIP(0).toString().c_str(),
                      WiFi.dnsIP(1).toString().c_str());

        // give DNS servers to AP side
        dhcpSoftAP.dhcps_set_dns(0, WiFi.dnsIP(0));
        dhcpSoftAP.dhcps_set_dns(1, WiFi.dnsIP(1));
        digitalWrite(2,HIGH);
        return true;
    }
      Serial.print(".");
      delay(1000);
      count++;
  }
    Serial.printf("\nCan't connect to WiFi, connect to AP '%s' and configure...\n\n", WiFi.softAPSSID());
    return false;
  }

  // SERVER
  ESP8266WebServer server(80);
  String content;
  String networks[40];

  void serverconfig() {
    server.begin();
    int n = WiFi.scanNetworks();

    content = "<!DOCTYPE html><html lang='en'><meta name='viewport' content='width=device-width, initial-scale=1.0'>";
    content += "<head><title>ESP8266 Configuration Page</title></head>";
    content += "<body>";

    if (WiFi.status() != WL_CONNECTED) {
      content += "<div>currently not connected</div>";
  }
    else {
      content += "<div>connected to: ";
      content += WiFi.SSID();
      content += " IP: ";
      content += WiFi.localIP().toString();
      content += "</div>";
  }

    content += "<div>";

    if (n == 0) {
      content += "<h1>No wireless networks found</h1>";
  }

    else {
      content += "<h1>Wireless Station Settings</h1>";
      content += "<form method='post'>";
      for (int i = 0; i < n; ++i) {
        networks[i] = WiFi.SSID(i);
        content += "<div>";
        content += "<input type=\"radio\" id=\"";
        content += String(i);
        content += "\" ";
        content += "name=\"SSIDs\" value=\"";
        content += String(i);
        content += "\">";
        content += "<label for=\"";
        content += String(i);
        content += "\"";
        content += ">";
        content += String(i + 1);
        content += ": ";
        content += WiFi.SSID(i);
        content += " (";
        content += String(WiFi.RSSI(i));
        content += ")";
        content += (WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*";
        content += "</label>";
        content += "</div>";
        delay(10);
    }
      content += "<label>Password:</label><br><input type='password' placeholder='********' name='stapsk' minlength=8 maxlength=63><br><small>Must be at least 8 characters or blank!</small><br><br>";
      content += "<button type='submit' formaction='stasettings'>Save Permanently</button><button type='submit' formaction='tempstasettings'>Save Temporarily (Until Reboot)</button>";
      content += "</form>";
      content += "<h1>Wireless Access Point Settings</h1>";
      content += "<form method='post'>";
      content += "<label>SSID:</label><br><input name='apssid' placeholder='";
      content += WiFi.softAPSSID();
      content += "' length=32><br>";
      content += "<label>Password:</label><br><input type='password' placeholder='";
      content += WiFi.softAPPSK();
      content += "' name='appsk' minlength=8 maxlength=63><br><small>Must be at least 8 characters or blank!</small><br><br>";
      content += "<button type='submit' formaction='apsettings'>Save Permanently</button><button type='submit' formaction='tempapsettings'>Save Temporarily (Until Reboot)</button>";
      content += "<button type='submit' formaction='oledscan'>Scan</button>";
      content += "</form>";
  }

    content += "<h1>Miscellaneous</h1>";
    content += "<form method='get' action='reboot'><input type='submit' value='Reboot'></form>";
    content += "<div>";



    server.on("/", []() {
      server.send(200, "text/html", content);
  });

    server.onNotFound([]() {
      server.send(404, "text/plain", "How the heck did you get here?");
  });

    server.on("/stasettings", []() {
      String temp = server.arg("SSIDs");
      int number = temp.toInt();
      String stassid = networks[number];
      String stapsk = server.arg("stapsk");
      if (stassid.length() > 0) {
        server.send(200, "text/plain", "Settings Recieved");
        Serial.printf("\n\nAttempting to connect to '%s' using password '%s' \n", stassid.c_str(), stapsk.c_str());
        WiFi.persistent(true);
        WiFi.begin(stassid, stapsk);
        testwifi();
    }
  });

    server.on("/oledscan", []() {
      server.send(200, "text/plain", "oledscan started");
      #include "ESP8266WiFi.h"
      #define SCREEN_WIDTH 128
      #define SCREEN_HEIGHT 64
      #define OLED_RESET     -1
      #define SCREEN_ADDR 0x3C

      Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
      int numberOfNetworks;
      unsigned long lastAusgabe;
      const unsigned long intervall = 5000;
      if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDR))
      {
        Serial.println(F("SSD1306 allocation failed"));
        for (;;);
      }
      display.display();
      delay(2000);
      display.clearDisplay();
      display.display();
      display.setTextSize(1);
      display.setCursor(0,0);
      display.setTextColor(WHITE);
      display.print("Test");
      display.display();
      delay(3000);
      display.clearDisplay();
      display.display();
      if (numberOfNetworks <= 0)
      {
        numberOfNetworks = WiFi.scanNetworks();
        Serial.print(numberOfNetworks);
        Serial.println(F(" gefundene Netzwerke"));
      }
      else if (millis() - lastAusgabe > intervall)
      {
        numberOfNetworks--;
        display.clearDisplay();
        display.setCursor(0, 0);
        display.print("Network-name: ");
        display.setCursor(0, 10);
        display.print(WiFi.SSID(numberOfNetworks));
        display.setCursor(0, 20);
        display.print("Signal strength: ");
        display.setCursor(0, 30);
        display.print(WiFi.RSSI(numberOfNetworks));
        display.display();
        Serial.print("Network name: ");
        Serial.println(WiFi.SSID(numberOfNetworks));
        Serial.print("Signal strength: ");
        Serial.println(WiFi.RSSI(numberOfNetworks));
        Serial.println("-----------------------");
        lastAusgabe = millis();
      }






    });
    server.on("/tempstasettings", []() {
      String temp = server.arg("SSIDs");
      int number = temp.toInt();
      String stassid = networks[number];
      String stapsk = server.arg("stapsk");
      if (stassid.length() > 0) {
        server.send(200, "text/plain", "Settings Recieved");
        Serial.printf("\n\nAttempting to connect to '%s' using password '%s' \n", stassid.c_str(), stapsk.c_str());
        WiFi.persistent(false);
        WiFi.begin(stassid, stapsk);
        testwifi();
    }
  });

    server.on("/apsettings", []() {
      String apssid = server.arg("apssid");
      String appsk = server.arg("appsk");
      if (apssid.length() > 0) {
        server.send(200, "text/plain", "Settings Recieved");
        Serial.printf("\n\nSetting AP Credentials \nSSID: %s \nPassword: %s \n", apssid.c_str(), appsk.c_str());
        WiFi.persistent(true);
        WiFi.softAP(apssid, appsk);
    }
  });

    server.on("/tempapsettings", []() {
      String apssid = server.arg("apssid");
      String appsk = server.arg("appsk");
      if (apssid.length() > 0) {
        server.send(200, "text/plain", "Settings Recieved");
        Serial.printf("\n\nSetting Temporary AP Credentials \nSSID: %s \nPassword: %s \n", apssid.c_str(), appsk.c_str());
        WiFi.persistent(false);
        WiFi.softAP(apssid, appsk);
    }
  });

    server.on("/reboot", []() {
      server.send(200, "text/plain", "Rebooting now...");
      delay(5000);
      ESP.reset();
  });
  }

  #define SCREEN_WIDTH 128
  #define SCREEN_HEIGHT 64
  #define OLED_RESET     -1
  #define SCREEN_ADDR 0x3C




  Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
  int numberOfNetworks;
  unsigned long lastAusgabe;
  const unsigned long intervall = 5000;

  void setup() {
    Serial.begin(115200);
    pinMode(2, OUTPUT);
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(500);
    digitalWrite(LED_BUILTIN, HIGH);
    delay(500);
    digitalWrite(LED_BUILTIN, LOW);
    Serial.begin(115200);
    Serial.println("ConsoleLog<>> started.");
    if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDR))
    {
      Serial.println(F("SSD1306 allocation failed"));
      for (;;);
    }
    display.display();
    delay(2000);
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println("Starting...");
    display.display();

    delay(1000);
    Serial.printf("\n\nNAPT Range extender\n");
    Serial.printf("Heap on start: %d\n", ESP.getFreeHeap());

  #if HAVE_NETDUMP
    phy_capture = dump;
  #endif

    WiFi.setPhyMode(WIFI_PHY_MODE_11N); // Set radio type to N
    WiFi.mode(WIFI_AP_STA);
    WiFi.persistent(false);
    WiFi.begin(); // Use stored credentials to connect to network
    testwifi();
    WiFi.softAPConfig(  // Set IP Address, Gateway and Subnet
      IPAddress(192, 168, 4, 1),
      IPAddress(192, 168, 4, 1),
      IPAddress(255, 255, 255, 0));
    WiFi.softAP("BlackLeakz-Repeater", "12345678"); // Use stored credentials to create AP
//WiFi.softAPSSID(), WiFi.softAPPSK()
    Serial.printf("Heap before: %d\n", ESP.getFreeHeap());
    err_t ret = ip_napt_init(NAPT, NAPT_PORT);
    Serial.printf("ip_napt_init(%d,%d): ret=%d (OK=%d)\n", NAPT, NAPT_PORT, (int)ret, (int)ERR_OK);
    if (ret == ERR_OK) {
      ret = ip_napt_enable_no(SOFTAP_IF, 1);
      Serial.printf("ip_napt_enable_no(SOFTAP_IF): ret=%d (OK=%d)\n", (int)ret, (int)ERR_OK);
      if (ret == ERR_OK) {
        Serial.printf("\nWiFi Network '%s' with Passowrd '%s' and IP '%s' is now setup\n", WiFi.softAPSSID(), WiFi.softAPPSK().c_str(), WiFi.softAPIP().toString().c_str());
    }
  }
    Serial.printf("Heap after napt init: %d\n", ESP.getFreeHeap());
    if (ret != ERR_OK) {
      Serial.printf("NAPT initialization failed\n");
  }

    serverconfig();
  }

  #else

  void setup() {
    Serial.begin(115200);
    Serial.printf("\n\nNAPT not supported in this configuration\n");
  }

  #endif



  void loop() {
    server.handleClient();
    if (WiFi.status() != WL_CONNECTED) {
      digitalWrite(2, LOW);
      delay(1000);
      digitalWrite(2, HIGH);
      delay(1000);
  }
    else {
      digitalWrite(2, HIGH);
  }
 }

Wäre dankbar für eine Berichtigung/Belehrung.

Mfg blackleakz2

In loop wird der Schnipsel immer wieder aufgerufen und listet dank der (vermutlich) globalen Variablen numberOfNetworks nacheinander alle Netzwerke auf.

In deinem "hab ich mir zurechtgebastelt" ist numberOfNetworks eine lokale Variable
mit undefiniertem Wert.

Anonyme Funktionen ("Lambdas")
{ ... }
mag ich generell nicht, auch wenn insbesondere Java-Fans das ganz schick finden. (Mein Eindruck)
Darin #include Anweisungen und Objekte wie dein Adafruit_SSD1306 display zu verstecken, kann eigentlich nur Probleme geben, schätze ich. Aber das kann auch Geschmacksfrage sein, keine Ahnung.

Da ich keinen ESP8266 habe, halte ich mich eigentlich bei solchen Themen lieber zurück. Ich teste mit einem ESP32:

#include <WebServer.h>
#include <ArduinoOTA.h>  // Programm hochladen Over The Air, siehe IDE Werkzeuge/Port
WebServer server(80);

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

  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.begin(STA_SSID, STA_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  ArduinoOTA.begin();  // OTA starten

  server.on("/scanner", handleScanner);
  server.begin();  // Webserver starten
  Serial.println("HTTP Server gestartet\n\n");
}

void loop()
{
  ArduinoOTA.handle();    // OTA abhandeln
  server.handleClient();  // Anfragen an den Server abhandeln
}

void handleScanner()
{
  String content;
  Serial.println("scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0) {
    Serial.println("no networks found");
    content += "no networks found";
  } else {
    Serial.print(n);
    Serial.println(" networks found");
    content += String(n) + String(" networks found\n");
    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");
      content += String(i + 1) + String(": ") + String(WiFi.SSID(i)) + String(" (") + String(WiFi.RSSI(i)) + String(")\n") ;
      delay(10);
    }
  }
  Serial.println("");
  server.send(200, "text/plain", content);
}

Angezeigt wird meine eigene Fritz!Box und ein zweiter Access Point:

grafik

Serieller Monitor:

.
WiFi connected
IP address: 192.168.178.22
HTTP Server gestartet


scan start
scan done
2 networks found
1: FRITZ!Box 7590 UN (-38)
2: WLAN-18081938 (-94)*

Ist nicht hübsch, aber so geht es.

Bekommst Du das in Dein Programm eingebaut?

Ist da schon eingebaut für die Webpage, brauche das ganze fürs Oled display, dortlief die Methode mit : int n = WiFi.scanNetworks(); nicht.. daher hat mir ein Nutzer des Forums diese Variante für mein Oled display gebastelt. :

i`f (numberOfNetworks <= 0)
  {
    numberOfNetworks = WiFi.scanNetworks();
    Serial.print(numberOfNetworks);
    Serial.println(F(" gefundene Netzwerke"));
  }
  else if (millis() - lastAusgabe > intervall)
  {
    numberOfNetworks--;
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Network-name: ");
    display.setCursor(0, 10);
    display.print(WiFi.SSID(numberOfNetworks));
    display.setCursor(0, 20);
    display.print("Signal strength: ");
    display.setCursor(0, 30);
    display.print(WiFi.RSSI(numberOfNetworks));
    display.display();
    Serial.print("Network name: ");
    Serial.println(WiFi.SSID(numberOfNetworks));
    Serial.print("Signal strength: ");
    Serial.println(WiFi.RSSI(numberOfNetworks));
    Serial.println("-----------------------");
    lastAusgabe = millis();
  }

nur leider funktioniert die nur im loop, keine ahnung wie ich die Funktion schreiben muss um das mit nem html button zu assoziieren

Ach die kenn ich doch :wink:

Du willst jetzt nen Button haben, auf den Du drückst, der dann einen Frame mit den Daten füllt?

1 Like

So siehts aus. :smiley: Funktioniert irgendwie nur, wenn ich das ganze im loop amlaufen habe

Bin mir nicht sicher, ob ich das verstehe, einen Vorschlag habe ich dennoch, getestet mit ESP32:

#include <WebServer.h>
#include <ArduinoOTA.h>  // Programm hochladen Over The Air, siehe IDE Werkzeuge/Port
WebServer server(80);

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     -1
#define SCREEN_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int numberOfNetworks;

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

  WiFi.mode(WIFI_STA);
  WiFi.begin(STA_SSID, STA_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDR))
  {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.clearDisplay();
  display.setCursor(0, 0);
  display.print("OLED bereit");
  display.setCursor(0, 10);
  display.print("IP ");
  display.print(WiFi.localIP());
  display.display();

  ArduinoOTA.begin();  // OTA starten

  server.on("/scanner", handleScanner);
  server.begin();  // Webserver starten
  Serial.println("HTTP Server gestartet\n\n");
}

void loop()
{
  ArduinoOTA.handle();    // OTA abhandeln
  server.handleClient();  // Anfragen an den Server abhandeln
  lcdAnzeige();
}

void handleScanner()
{
  String content;
  Serial.println("scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  numberOfNetworks = n;  // für OLED-Anzeige
  Serial.println("scan done");
  if (n == 0) {
    Serial.println("no networks found");
    content += "no networks found";
  } else {
    Serial.print(n);
    Serial.println(" networks found");
    content = "<!DOCTYPE html><html lang='en'><meta name='viewport' content='width=device-width, initial-scale=1.0'>";
    content += "<head><title>ESP8266 Configuration Page</title></head>";
    content += "<body>";
    content += "<form method='post'><p><button type='submit' formaction='scanner'>Scan</button></p>\n<p>";
    content += String(n) + String(" networks found\n");
    content += "</p></form>";

    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");
      content += String("<p>") + String(i + 1) + String(": ") + String(WiFi.SSID(i)) + String(" (") + String(WiFi.RSSI(i)) + String(")</p>\n") ;
      delay(10);
    }
  }
  Serial.println("");
  content += "</body></html>";
  server.send(200, "text/html", content);
}

void lcdAnzeige()
{
  static unsigned long lastAusgabe;
  const unsigned long intervall = 5000;

  if ( (numberOfNetworks > 0) && (millis() - lastAusgabe > intervall) )
  {
    lastAusgabe = millis();
    numberOfNetworks--;
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Network-name: ");
    display.setCursor(0, 10);
    display.print(WiFi.SSID(numberOfNetworks));
    display.setCursor(0, 20);
    display.print("Signal strength: ");
    display.setCursor(0, 30);
    display.print(WiFi.RSSI(numberOfNetworks));
    display.setCursor(0, 40);
    display.display();
  }
}

Im Browser http://192.168.178.22/scanner:

grafik

Serieller Monitor:

.
WiFi connected
IP address: 192.168.178.22
HTTP Server gestartet


scan start
scan done
2 networks found
1: FRITZ!Box 7590 UN (-33)*
2: WLAN-18081938 (-92)*

Hilft Dir das?

Deswegen ist das bei mir in einer Schleife.

1 Like

Probiere das ganze morgen mal aus!" Lösung bekommste dann verliehen, danke euch allen /Y(

Dadurch läuft der Scann durchgehend im loop, oder?
Würde die Funktion lcdAnzeige() am liebste so für 20 Durchlaüfe â delay(3500) laufen lassen. Habe das hier jetzt bisher am laufen, was die Scan-Funktion fürs Oled display leider nur einmal durchlaufen lässt.

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     -1
#define SCREEN_ADDR 0x3C

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int numberOfNetworks;
unsigned long lastAusgabe;
const unsigned long intervall = 5000;

const char *ssid = "WLAN-LHHZN5";
const char *password = "";




//Specifying the Webserver instance to connect with HTTP Port: 80
ESP8266WebServer server(80);




String HTML()
{
  String msg="<!DOCTYPE html> <html>\n";
  msg+="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  msg+="<title>BlackLeakz Control</title>\n";
  msg+="<style>html{font-family:Helvetica; display:inline-block; margin:0px auto; text-align:center;}\n";
  msg+="body{margin-top: 50px; background-color: #838383; color: #00FF83;} h1{color: #00FF83; margin: 50px auto 30px;} h3{color:#00FF83; margin-bottom: 50px;}\n";
  msg+=".button{display:block; width:80px; background-color:#3B3B3B; border:none; color: #00FF83; padding: 13px 30px; text-decoration:none; font-size:25px; margin: 0px auto 35px; cursor:pointer; border-radius:4px;}\n";
  msg+=".button-on{background-color:#202020;}\n";
  msg+=".button-on:active{background-color:#202020;}\n";
  msg+=".button-off{background-color:#202020;}\n";
  msg+=".button-off:active{background-color:#202020;}\n";
  msg+="</style>\n";
  msg+="</head>\n";
  msg+="<body>\n";
  msg+="<h1>ESP8266 Web Server</h1>\n";
  msg+="<h3>Using Station (STA) Mode</h3>\n";
  msg+="<p>Scanner</p><a class=\"button button-on\" href=\"/scan\">Scan</a>\n";
  msg+="<p>LED Control</p><a class=\"button button-on\" href=\"/ledon\">ON</a>\n";
  msg+="<p>LED Control</p><a class=\"button button-off\" href=\"/ledoff\">OFF</a>\n";



  msg+="</body>\n";
  msg+="</html>\n";
  return msg;
}

void defaultdisp() {
  delay(1000);
  display.clearDisplay();
  display.display();
  display.setCursor(0,0);
  display.print("Your SSID: ");
  display.display();
  display.setCursor(0,10);
  display.print(ssid);
  display.display();
  display.setCursor(0,20);
  display.print("Your password: ");
  display.display();
  display.setCursor(0,30);
  display.print(password);
  display.display();
  display.setCursor(0,40);
  display.print("IP address<>>: ");
  display.display();
  display.setCursor(0,50);
  IPAddress IP = WiFi.localIP();
  display.print(IP);
  display.display();
}

void lcdanzeige() {
  if (numberOfNetworks <= 0)
  {
    numberOfNetworks = WiFi.scanNetworks();
    Serial.print(numberOfNetworks);
    Serial.println(F(" gefundene Netzwerke"));
  }
  else if (millis() - lastAusgabe > intervall)
  {
    numberOfNetworks--;
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Network-name: ");
    display.setCursor(0, 10);
    display.print(WiFi.SSID(numberOfNetworks));
    display.setCursor(0, 20);
    display.print("Signal strength: ");
    display.setCursor(0, 30);
    display.print(WiFi.RSSI(numberOfNetworks));
    display.display();
    Serial.print("Network name: ");
    Serial.println(WiFi.SSID(numberOfNetworks));
    Serial.print("Signal strength: ");
    Serial.println(WiFi.RSSI(numberOfNetworks));
    Serial.println("-----------------------");
    lastAusgabe = millis();
  }
}


void handle_OnConnect()
{
  Serial.println("ConsoleLog<>> Client connected.");
  display.clearDisplay();
  display.display();
  display.setCursor(0,0);
  display.print("Client connected. ");
  display.display();
  server.send(200, "text/html", HTML());
  delay(2000);
  defaultdisp();
}

void handle_ledon()
{
  Serial.println("ConsoleLog<>> LED ON.");
  display.clearDisplay();
  display.display();
  display.setCursor(0,0);
  display.print("Set LED ON");
  display.display();
  digitalWrite(LED_BUILTIN, LOW);
  server.send(200, "text/html", HTML());
  delay(3000);
  defaultdisp();
}

void handle_ledoff()
{
  Serial.println("ConsoleLog<>> LED Off.");
  display.clearDisplay();
  display.display();
  display.setCursor(0,0);
  display.print("Set LED Off");
  display.display();
  digitalWrite(LED_BUILTIN, HIGH);
  server.send(200, "text/html", HTML());
  delay(3000);
  defaultdisp();
}

void handle_scan()
{   
    display.clearDisplay();
    display.display();
    display.setCursor(0,0);
    display.print("Scanning");
    display.display();
    Serial.println("SCAN");
    delay(2000);
    display.clearDisplay();
    display.display();
    
    lcdanzeige();
     
    server.send(200, "text/html", HTML());
    delay(3000);
    defaultdisp();
    
}

void handle_NotFound()
{
  server.send(404, "text/plain", "Not found");
}



void setup() {
  //Starting the serial communication channel
  Serial.begin(115200);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.print(ssid);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  
  Serial.println("ConsoleLog<>> started.");
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDR))
  {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.display();
  delay(2000);
  display.clearDisplay();
  display.display();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Starting...");
  display.display();
  delay(3000);
  display.clearDisplay();
  display.display();




  //Connecting to the local WiFi network
  WiFi.begin(ssid ,password);

  //Keep checking the WiFi status until it is connected to the wifi network

  while(WiFi.status()!=WL_CONNECTED)
  {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi Connected with IP Address: ");
  Serial.println(WiFi.localIP());
  display.setCursor(0,0);
  display.print("IP address<>>: ");
  display.display();
  display.setCursor(0,10);
  IPAddress IP = WiFi.localIP();
  display.print(IP);
  display.display();

  //Specifying the functions which will be executed upon corresponding GET request from the client
  server.on("/",handle_OnConnect);
  server.on("/ledon",handle_ledon);
  server.on("/ledoff",handle_ledoff);
  server.on("/scan",handle_scan);
  server.onNotFound(handle_NotFound);

  //Starting the Server
  server.begin();
  Serial.println("HTTP Server Started");
}

void loop() {
  lcdanzeige();

  if(WiFi.status()==WL_CONNECTED)//Check if ESP8266 is still connected to the internet
  {
    //Assign the server to handle the clients
    server.handleClient();


  }

    //Keep checking the WiFi status until it is connected to the wifi network
    while(WiFi.status()!=WL_CONNECTED)
    {
      delay(1000);
      Serial.print(".");
    }
    Serial.println("");
    Serial.print("WiFi Connected with IP Address: ");
    Serial.println(WiFi.localIP());
}

Und am aller liebsten hätte ich das ganze im Soft-AP Modus, hab versucht das ganze umzuschreiben, lief auch ohne Fehler-Ausgabe, bloß leider wurde nur der Access Point nach meinen Angaben erstellt, aber bekam kein zugriff auf die Webpage.

Du solltest Deine Zugangsdaten zu Hause jetzt ändern.
Und nein, das jetzt im Sketch hier zu ändern bringt es nicht, da das als editiert stehen bleibt.
Löschen geht, aber der Sketch bleibt dann trotzdem 24 Stunden sichtbar.

Keine Chance.
Fürs nächste Mal kannst Du Dich an dem Sketch von @agmue in Anleitung: ESPUI webbasierte Oberfläche für ESP32 und ESP8266 orientieren. (zweiter Code) dann passiert sowas nicht.

Alles klar.

Was willst du am Ende wenn dein Projekt fertig ist für eine Funktionalität haben?

Das solltest du

als erstes

genau und mit normalen Worten beschreiben.
Ich habe null Bock diese Funktionalität aus deinem Programmtext herauszulesen.
Du weiß genau was du als Funktionalität haben willst. Deshalb ist das für dich ganz einfach zu beschreiben.

Also mach das mal. Aber ausführlich! Besonders schnell kurz schreiben wird im Endeffekt besonders laaangsaam weil es zig nachfragen gibt.

vgs

Ich möchte einen WebServer im Soft-Access-Point-Modus mit einem Button, welcher für einen Zyklus von 20 zu einer Zeit je Zyklus von 3500, einen WlFi-Scan durchführt.

Also gut.
Spielen wir das Nachfragen / kurze Antworten Ping-Pong-Spiel
mal sehen wie viel Runden wir brauchen bis alle Details beschrieben wurden.

Also du möchtest einen ESP8266 als Webserver im Soft-Access-Point-Modus mit einem Button haben.

Der Button dient dazu folgendes zu machen:

Wenn der Button gedrückt wurde dann 20 mal folgendes wiederholen
1.
WiFi-Scan durchführen
3,5 Sekunden warten

WiFi-Scan durchführen
3,5 Sekunden warten

WiFi-Scan durchführen
3,5 Sekunden warten
.....
20.
WiFi-Scan durchführen
3,5 Sekunden warten

Und das OLED-Display gratuliert während dessen zum Geburtstag oder was macht das OLED-Display?

Wozu ist der Webserver gut? Soll der Webserver Putin "Beende den Krieg" Emails senden?"

Das Display, soll natürlich das Resultat, des WiFi-Scans darstellen.Der WebServer, soll eine Webpage zur Verfügung stellen mit einem Button, der WiFi-Scan gennant werden soll und halt das Resultat, ans Oled-Display sendet.

So Code mit 1 Button der den WiFi-Scan startet. Alle 3,5 Sekunden den WiFi-Scan wiederholt
und die gefundenen APs auf dem seriellen Monitor ausgibt läuft.

Den Code gibt es aber nicht am Stück sondern nur Stückweise gegen posten von Fragen zum ESPUI-Democode.
Also nimm dir einen ESPUI-Code lese den Code bis die erste Frage auftaucht und dann poste die Frage.

vgs

Die Frage ist, welches Ergebnis. Jeden Scan oder nur den ersten/letzten? Bei 20x 3,5 sek warten wirst Du kaum Zeit haben alles zu lesen.

Nein, nur wenn man auf "Scan" klickt, wird handleScanner gestartet.

Macht einen Scan, getestet mit ESP32:

#include <WebServer.h>
#include <ArduinoOTA.h>  // Programm hochladen Over The Air, siehe IDE Werkzeuge/Port
WebServer server(80);

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET     -1
#define SCREEN_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int numberOfNetworks;

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

  WiFi.mode(WIFI_AP);
  if (WiFi.softAP(AP_SSID, AP_PASSWORD)) {
    Serial.printf("Verbinde dich mit dem Netzwerk \"%s\"\nGib die IP %s im Browser ein\n\n", AP_SSID, WiFi.softAPIP().toString().c_str());
    Serial.println("Mac Adresse des AP = " + WiFi.softAPmacAddress());
    Serial.println("Broadcast IP des AP = " + WiFi.softAPBroadcastIP().toString());
  } else {
    Serial.println(F("Fehler beim Erstellen."));
    for (;;);
  }

  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDR))
  {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.clearDisplay();
  display.setCursor(0, 0);
  display.print("OLED bereit");
  display.setCursor(0, 10);
  display.print("IP ");
  display.print(WiFi.localIP());
  display.display();

  ArduinoOTA.begin();  // OTA starten

  server.on("/scanner", handleScanner);
  server.begin();  // Webserver starten
  Serial.println("HTTP Server gestartet\n\n");
}

void loop()
{
  ArduinoOTA.handle();    // OTA abhandeln
  server.handleClient();  // Anfragen an den Server abhandeln
  lcdAnzeige();
}

void handleScanner()
{
  String content;
  Serial.println("scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  numberOfNetworks = n;  // für OLED-Anzeige
  Serial.println("scan done");
  if (n == 0) {
    Serial.println("no networks found");
    content += "no networks found";
  } else {
    Serial.print(n);
    Serial.println(" networks found");
    content = "<!DOCTYPE html><html lang='en'><meta name='viewport' content='width=device-width, initial-scale=1.0'>";
    content += "<head><title>ESP8266 Configuration Page</title></head>";
    content += "<body>";
    content += "<form method='post'><p><button type='submit' formaction='scanner'>Scan</button></p>\n<p>";
    content += String(n) + String(" networks found\n");
    content += "</p></form>";

    for (int i = 0; i < n; ++i) {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");
      content += String("<p>") + String(i + 1) + String(": ") + String(WiFi.SSID(i)) + String(" (") + String(WiFi.RSSI(i)) + String(")</p>\n") ;
      delay(10);
    }
  }
  Serial.println("");
  content += "</body></html>";
  server.send(200, "text/html", content);
}

void lcdAnzeige()
{
  static unsigned long lastAusgabe;
  const unsigned long intervall = 5000;

  if ( (numberOfNetworks > 0) && (millis() - lastAusgabe > intervall) )
  {
    lastAusgabe = millis();
    numberOfNetworks--;
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print("Network-name: ");
    display.setCursor(0, 10);
    display.print(WiFi.SSID(numberOfNetworks));
    display.setCursor(0, 20);
    display.print("Signal strength: ");
    display.setCursor(0, 30);
    display.print(WiFi.RSSI(numberOfNetworks));
    display.setCursor(0, 40);
    display.display();
  }
}

Anzeige serieller Monitor:

Verbinde dich mit dem Netzwerk "Esp32AP"
Gib die IP 192.168.4.1 im Browser ein

Mac Adresse des AP = F0:08:D1:D2:4B:C5
Broadcast IP des AP = 192.168.4.255
HTTP Server gestartet


scan start
scan done
1 networks found
1: FRITZ!Box 7590 UN (-24)*

Webbrowser:
grafik

OLED:
grafik

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.