Files
xterra-overland-dashboard/firmware/esp32/xterra-controller/xterra-controller.ino
T
2026-06-03 01:11:46 -06:00

137 lines
3.5 KiB
Arduino

#include <WiFi.h>
#include <WebServer.h>
#include <ArduinoJson.h>
#include "config.h"
#include "relays.h"
#include "sensors.h"
WebServer server(80);
float batterySOC = 82.0;
float batteryVoltage = 13.2;
float batteryCurrent = -6.4;
float batteryRemainingAh = 82.0;
float batteryRuntimeHours = 12.0;
float batteryTemp = 76.0;
void handleStatus() {
DynamicJsonDocument doc(2048);
doc["timestamp"] = millis();
JsonObject battery = doc.createNestedObject("battery");
battery["soc"] = batterySOC;
battery["voltage"] = batteryVoltage;
battery["current"] = batteryCurrent;
battery["remaining_ah"] = batteryRemainingAh;
battery["runtime_hours"] = batteryRuntimeHours;
battery["temperature_f"] = batteryTemp;
JsonObject temps = doc.createNestedObject("temps");
temps["fridge_zone_1"] = sensors.fridgeZone1Online ? sensors.fridgeZone1 : nullptr;
temps["fridge_zone_2"] = sensors.fridgeZone2Online ? sensors.fridgeZone2 : nullptr;
temps["rear_seat"] = sensors.rearSeatOnline ? sensors.rearSeat : nullptr;
temps["outside"] = sensors.outsideAirOnline ? sensors.outsideAir : nullptr;
JsonObject sensorHealth = doc.createNestedObject("sensor_health");
sensorHealth["fridge_zone_1"] = sensors.fridgeZone1Online;
sensorHealth["fridge_zone_2"] = sensors.fridgeZone2Online;
sensorHealth["rear_seat"] = sensors.rearSeatOnline;
sensorHealth["outside"] = sensors.outsideAirOnline;
JsonObject relayObj = doc.createNestedObject("relays");
relayObj["starlink"] = relays.starlink;
relayObj["fridge"] = relays.fridge;
JsonObject vehicle = doc.createNestedObject("vehicle");
vehicle["ignition_on"] = digitalRead(IGNITION_PIN);
JsonObject network = doc.createNestedObject("network");
network["wifi_enabled"] = true;
network["rs485_connected"] = true;
String output;
serializeJsonPretty(doc, output);
server.send(200, "application/json", output);
}
void handleStarlinkOn() {
relays.starlink = true;
updateRelayOutputs();
server.send(200, "text/plain", "OK");
}
void handleStarlinkOff() {
relays.starlink = false;
updateRelayOutputs();
server.send(200, "text/plain", "OK");
}
void handleFridgeOn() {
relays.fridge = true;
updateRelayOutputs();
server.send(200, "text/plain", "OK");
}
void handleFridgeOff() {
relays.fridge = false;
updateRelayOutputs();
server.send(200, "text/plain", "OK");
}
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println("==================================");
Serial.println("Xterra Controller Booting");
Serial.println("==================================");
pinMode(IGNITION_PIN, INPUT);
initRelays();
initSensors();
WiFi.mode(WIFI_AP);
bool apResult = WiFi.softAP("XterraController");
if (apResult) {
Serial.println("AP Started");
Serial.print("IP: ");
Serial.println(WiFi.softAPIP());
}
server.on("/status", handleStatus);
server.on("/relay/starlink/on", handleStarlinkOn);
server.on("/relay/starlink/off", handleStarlinkOff);
server.on("/relay/fridge/on", handleFridgeOn);
server.on("/relay/fridge/off", handleFridgeOff);
server.begin();
Serial.println("Web Server Started");
}
void loop() {
server.handleClient();
static unsigned long lastSensorUpdate = 0;
if (millis() - lastSensorUpdate > 5000) {
updateSensors();
lastSensorUpdate = millis();
Serial.println("Sensor Update");
}
}