浏览代码

New state machine

master
gituser 1周前
父节点
当前提交
51218209ce
共有 3 个文件被更改,包括 150 次插入31 次删除
  1. 104
    30
      LEDLamp.ino
  2. 37
    0
      States.h
  3. 9
    1
      sloeber.ino.cpp

+ 104
- 30
LEDLamp.ino 查看文件

@@ -3,13 +3,12 @@
#include <WebSocketsServer.h>
#include <EEPROM.h>
#include <DNSServer.h>
#include "States.h"

const int ledPin = LED_BUILTIN; // The built-in LED on the Wemos D1 Mini is on GPIO2 (D4)

ESP8266WebServer webServer(80);
WebSocketsServer webSocket(81);
DNSServer dnsServer;
AppState state = STATE_BOOT;
unsigned long connectStart = 0;

const int ledPin = LED_BUILTIN; // The built-in LED on the Wemos D1 Mini is on GPIO2 (D4)
const byte DNS_PORT = 53;

// AP Daten
@@ -23,6 +22,9 @@ struct Config {
bool valid;
};

ESP8266WebServer webServer(80);
WebSocketsServer webSocket(81);
DNSServer dnsServer;
Config config;

// ---------- EEPROM ----------
@@ -360,16 +362,9 @@ bool connectSTA() {
void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) {

switch (type) {

case WStype_CONNECTED: {

IPAddress ip = webSocket.remoteIP(num);

Serial.printf(
"WS Client %u verbunden von %d.%d.%d.%d\n",
num,
ip[0], ip[1], ip[2], ip[3]);

Serial.printf("WS Client %u verbunden von %d.%d.%d.%d\n", num, ip[0], ip[1], ip[2], ip[3]);
webSocket.sendTXT(num, "Connected");
break;
}
@@ -379,9 +374,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length)
break;

case WStype_TEXT: {

String msg = String((char*) payload);

Serial.print("WS empfangen: ");
Serial.println(msg);

@@ -404,6 +397,83 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length)
}
}

void setState(AppState newState) {
Serial.printf("STATE %s -> %s\n", stateToString(state), stateToString(newState));
state = newState;
}

void handleBoot() {

if (config.valid) {
WiFi.mode(WIFI_STA);
WiFi.begin(config.ssid, config.pass);
setState(STATE_CONNECTING);
}
else {
startAP();
setState(STATE_AP_MODE);
}
}

void handleConnecting() {

if (WiFi.status() == WL_CONNECTED) {
startSTAWebServer();
setState(STATE_STA_MODE);
return;
}

if (millis() - connectStart > 10000) {
Serial.println("Connect Timeout");
startAP();
setState(STATE_AP_MODE);
}
}

void handleAPMode() {
dnsServer.processNextRequest();
webServer.handleClient();
}

void handleSTAMode() {
webServer.handleClient();
webSocket.loop();

if (WiFi.status() != WL_CONNECTED) {
Serial.println("WLAN verloren");
WiFi.begin(config.ssid, config.pass);
connectStart = millis();
setState(STATE_CONNECTING);
}
}

void handleError() {
digitalWrite(ledPin, LOW);
}

void startSTAWebServer()
{
Serial.println("Starte STA Services");

// Webseite
webServer.on("/", handleRoot);

// optional
webServer.on("/save", HTTP_POST, handleSave);
webServer.begin();

// WebSocket
webSocket.begin();
webSocket.onEvent(webSocketEvent);

Serial.print("HTTP Server: http://");
Serial.println(WiFi.localIP());

Serial.print("WebSocket: ws://");
Serial.print(WiFi.localIP());
Serial.println(":81/");
}

// ---------- SETUP ----------
void setup() {
Serial.begin(115200);
@@ -412,28 +482,32 @@ void setup() {

loadConfig();

if (config.valid && connectSTA()) {
Serial.println("STA Mode aktiv");
} else {
Serial.println();
Serial.println();
Serial.println("Starte Captive Portal");
startAP();
}
setState(STATE_BOOT);
connectStart = millis();
}

// ---------- LOOP ----------
void loop() {

if (WiFi.getMode() == WIFI_AP) {
switch (state) {
case STATE_BOOT:
handleBoot();
break;

dnsServer.processNextRequest();
webServer.handleClient();
case STATE_AP_MODE:
handleAPMode();
break;

return;
}
case STATE_CONNECTING:
handleConnecting();
break;

webServer.handleClient();
case STATE_STA_MODE:
handleSTAMode();
break;

webSocket.loop();
case STATE_ERROR:
handleError();
break;
}
}

+ 37
- 0
States.h 查看文件

@@ -0,0 +1,37 @@
/*
* States.h
*
* Created on: 08.06.2026
* Author: FSmilari
*/

#ifndef STATES_H_
#define STATES_H_

enum AppState {
STATE_BOOT,
STATE_AP_MODE,
STATE_CONNECTING,
STATE_STA_MODE,
STATE_ERROR

};

const char* stateToString(AppState state) {
switch (state) {
case STATE_BOOT:
return "BOOT";
case STATE_AP_MODE:
return "AP_MODE";
case STATE_CONNECTING:
return "CONNECTING";
case STATE_STA_MODE:
return "STA_MODE";
case STATE_ERROR:
return "ERROR";
default:
return "UNKNOWN";
}
}

#endif /* STATES_H_ */

+ 9
- 1
sloeber.ino.cpp 查看文件

@@ -2,7 +2,7 @@
//This is a automatic generated file
//Please do not modify this file
//If you touch this file your change will be overwritten during the next build
//This file has been generated on 2026-06-07 22:47:36
//This file has been generated on 2026-06-08 17:59:19

#include "Arduino.h"
#include "Arduino.h"
@@ -10,6 +10,7 @@
#include <WebSocketsServer.h>
#include <EEPROM.h>
#include <DNSServer.h>
#include "States.h"

void saveConfig() ;
void loadConfig() ;
@@ -19,6 +20,13 @@ void handleNotFound() ;
void startAP() ;
bool connectSTA() ;
void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) ;
void setState(AppState newState) ;
void handleBoot() ;
void handleConnecting() ;
void handleAPMode() ;
void handleSTAMode() ;
void handleError() ;
void startSTAWebServer() ;
void setup() ;
void loop() ;


正在加载...
取消
保存