Add DS18B20 temperature sensor support

This commit is contained in:
root
2026-06-03 01:11:46 -06:00
parent f9fe949bb9
commit c2248a5f5a
3 changed files with 98 additions and 9 deletions
+78 -1
View File
@@ -1,10 +1,87 @@
#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#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];
}
+10 -4
View File
@@ -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();
@@ -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;