Support multiple temperature sensors

This commit is contained in:
Gunnar Skjold
2020-08-05 19:55:16 +02:00
parent 6479fd6a63
commit e121ec75d8
10 changed files with 325 additions and 30 deletions

View File

@@ -3,8 +3,8 @@
void HwTools::setTempSensorPin(int tempSensorPin) {
if(tempSensorPin != this->tempSensorPin) {
this->tempSensorInit = false;
if(tempSensor)
delete tempSensor;
if(sensorApi)
delete sensorApi;
if(oneWire)
delete oneWire;
if(tempSensorPin > 0 && tempSensorPin < 40) {
@@ -50,27 +50,99 @@ double HwTools::getVcc() {
return vccOffset + (volts > 0.0 ? volts * vccMultiplier : 0.0);
}
double HwTools::getTemperature() {
void HwTools::confTempSensor(uint8_t address[8], const char name[32], bool common) {
bool found = false;
for(int x = 0; x < sensorCount; x++) {
TempSensorData *data = tempSensors[x];
if(isSensorAddressEqual(data->address, address)) {
found = true;
strcpy(data->name, name);
data->common = common;
}
}
if(!found) {
TempSensorData *data = new TempSensorData();
memcpy(data->address, address, 8);
strcpy(data->name, name);
data->common = common;
data->lastRead = DEVICE_DISCONNECTED_C;
data->lastValidRead = DEVICE_DISCONNECTED_C;
tempSensors[sensorCount] = data;
sensorCount++;
}
}
uint8_t HwTools::getTempSensorCount() {
return sensorCount;
}
TempSensorData* HwTools::getTempSensorData(uint8_t i) {
return tempSensors[i];
}
bool HwTools::updateTemperatures() {
if(tempSensorPin != 0xFF) {
if(!tempSensorInit) {
oneWire = new OneWire(tempSensorPin);
tempSensor = new DallasTemperature(this->oneWire);
tempSensor->begin();
sensorApi = new DallasTemperature(this->oneWire);
sensorApi->begin();
delay(50);
tempSensor->requestTemperatures();
hasTempSensor = tempSensor->getTempCByIndex(0) != DEVICE_DISCONNECTED_C;
tempSensorInit = true;
}
if(hasTempSensor) {
tempSensor->requestTemperatures();
return tempSensor->getTempCByIndex(0);
} else {
return DEVICE_DISCONNECTED_C;
DeviceAddress addr;
sensorApi->requestTemperatures();
int c = sensorApi->getDeviceCount();
for(int i = 0; i < c; i++) {
bool found = false;
sensorApi->getAddress(addr, i);
float t = sensorApi->getTempC(addr);
for(int x = 0; x < sensorCount; x++) {
TempSensorData *data = tempSensors[x];
if(isSensorAddressEqual(data->address, addr)) {
found = true;
data->lastRead = t;
if(t > -85) {
data->lastValidRead = t;
}
}
}
if(!found) {
TempSensorData *data = new TempSensorData();
memcpy(data->address, addr, 8);
data->common = true;
data->lastRead = t;
if(t > -85) {
data->lastValidRead = t;
}
tempSensors[sensorCount] = data;
sensorCount++;
}
}
return true;
}
return false;
}
bool HwTools::isSensorAddressEqual(uint8_t a[8], uint8_t b[8]) {
for(int i = 0; i < 8; i++) {
if(a[i] != b[i]) return false;
}
return true;
}
double HwTools::getTemperature() {
uint8_t c = 0;
double ret = 0;
for(int x = 0; x < sensorCount; x++) {
TempSensorData data = *tempSensors[x];
if(data.common && data.lastValidRead > -85) {
ret += data.lastValidRead;
c++;
}
}
return DEVICE_DISCONNECTED_C;
return c == 0 ? DEVICE_DISCONNECTED_C : ret/c;
}
int HwTools::getWifiRssi() {