From c2248a5f5a88caab0dda0713406b37f574cd8bb1 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 3 Jun 2026 01:11:46 -0600 Subject: [PATCH] Add DS18B20 temperature sensor support --- firmware/esp32/xterra-controller/sensors.cpp | 79 ++++++++++++++++++- firmware/esp32/xterra-controller/sensors.h | 14 +++- .../xterra-controller/xterra-controller.ino | 14 +++- 3 files changed, 98 insertions(+), 9 deletions(-) diff --git a/firmware/esp32/xterra-controller/sensors.cpp b/firmware/esp32/xterra-controller/sensors.cpp index 276756f..a77e1d2 100644 --- a/firmware/esp32/xterra-controller/sensors.cpp +++ b/firmware/esp32/xterra-controller/sensors.cpp @@ -1,10 +1,87 @@ +#include +#include +#include + +#include "config.h" #include "sensors.h" SensorData sensors; +OneWire oneWire(ONEWIRE_PIN); +DallasTemperature ds18b20(&oneWire); + +DeviceAddress sensorAddresses[4]; +int sensorCount = 0; + +float cToF(float c) { + return (c * 9.0 / 5.0) + 32.0; +} + +bool validTempC(float tempC) { + return tempC != DEVICE_DISCONNECTED_C && tempC > -55 && tempC < 125; +} + +void printAddress(DeviceAddress address) { + for (uint8_t i = 0; i < 8; i++) { + if (address[i] < 16) Serial.print("0"); + Serial.print(address[i], HEX); + if (i < 7) Serial.print(":"); + } +} + +void printSensorAddresses() { + Serial.println("DS18B20 Sensors Found:"); + + for (int i = 0; i < sensorCount; i++) { + Serial.print("Sensor "); + Serial.print(i); + Serial.print(": "); + printAddress(sensorAddresses[i]); + Serial.println(); + } + + if (sensorCount == 0) { + Serial.println("No DS18B20 sensors found."); + } +} + void initSensors() { + ds18b20.begin(); + sensorCount = ds18b20.getDeviceCount(); + + if (sensorCount > 4) { + sensorCount = 4; + } + + for (int i = 0; i < sensorCount; i++) { + ds18b20.getAddress(sensorAddresses[i], i); + } + + printSensorAddresses(); } void updateSensors() { - // Placeholder until DS18B20 support is added + ds18b20.requestTemperatures(); + + float tempsF[4] = {-127, -127, -127, -127}; + bool online[4] = {false, false, false, false}; + + for (int i = 0; i < sensorCount; i++) { + float tempC = ds18b20.getTempC(sensorAddresses[i]); + + if (validTempC(tempC)) { + tempsF[i] = cToF(tempC); + online[i] = true; + } + } + + sensors.fridgeZone1 = tempsF[0]; + sensors.fridgeZone2 = tempsF[1]; + sensors.rearSeat = tempsF[2]; + sensors.outsideAir = tempsF[3]; + + sensors.fridgeZone1Online = online[0]; + sensors.fridgeZone2Online = online[1]; + sensors.rearSeatOnline = online[2]; + sensors.outsideAirOnline = online[3]; } diff --git a/firmware/esp32/xterra-controller/sensors.h b/firmware/esp32/xterra-controller/sensors.h index 3870430..9400b6e 100644 --- a/firmware/esp32/xterra-controller/sensors.h +++ b/firmware/esp32/xterra-controller/sensors.h @@ -1,13 +1,19 @@ #pragma once struct SensorData { - float fridgeZone1 = 36.0; - float fridgeZone2 = 12.0; - float rearSeat = 78.0; - float outsideAir = 88.0; + float fridgeZone1 = -127.0; + float fridgeZone2 = -127.0; + float rearSeat = -127.0; + float outsideAir = -127.0; + + bool fridgeZone1Online = false; + bool fridgeZone2Online = false; + bool rearSeatOnline = false; + bool outsideAirOnline = false; }; extern SensorData sensors; void initSensors(); void updateSensors(); +void printSensorAddresses(); diff --git a/firmware/esp32/xterra-controller/xterra-controller.ino b/firmware/esp32/xterra-controller/xterra-controller.ino index 68face4..93212fd 100644 --- a/firmware/esp32/xterra-controller/xterra-controller.ino +++ b/firmware/esp32/xterra-controller/xterra-controller.ino @@ -30,10 +30,16 @@ void handleStatus() { battery["temperature_f"] = batteryTemp; JsonObject temps = doc.createNestedObject("temps"); - temps["fridge_zone_1"] = sensors.fridgeZone1; - temps["fridge_zone_2"] = sensors.fridgeZone2; - temps["rear_seat"] = sensors.rearSeat; - temps["outside"] = sensors.outsideAir; + 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;