Add AP plus STA WiFi mode

This commit is contained in:
2026-06-04 12:56:02 -06:00
parent c3242d8898
commit 57590981b1
@@ -1,5 +1,6 @@
#include <WiFi.h>
#include <WebServer.h>
#include <Preferences.h>
#include <ArduinoJson.h>
#include "config.h"
@@ -152,6 +153,76 @@ HardwareSerial DashboardSerial(2);
String uartLineBuffer;
Preferences wifiPrefs;
String staSsid = "";
String staPassword = "";
void loadWifiConfig() {
wifiPrefs.begin("wifi", true);
staSsid = wifiPrefs.getString("ssid", "");
staPassword = wifiPrefs.getString("password", "");
wifiPrefs.end();
}
void saveWifiConfig() {
wifiPrefs.begin("wifi", false);
wifiPrefs.putString("ssid", staSsid);
wifiPrefs.putString("password", staPassword);
wifiPrefs.end();
}
void clearWifiConfig() {
wifiPrefs.begin("wifi", false);
wifiPrefs.clear();
wifiPrefs.end();
staSsid = "";
staPassword = "";
}
void connectStaWifi() {
if (staSsid.length() == 0) {
Serial.println("STA WiFi not configured.");
return;
}
Serial.print("Connecting STA WiFi to: ");
Serial.println(staSsid);
WiFi.begin(staSsid.c_str(), staPassword.c_str());
unsigned long start = millis();
while (WiFi.status() != WL_CONNECTED && millis() - start < 10000) {
delay(500);
Serial.print(".");
}
Serial.println();
if (WiFi.status() == WL_CONNECTED) {
Serial.println("STA WiFi connected");
Serial.print("STA IP: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("STA WiFi failed. AP remains available.");
}
}
void printNetworkStatus() {
Serial.println("Network:");
Serial.print(" AP IP: ");
Serial.println(WiFi.softAPIP());
Serial.print(" STA SSID: ");
Serial.println(staSsid.length() ? staSsid : "(not configured)");
Serial.print(" STA Connected: ");
Serial.println(WiFi.status() == WL_CONNECTED ? "true" : "false");
if (WiFi.status() == WL_CONNECTED) {
Serial.print(" STA IP: ");
Serial.println(WiFi.localIP());
}
}
float calculateRuntimeHours() {
if (!bmsData.valid || bmsData.current >= 0) return 0;
float dischargeAmps = -bmsData.current;
@@ -652,6 +723,42 @@ void handleDebugSerial() {
return;
}
if (command == "wifi status") {
printNetworkStatus();
return;
}
if (command.startsWith("wifi ssid ")) {
staSsid = command.substring(10);
Serial.println("OK WiFi SSID updated");
Serial.println("Run: wifi save");
return;
}
if (command.startsWith("wifi pass ")) {
staPassword = command.substring(10);
Serial.println("OK WiFi password updated");
Serial.println("Run: wifi save");
return;
}
if (command == "wifi save") {
saveWifiConfig();
Serial.println("OK WiFi config saved");
return;
}
if (command == "wifi connect") {
connectStaWifi();
return;
}
if (command == "wifi clear") {
clearWifiConfig();
Serial.println("OK WiFi config cleared");
return;
}
if (command == "factory reset") {
factoryResetConfig();
Serial.println("OK factory reset complete");
@@ -1095,15 +1202,19 @@ void setup() {
initSensors();
initBms();
WiFi.mode(WIFI_AP);
loadWifiConfig();
WiFi.mode(WIFI_AP_STA);
bool apResult = WiFi.softAP("OverlandController");
if (apResult) {
Serial.println("AP Started");
Serial.print("IP: ");
Serial.print("AP IP: ");
Serial.println(WiFi.softAPIP());
}
connectStaWifi();
server.on("/", HTTP_GET, []() {
server.send_P(200, "text/html", INDEX_HTML);
});