#include <LiquidCrystal.h>
#include <WiFi.h>
#include <WebServer.h>
#include <Preferences.h>
#include "DHT.h"
// RS, E, D4, D5, D6, D7
LiquidCrystal lcd(D0, D1, D2, D3, D4, D5);
// DHT22
#define DHTPIN D10
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// ---------------- WLAN / Webserver ----------------
WebServer server(80);
Preferences prefs;
String savedSsid;
String savedPass;
const char* apName = "Sensor-Setup";
const char* apPass = "sssSSS123+++"; // mindestens 8 Zeichen oder leer für offen
bool dhtOk = false;
float startupTemp = NAN;
float startupHum = NAN;
// ---------------- Hilfsfunktionen ----------------
void lcdLine(const char* line1, const char* line2 = "") {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
}
bool ReadDHTStartup()
{
startupHum = dht.readHumidity();
startupTemp = dht.readTemperature();
lcd.setCursor(0, 1);
if (isnan(startupHum) || isnan(startupTemp)) {
Serial.println("DHT22 nicht lesbar oder Fehler");
lcd.print("Sensorfehler ");
dhtOk = false;
} else {
Serial.println("DHT22 ok");
lcd.print("Temp: ");
lcd.print(startupTemp, 1);
lcd.print((char)223);
lcd.print("C ");
dhtOk = true;
}
return dhtOk;
}
bool loadWiFiCredentials() {
prefs.begin("wifi", true);
savedSsid = prefs.getString("ssid", "");
savedPass = prefs.getString("pass", "");
prefs.end();
return savedSsid.length() > 0;
}
void saveWiFiCredentials(const String& ssid, const String& pass) {
prefs.begin("wifi", false);
prefs.putString("ssid", ssid);
prefs.putString("pass", pass);
prefs.end();
}
bool connectToWiFi(const String& ssid, const String& pass) {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid.c_str(), pass.c_str());
lcdLine("Verbinde WLAN", ssid.c_str());
Serial.print("Verbinde mit: ");
Serial.println(ssid);
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED && millis() - start < 15000) {
delay(500);
Serial.print(".");
}
Serial.println();
if (WiFi.status() == WL_CONNECTED) {
Serial.println("WLAN verbunden");
Serial.println(WiFi.localIP());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WLAN verbunden");
lcd.setCursor(0, 1);
lcd.print(WiFi.localIP());
return true;
}
Serial.println("WLAN fehlgeschlagen");
lcdLine("WLAN Fehler", "Starte AP...");
return false;
}
String htmlPage() {
String page;
page += "<!DOCTYPE html><html><head><meta charset='utf-8'>";
page += "<meta name='viewport' content='width=device-width,initial-scale=1'>";
page += "<title>WLAN Setup</title></head><body>";
page += "<h2>XIAO WLAN Setup</h2>";
page += "<form action='/save' method='post'>";
page += "SSID:<br><input name='ssid'><br><br>";
page += "Passwort:<br><input name='pass' type='password'><br><br>";
page += "<button type='submit'>Speichern</button>";
page += "</form>";
page += "</body></html>";
return page;
}
void handleRoot() {
server.send(200, "text/html", htmlPage());
}
void handleSave() {
if (!server.hasArg("ssid")) {
server.send(400, "text/plain", "SSID fehlt");
return;
}
String ssid = server.arg("ssid");
String pass = server.arg("pass");
saveWiFiCredentials(ssid, pass);
server.send(200, "text/html",
"<html><body><h3>Gespeichert</h3><p>Neustart...</p></body></html>");
lcdLine("WLAN gespeichert", "Neustart...");
delay(1500);
ESP.restart();
}
void startAccessPoint() {
WiFi.mode(WIFI_AP);
WiFi.softAP(apName, apPass);
IPAddress ip = WiFi.softAPIP();
server.on("/", handleRoot);
server.on("/save", HTTP_POST, handleSave);
server.begin();
Serial.println("AP gestartet");
Serial.print("AP IP: ");
Serial.println(ip);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Setup AP aktiv");
lcd.setCursor(0, 1);
lcd.print(ip);
}
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hallo XIAO C6");
lcd.setCursor(0, 1);
lcd.print("Starte DHT22...");
dht.begin();
delay(2000);
ReadDHTStartup();
delay(2000);
lcd.setCursor(0, 0);
if (dhtOk) {
lcd.print("WLAN startet...");
} else {
lcd.print("DHT Fehler");
}
// Hier WLAN-Logik
bool hasCreds = loadWiFiCredentials();
if (hasCreds) {
if (connectToWiFi(savedSsid, savedPass)) {
return;
}
}
startAccessPoint();
}
void loop() {
server.handleClient();
}Loading
xiao-esp32-c6
xiao-esp32-c6