From 5a14ab31e49efa5acbc234acd3962bd1af01586e Mon Sep 17 00:00:00 2001 From: "Ruslan V. Uss" Date: Fri, 28 Oct 2016 18:29:47 +0600 Subject: [PATCH] DS18x20: DS18S20 support, bugfixes (#255) --- extras/ds18b20/component.mk | 6 +++++ extras/ds18b20/ds18b20.c | 46 ++++++++++++++++++++++++++----------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/extras/ds18b20/component.mk b/extras/ds18b20/component.mk index 866371c..2bffda5 100644 --- a/extras/ds18b20/component.mk +++ b/extras/ds18b20/component.mk @@ -6,4 +6,10 @@ INC_DIRS += $(ds18b20_ROOT).. # args for passing into compile rule generation ds18b20_SRC_DIR = $(ds18b20_ROOT) +# users can override this setting and get console debug output +DS18B20_DEBUG ?= 0 +ifeq ($(DS18B20_DEBUG),1) + ds18b20_CFLAGS = $(CFLAGS) -DDS18B20_DEBUG +endif + $(eval $(call component_compile_rules,ds18b20)) diff --git a/extras/ds18b20/ds18b20.c b/extras/ds18b20/ds18b20.c index c965b04..466422e 100644 --- a/extras/ds18b20/ds18b20.c +++ b/extras/ds18b20/ds18b20.c @@ -18,6 +18,15 @@ #define os_sleep_ms(x) vTaskDelay(((x) + portTICK_RATE_MS - 1) / portTICK_RATE_MS) +#define DS18B20_FAMILY_ID 0x28 +#define DS18S20_FAMILY_ID 0x10 + +#ifdef DS18B20_DEBUG +#define debug(fmt, ...) printf("%s" fmt "\n", "DS18B20: ", ## __VA_ARGS__); +#else +#define debug(fmt, ...) +#endif + uint8_t ds18b20_read_all(uint8_t pin, ds_sensor_t *result) { onewire_addr_t addr; onewire_search_t search; @@ -28,7 +37,7 @@ uint8_t ds18b20_read_all(uint8_t pin, ds_sensor_t *result) { while ((addr = onewire_search_next(&search, pin)) != ONEWIRE_NONE) { uint8_t crc = onewire_crc8((uint8_t *)&addr, 7); if (crc != (addr >> 56)){ - printf("CRC check failed: %02X %02X\n", (unsigned)(addr >> 56), crc); + debug("CRC check failed: %02X %02X\n", (unsigned)(addr >> 56), crc); return 0; } @@ -49,11 +58,11 @@ uint8_t ds18b20_read_all(uint8_t pin, ds_sensor_t *result) { get[k]=onewire_read(pin); } - //printf("\n ScratchPAD DATA = %X %X %X %X %X %X %X %X %X\n",get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get[0]); + //debug("\n ScratchPAD DATA = %X %X %X %X %X %X %X %X %X\n",get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get[0]); crc = onewire_crc8(get, 8); if (crc != get[8]){ - printf("CRC check failed: %02X %02X\n", get[8], crc); + debug("CRC check failed: %02X %02X\n", get[8], crc); return 0; } @@ -64,7 +73,7 @@ uint8_t ds18b20_read_all(uint8_t pin, ds_sensor_t *result) { float temperature; temperature = (temp * 625.0)/10000; - //printf("Got a DS18B20 Reading: %d.%02d\n", (int)temperature, (int)(temperature - (int)temperature) * 100); + //debug("Got a DS18B20 Reading: %d.%02d\n", (int)temperature, (int)(temperature - (int)temperature) * 100); result[sensor_id].id = sensor_id; result[sensor_id].value = temperature; sensor_id++; @@ -91,11 +100,11 @@ float ds18b20_read_single(uint8_t pin) { get[k]=onewire_read(pin); } - //printf("\n ScratchPAD DATA = %X %X %X %X %X %X %X %X %X\n",get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get[0]); + //debug("\n ScratchPAD DATA = %X %X %X %X %X %X %X %X %X\n",get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get[0]); uint8_t crc = onewire_crc8(get, 8); if (crc != get[8]){ - printf("CRC check failed: %02X %02X", get[8], crc); + debug("CRC check failed: %02X %02X", get[8], crc); return 0; } @@ -108,7 +117,7 @@ float ds18b20_read_single(uint8_t pin) { temperature = (temp * 625.0)/10000; return temperature; - //printf("Got a DS18B20 Reading: %d.%02d\n", (int)temperature, (int)(temperature - (int)temperature) * 100); + //debug("Got a DS18B20 Reading: %d.%02d\n", (int)temperature, (int)(temperature - (int)temperature) * 100); } bool ds18b20_measure(int pin, ds18b20_addr_t addr, bool wait) { @@ -156,7 +165,7 @@ bool ds18b20_read_scratchpad(int pin, ds18b20_addr_t addr, uint8_t *buffer) { expected_crc = onewire_crc8(buffer, 8); if (crc != expected_crc) { - printf("CRC check failed reading scratchpad: %02x %02x %02x %02x %02x %02x %02x %02x : %02x (expected %02x)\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], crc, expected_crc); + debug("CRC check failed reading scratchpad: %02x %02x %02x %02x %02x %02x %02x %02x : %02x (expected %02x)\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], crc, expected_crc); return false; } @@ -172,8 +181,16 @@ float ds18b20_read_temperature(int pin, ds18b20_addr_t addr) { } temp = scratchpad[1] << 8 | scratchpad[0]; - - return ((float)temp * 625.0)/10000; + + float res; + if ((uint8_t)addr == DS18B20_FAMILY_ID) { + res = ((float)temp * 625.0)/10000; + } + else { + temp = ((temp & 0xfffe) << 3) + (16 - scratchpad[6]) - 4; + res = ((float)temp * 625.0)/10000 - 0.25; + } + return res; } float ds18b20_measure_and_read(int pin, ds18b20_addr_t addr) { @@ -200,10 +217,13 @@ int ds18b20_scan_devices(int pin, ds18b20_addr_t *addr_list, int addr_count) { onewire_search_start(&search); while ((addr = onewire_search_next(&search, pin)) != ONEWIRE_NONE) { - if (found < addr_count) { - addr_list[found] = addr; + uint8_t family_id = (uint8_t)addr; + if (family_id == DS18B20_FAMILY_ID || family_id == DS18S20_FAMILY_ID) { + if (found < addr_count) { + addr_list[found] = addr; + } + found++; } - found++; } return found; }