Change DS18B20 driver

Change DS18B20 driver to provide better instant results
This commit is contained in:
Theo Arends 2018-07-09 14:18:26 +02:00
parent cc24dd11ce
commit fb41466cb7
2 changed files with 32 additions and 42 deletions

View File

@ -1,4 +1,5 @@
/* 6.1.0a /* 6.1.0a
* Change DS18B20 driver to provide instant results
* Remove TSL2561 debug message and update library (#2415) * Remove TSL2561 debug message and update library (#2415)
* Change SHT1x sensor initialization from pre-teleperiod to once during restart to fix I2C interference * Change SHT1x sensor initialization from pre-teleperiod to once during restart to fix I2C interference
* Add wifi and mqtt status led blinkyblinky to be disabled by SetOption31 1. Does not work when LedPower is On (deliberate) (#871, #2230, #3114, #3155) * Add wifi and mqtt status led blinkyblinky to be disabled by SetOption31 1. Does not work when LedPower is On (deliberate) (#871, #2230, #3114, #3155)

View File

@ -26,9 +26,12 @@
#define W1_CONVERT_TEMP 0x44 #define W1_CONVERT_TEMP 0x44
#define W1_READ_SCRATCHPAD 0xBE #define W1_READ_SCRATCHPAD 0xBE
float ds18b20_last_temperature = 0; #define DS18B20_MAX_MISS 5
float ds18b20_temperature = 0;
uint16_t ds18b20_last_result = 0; uint16_t ds18b20_last_result = 0;
uint8_t ds18x20_pin = 0; uint8_t ds18x20_pin = 0;
uint8_t ds18b20_second = 0;
/*********************************************************************************************\ /*********************************************************************************************\
* Embedded stripped and tuned OneWire library * Embedded stripped and tuned OneWire library
@ -126,12 +129,7 @@ boolean OneWireCrc8(uint8_t *addr)
/********************************************************************************************/ /********************************************************************************************/
void Ds18x20Init() void Ds18b20Convert()
{
ds18x20_pin = pin[GPIO_DSB];
}
void Ds18x20Convert()
{ {
OneWireReset(); OneWireReset();
OneWireWrite(W1_SKIP_ROM); // Address all Sensors on Bus OneWireWrite(W1_SKIP_ROM); // Address all Sensors on Bus
@ -139,25 +137,16 @@ void Ds18x20Convert()
// delay(750); // 750ms should be enough for 12bit conv // delay(750); // 750ms should be enough for 12bit conv
} }
boolean Ds18b20Read(float &t) void Ds18b20Read()
{ {
uint8_t data[9]; uint8_t data[9];
int8_t sign = 1; int8_t sign = 1;
if (!ds18b20_last_temperature) { if (ds18b20_last_result) { ds18b20_last_result--; }
t = NAN;
} else {
ds18b20_last_result++;
if (ds18b20_last_result > 4) { // Reset after 4 misses
ds18b20_last_temperature = NAN;
}
t = ds18b20_last_temperature;
}
/* /*
if (!OneWireReadBit()) { //check measurement end if (!OneWireReadBit()) { // Check end of measurement
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_BUSY)); AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_BUSY));
return !isnan(t); return;
} }
*/ */
for (uint8_t retry = 0; retry < 3; retry++) { for (uint8_t retry = 0; retry < 3; retry++) {
@ -173,36 +162,40 @@ boolean Ds18b20Read(float &t)
temp12 = (~temp12) +1; temp12 = (~temp12) +1;
sign = -1; sign = -1;
} }
t = ConvertTemp(sign * temp12 * 0.0625); ds18b20_temperature = ConvertTemp(sign * temp12 * 0.0625);
ds18b20_last_result = 0; ds18b20_last_result = DS18B20_MAX_MISS;
} return;
if (!isnan(t)) {
ds18b20_last_temperature = t;
return true;
} }
} }
AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_CRC_ERROR)); AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DSB D_SENSOR_CRC_ERROR));
return !isnan(t); }
/********************************************************************************************/
void Ds18b20EverySecond()
{
ds18x20_pin = pin[GPIO_DSB];
ds18b20_second++;
if (ds18b20_second &1) {
Ds18b20Convert(); // Start conversion, takes up to one second
} else {
Ds18b20Read(); // Read temperature
}
} }
void Ds18b20Show(boolean json) void Ds18b20Show(boolean json)
{ {
float t; if (ds18b20_last_result) { // Check for valid temperature
if (Ds18b20Read(t)) { // Check if read failed
char temperature[10]; char temperature[10];
dtostrfd(t, Settings.flag2.temperature_resolution, temperature); dtostrfd(ds18b20_temperature, Settings.flag2.temperature_resolution, temperature);
if(json) { if(json) {
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"DS18B20\":{\"" D_JSON_TEMPERATURE "\":%s}"), mqtt_data, temperature); snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("%s,\"DS18B20\":{\"" D_JSON_TEMPERATURE "\":%s}"), mqtt_data, temperature);
#ifdef USE_DOMOTICZ #ifdef USE_DOMOTICZ
if (0 == tele_period) DomoticzSensor(DZ_TEMP, temperature); if (0 == tele_period) { DomoticzSensor(DZ_TEMP, temperature); }
#endif // USE_DOMOTICZ #endif // USE_DOMOTICZ
#ifdef USE_KNX #ifdef USE_KNX
if (0 == tele_period) { if (0 == tele_period) { KnxSensor(KNX_TEMPERATURE, ds18b20_temperature); }
KnxSensor(KNX_TEMPERATURE, t);
}
#endif // USE_KNX #endif // USE_KNX
#ifdef USE_WEBSERVER #ifdef USE_WEBSERVER
} else { } else {
@ -210,7 +203,6 @@ void Ds18b20Show(boolean json)
#endif // USE_WEBSERVER #endif // USE_WEBSERVER
} }
} }
Ds18x20Convert(); // Start conversion, takes up to one second
} }
/*********************************************************************************************\ /*********************************************************************************************\
@ -225,11 +217,8 @@ boolean Xsns05(byte function)
if (pin[GPIO_DSB] < 99) { if (pin[GPIO_DSB] < 99) {
switch (function) { switch (function) {
case FUNC_INIT: case FUNC_EVERY_SECOND:
Ds18x20Init(); Ds18b20EverySecond();
break;
case FUNC_PREP_BEFORE_TELEPERIOD:
Ds18x20Convert(); // Start conversion, takes up to one second
break; break;
case FUNC_JSON_APPEND: case FUNC_JSON_APPEND:
Ds18b20Show(1); Ds18b20Show(1);