/*
|
|
|
|
DS18B20 MODULE
|
|
|
|
Copyright (C) 2016-2017 by Xose Pérez <xose dot perez at gmail dot com>
|
|
|
|
*/
|
|
|
|
#if DS18B20_SUPPORT
|
|
|
|
#include <OneWire.h>
|
|
#include <DallasTemperature.h>
|
|
|
|
OneWire oneWire(DS18B20_PIN);
|
|
DallasTemperature ds18b20(&oneWire);
|
|
|
|
bool _dsIsConnected = false;
|
|
double _dsTemperature = 0;
|
|
char _dsTemperatureStr[6];
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// Private
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void _dsWebSocketOnSend(JsonObject& root) {
|
|
root["dsVisible"] = 1;
|
|
root["dsTmp"] = getDSTemperatureStr();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// DS18B20
|
|
// -----------------------------------------------------------------------------
|
|
|
|
double getDSTemperature() {
|
|
return _dsTemperature;
|
|
}
|
|
|
|
const char* getDSTemperatureStr() {
|
|
if (!_dsIsConnected)
|
|
return "NOT CONNECTED";
|
|
|
|
return _dsTemperatureStr;
|
|
}
|
|
|
|
void dsSetup() {
|
|
|
|
ds18b20.begin();
|
|
ds18b20.setWaitForConversion(false);
|
|
|
|
#if WEB_SUPPORT
|
|
|
|
wsOnSendRegister(_dsWebSocketOnSend);
|
|
|
|
apiRegister(DS18B20_TEMPERATURE_TOPIC, DS18B20_TEMPERATURE_TOPIC, [](char * buffer, size_t len) {
|
|
dtostrf(_dsTemperature, 1-len, 1, buffer);
|
|
});
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
void dsLoop() {
|
|
|
|
// Check if we should read new data
|
|
static unsigned long last_update = 0;
|
|
static bool requested = false;
|
|
|
|
static double last_temperature = 0.0;
|
|
bool send_update = false;
|
|
|
|
if ((millis() - last_update > DS18B20_UPDATE_INTERVAL) || (last_update == 0)) {
|
|
if (!requested) {
|
|
ds18b20.requestTemperatures();
|
|
requested = true;
|
|
|
|
/* Requesting takes time,
|
|
* so data will probably not be available in this round */
|
|
return;
|
|
}
|
|
|
|
/* Check if requested data is already available */
|
|
if (!ds18b20.isConversionComplete()) {
|
|
return;
|
|
}
|
|
|
|
requested = false;
|
|
last_update = millis();
|
|
|
|
unsigned char tmpUnits = getSetting("tmpUnits", TMP_UNITS).toInt();
|
|
double tmpCorrection = getSetting("tmpCorrection", TMP_CORRECTION).toFloat();
|
|
|
|
// Read sensor data
|
|
double t = (tmpUnits == TMP_CELSIUS) ? ds18b20.getTempCByIndex(0) : ds18b20.getTempFByIndex(0);
|
|
|
|
// apply temperature reading correction
|
|
t = t + tmpCorrection;
|
|
|
|
// Check if readings are valid
|
|
if (isnan(t) || t < -50) {
|
|
|
|
DEBUG_MSG_P(PSTR("[DS18B20] Error reading sensor\n"));
|
|
|
|
} else {
|
|
|
|
//If the new temperature is different from the last
|
|
if (fabs(t - last_temperature) >= DS18B20_UPDATE_ON_CHANGE) {
|
|
last_temperature = t;
|
|
send_update = true;
|
|
}
|
|
|
|
_dsTemperature = t;
|
|
|
|
if ((tmpUnits == TMP_CELSIUS && _dsTemperature == DEVICE_DISCONNECTED_C) ||
|
|
(tmpUnits == TMP_FAHRENHEIT && _dsTemperature == DEVICE_DISCONNECTED_F))
|
|
_dsIsConnected = false;
|
|
else
|
|
_dsIsConnected = true;
|
|
|
|
dtostrf(t, 1-sizeof(_dsTemperatureStr), 1, _dsTemperatureStr);
|
|
|
|
DEBUG_MSG_P(PSTR("[DS18B20] Temperature: %s%s\n"),
|
|
getDSTemperatureStr(),
|
|
(_dsIsConnected ? ((tmpUnits == TMP_CELSIUS) ? "ºC" : "ºF") : ""));
|
|
|
|
if (send_update) {
|
|
// Send MQTT messages
|
|
mqttSend(getSetting("dsTmpTopic", DS18B20_TEMPERATURE_TOPIC).c_str(), _dsTemperatureStr);
|
|
|
|
// Send to Domoticz
|
|
#if DOMOTICZ_SUPPORT
|
|
domoticzSend("dczTmpIdx", 0, _dsTemperatureStr);
|
|
#endif
|
|
|
|
#if INFLUXDB_SUPPORT
|
|
idbSend(getSetting("dsTmpTopic", DS18B20_TEMPERATURE_TOPIC).c_str(), _dsTemperatureStr);
|
|
#endif
|
|
}
|
|
|
|
// Update websocket clients
|
|
#if WEB_SUPPORT
|
|
char buffer[100];
|
|
snprintf_P(buffer, sizeof(buffer), PSTR("{\"dsVisible\": 1, \"dsTmp\": %s, \"tmpUnits\": %d}"), getDSTemperatureStr(), tmpUnits);
|
|
wsSend(buffer);
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|