Mikro­con­trol­ler im AP-Modus vernetzen

Ser­ver

// ESP32
#include "WiFi.h"
#include "WebServer.h"

// ESP8266
// #include "ESP8266WebServer.h"

#include "DHT.h"

// Pin des DHT-Sensors
int SENSOR_DHT = 19;

// Sensortyp festlegen
// DHT22 oder DHT11
#define SensorTyp DHT22

DHT dht(SENSOR_DHT, SensorTyp);

// Netzwerkname und Passwort des ESP
char Router[] = "ESPServer";
char Passwort[] = "espserver";

// ESP32
WebServer Server(80);

// ESP8266
// ESP8266WebServer Server(80);

// farbige Box mit CSS
String Seitenkopf =
  "<head><style>"
  ".farbigeBox {"
  "background-color: ivory;"
  "color: black;"
  "width: 450px;"
  "padding: 20px;"
  "text-align: left;"
  "font-size: 40px;"
  "font-family: arial;"
  "}"
  "</style>"

  // refresh -> Seite automatisch aktualisieren
  "<meta http-equiv=\"refresh\" content=\"30\"></head>";

// Wartezeit für die sichere Übermittlung der Daten
unsigned long Wartezeit = 5000;

// enthält die Daten des 2. ESPs
String Messung;

// IP-Adresse des 2. ESP
const char* host = "192.168.4.2";

// Konfiguration als Server
IPAddress ip(192, 168, 4, 1);
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);

void setup() 
{
  Serial.begin(9600);
  
  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);

  // ESP als Access-Point (AP) konfigurieren
  WiFi.softAPConfig(ip, gateway, subnet);

  // Access-Point starten
  WiFi.softAP(Router, Passwort);
   
  // SSID des Routers anzeigen
  Serial.println();
  Serial.print("Verbunden mit ");
  Serial.println(WiFi.softAPSSID());

  Serial.print("IP-Adresse: ");
  Serial.println(WiFi.softAPIP());

  // Webserver starten
  // / -> Aufruf der URL, SeiteBauen -> Aufruf der Funktion
  Server.begin();
  Server.on("/", SeiteBauen);

  dht.begin();
}

void loop() 
{
  static unsigned long Startzeit = millis();

  // auf Anfragen warten
  Server.handleClient();

  // Messdaten einsammeln
  if ((millis() - Startzeit) > Wartezeit)
  {
    // Daten des 2. ESPs einsammeln
    DatenHolen();
    
    Startzeit = millis();
  }
}


void SeiteBauen()
{
  // Seite "zusammenbauen"
  String Seite = "";
  Seite += Seitenkopf;
  Seite += "<h1>Messdaten</h1>";
  Seite += "<hr>";
  
  /*
    Messung enthält die mit / gtrennten Daten
    String Messung mit substring am / trennen
    Temperatur: von Position 0 bis zum / (indexOf))
    Luftfeuchtigkeit von /+1 bis zur Länge des Strings
  */
  String TemperaturKlient = Messung.substring(0, Messung.indexOf("/"));
  String LuftfeuchtigkeitKlient = Messung.substring(Messung.indexOf("/") + 1, Messung.length());
  
  Seite += "<h2>Daten vom Klienten ...</h2>";
  Seite += "<div class=\"farbigeBox\">";
  Seite += "Temperatur: ";
  Seite += TemperaturKlient;
  Seite += "<br>";
  Seite += "Luftfeuchtigkeit: ";
  Seite += LuftfeuchtigkeitKlient;
  Seite += "<br>";
  Seite += "</div>";

  // Messwerte ermitteln
  // . durch , ersetzen
  String TemperaturServer = String(dht.readTemperature());
  TemperaturServer.replace(".", ",");
  
  String LuftfeuchtigkeitServer = String(dht.readHumidity());
  LuftfeuchtigkeitServer.replace(".", ",");
  
  Seite += "<h2>Daten vom Server ...</h2>";
  Seite += "<div class=\"farbigeBox\">";
  Seite += "Temperatur: ";
  Seite += TemperaturServer + "&degC";
  Seite += "<br>";
  Seite += "Luftfeuchtigkeit: ";
  Seite += LuftfeuchtigkeitServer + "%";
  Seite += "</div>";

  // Button aktualisieren
  Seite += "<hr><input style=\"font-size:16pt; font-weight:bold;";
  Seite += "background-color:#55A96B;";
  Seite += "display:block; cursor:pointer;\"type=\"button\"";

  // IP für den Button aktualisieren (location.href)
  // muss mit dem Wert für IPAdress übereinstimmen (. statt ,)
  Seite += " onClick=\"location.href='http://192.168.4.1'\" value=\"aktualisieren\">";
  Seite += "<hr>";

  // Seite anzeigen
  Server.send(200, "text/html", Seite);
}

void DatenHolen()
{
  WiFiClient client;

  // wenn Klient erfolgreich verbunden wurde
  // wenn nicht return -> neuer Versuch
  if (!client.connect(host, 80)) return;
  
  /*
    GET-Anfrage senden
    /Messung -> Adresse (URL) für die zu übermittelnden Werte
    wird von den Klienten festgelegt
    host -> IP-Adresse des 2. ESPs
    HTTP/1.1 -> Abfrageprotokoll
    \r\n -> return mit anschließender neuer Zeile
  */
  client.print(String("GET ") + "/Messung" + " HTTP/1.1\r\n" + host + "\r\n");
  unsigned long LetzteZeit = millis();

  // Wartezeit 
  while (!client.available() && ((millis() - LetzteZeit) < 3000))
  {
    delay(1);
  }  

  // der Klient ist verfügbar
  while (client.available()) 
  {
    // den mit GET erhaltenen String bis zum return (\r) lesen
    String Daten = client.readStringUntil('\r');

    // wenn Daten vorhanden sind
    // Messung enthält die vom 2. ESP übermittelten Daten
    if(Daten != "")
    {
      Messung = Daten;
      Serial.println(Daten);
    }
  }
}

Kli­ent

// ESP32
#include "WiFi.h"
#include "WebServer.h"

// ESP8266
// #include "ESP8266WebServer.h"

#include "DHT.h"

// Pin des DHT-Sensors
int SENSOR_DHT = 19;

#define SensorTyp DHT22

// Sensor DHT einen Namen zuweisen
DHT dht(SENSOR_DHT, SensorTyp);

// ESP als AP
char Router[] = "ESPServer";
char Passwort[] = "espserver";

// IP des 2. ESPs
IPAddress ip(192, 168, 4, 2);
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);

// ESP32
WebServer Server(80);

// ESP8266
// ESP8266WebServer Server(80);

void setup() 
{
  // WiFi starten
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(Router, Passwort);

  // Adresse (URL)festlegen (/Messung)
  // SeiteBauen -> zu übermittelnde Daten
  Server.on("/Messung", SeiteBauen);
  Server.begin();
  Serial.begin(9600);
  
  // DHT starten
  dht.begin();
}

void loop() 
{
  // auf Anfragen warten
  Server.handleClient();
}

void SeiteBauen() 
{
  String Seite ="";

  // Messwerte ermitteln
  // . durch , ersetzen
  String Temperatur = String(dht.readTemperature());
  Temperatur.replace(".", ",");
  
  String Luftfeuchtigkeit = String(dht.readHumidity());
  Luftfeuchtigkeit.replace(".", ",");
  
  // Seite zusammenbauen
  // / Trennzeichen
  Seite = Temperatur + "&degC/";
  Seite += Luftfeuchtigkeit + "%";

  // Seite übermitteln
  Server.send(200, "text/html", Seite);
}

Letzte Aktualisierung: Nov 3, 2024 @ 11:51