diff --git a/src/driver/drv_ds1820_simple.c b/src/driver/drv_ds1820_simple.c index ea33465df..5f4f26876 100644 --- a/src/driver/drv_ds1820_simple.c +++ b/src/driver/drv_ds1820_simple.c @@ -9,11 +9,21 @@ #define interrupts() taskEXIT_CRITICAL() #endif +// temperature value meaning "undefined" +// -12700 ~ -127.00° +#define DSUNDEFTEMP -12700 +// timeout in seconds for unsudccessfull readings of sensor +// temperature will be set "undefined" after this time +// 300 seconds = 5 Minutes +#define DSTIMEOUT 30 + + + static uint8_t dsread = 0; static int Pin; -static int t = -127; +static int t = DSUNDEFTEMP; static int errcount = 0; -static int lastconv; // secondsElapsed on last successfull reading +static int lastconv=0; // secondsElapsed on last successfull reading static uint8_t ds18_family = 0; static int ds18_conversionPeriod = 0; @@ -360,7 +370,9 @@ void DS1820_driver_Init() void DS1820_AppendInformationToHTTPIndexPage(http_request_t* request) { - hprintf255(request, "
DS1820 Temperature: %.2f C (read %i secs ago)
", (float)t / 100, g_secondsElapsed - lastconv); + hprintf255(request, "
DS18%s20 Temperature: ", ds18_family == 0x28 ? "B" : "20/DS18S20"); + if (t != DSUNDEFTEMP) hprintf255(request, "%.2f C (read %i secs ago)
", (float)t / 100, g_secondsElapsed - lastconv); + else hprintf255(request, "-"); } int DS1820_DiscoverFamily() @@ -384,7 +396,7 @@ int DS1820_DiscoverFamily() if(crc != ROM[7]) { // This might mean bad signal integrity or multiple 1-wire devices on the bus - DS1820_LOG(DEBUG, "Discover CRC failed (CRC=%x != calculated:%x)", ROM[7], crc); + DS1820_LOG(DEBUG, "Discover CRC failed (CRC=0x%02X != calculated:0x%02X)", ROM[7], crc); return 0; } @@ -393,12 +405,12 @@ int DS1820_DiscoverFamily() if(family == 0x10 || family == 0x28) { ds18_family = family; - DS1820_LOG(INFO, "Discover Family - discovered %x", family); + DS1820_LOG(INFO, "Discover Family - discovered 0x%02X", family); return 1; } else { - DS1820_LOG(DEBUG, "Discover Family %x not supported", family); + DS1820_LOG(DEBUG, "Discover Family 0x%02X not supported", family); return 0; } } @@ -408,6 +420,12 @@ void DS1820_OnEverySecond() // for now just find the pin used Pin = PIN_FindPinIndexForRole(IOR_DS1820_IO, 99); uint8_t scratchpad[9], crc; + // handle reading timout - set local temp to "UNDEF" value ... + if ( (t != DSUNDEFTEMP) && lastconv && (g_secondsElapsed - lastconv > DSTIMEOUT)) { + t = DSUNDEFTEMP; + // .. but don't publish this value - so value can "time out" + // CHANNEL_Set(g_cfg.pins.channels[Pin], t, CHANNEL_SET_FLAG_SILENT); + } if(Pin != 99) { // only if pin is set @@ -432,8 +450,8 @@ void DS1820_OnEverySecond() if(crc != scratchpad[8]) { errcount++; - DS1820_LOG(ERROR, "Read CRC=%x != calculated:%x (errcount=%i)", scratchpad[8], crc, errcount); - DS1820_LOG(ERROR, "Scratchpad Data Read: %x %x %x %x %x %x %x %x %x", + DS1820_LOG(ERROR, "Read CRC=0x%02X != calculated:0x%02X (errcount=%i)", scratchpad[8], crc, errcount); + DS1820_LOG(ERROR, "Scratchpad Data Read: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X", scratchpad[0], scratchpad[1], scratchpad[2], scratchpad[3], scratchpad[4], scratchpad[5], scratchpad[6], scratchpad[7], scratchpad[8]); @@ -449,7 +467,7 @@ void DS1820_OnEverySecond() int16_t dT = 128 * (scratchpad[7] - scratchpad[6]); dT /= scratchpad[7]; raw = 64 * (raw & 0xFFFE) - 32 + dT; - DS1820_LOG(DEBUG, "family=%x, raw=%i, count_remain=%i, count_per_c=%i, dT=%i", ds18_family, raw, scratchpad[6], scratchpad[7], dT); + DS1820_LOG(DEBUG, "family=0x%02X, raw=%i, count_remain=%i, count_per_c=%i, dT=%i", ds18_family, raw, scratchpad[6], scratchpad[7], dT); } else { // DS18B20 @@ -458,18 +476,19 @@ void DS1820_OnEverySecond() else if(cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if(cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms raw = raw << 3; // multiply by 8 - DS1820_LOG(DEBUG, "family=%x, raw=%i, cfg=%x (%i bit resolution)", ds18_family, raw, cfg, 9 + (cfg) / 32); + DS1820_LOG(DEBUG, "family=0x%02X, raw=%i, cfg=0x%02X (%i bit resolution)", ds18_family, raw, cfg, 9 + (cfg) / 32); } // Raw is t * 128 t = (raw / 128) * 100; // Whole degrees int frac = (raw % 128) * 100 / 128; // Fractional degrees - t += t > 0 ? frac : -frac; + t += frac; dsread = 0; lastconv = g_secondsElapsed; CHANNEL_Set(g_cfg.pins.channels[Pin], t, CHANNEL_SET_FLAG_SILENT); - DS1820_LOG(INFO, "Temp=%i.%02i", (int)t / 100, (int)t % 100); + DS1820_LOG(INFO, "Temp=%0.2f", (float)t / 100); + } } else if(dsread == 0 && (g_secondsElapsed % ds18_conversionPeriod == 0 || lastconv == 0))