Monitor for central heating system (e.g. 2zones+hw) Supports up to 15 temp probes (DS18B20/DS18S20) 3 valve monitors Gas pulse meter recording Use stand-alone or with nodeEnergyServer See http://robdobson.com/2015/09/central-heating-monitor
Dependencies: EthernetInterfacePlusHostname NTPClient Onewire RdWebServer SDFileSystem-RTOS mbed-rtos mbed-src
Diff: RdDS18B20.cpp
- Revision:
- 8:5980547ae71c
- Child:
- 9:0e103c2f869a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RdDS18B20.cpp Sat Feb 21 19:00:08 2015 +0000 @@ -0,0 +1,143 @@ +// Handles OneWire temperature sensors DB18S20 +// Can handle multiple devices per pin +// Rob Dobson, 2015 + +#include "RdDS18B20.h" + +// #define SHOW_18B20_DEBUGGING 1 + +// Construct onewire bus with desired pin +DS18B20::DS18B20(PinName mbedPin) : _oneWire(mbedPin) +{ + _numValidAddresses = 0; +} + +// Request conversion +void DS18B20::ReqConvert() +{ + // Request conversion begins + _oneWire.init(); + _oneWire.writeByte(0xCC); + _oneWire.writeByte(0x44); +} + +// Get temperature +double DS18B20::GetTemperature(int addrIdx) +{ + // Check valid address + if ((addrIdx >= _numValidAddresses) || (addrIdx < 0)) + return -1000.0; + + // Init the bus and req reading + _oneWire.init(); + _oneWire.writeByte(0x55); + + // Send the address + for (int i = 0; i < 8; i++) + _oneWire.writeByte(_addrTable[addrIdx][i]); + _oneWire.writeByte(0xBE); + + // Temperature val + int temperatureVals[] = {0,0}; + + // Read values back + for (int i = 0; i < sizeof(temperatureVals)/sizeof(int); i++) + { + temperatureVals[i] = _oneWire.readByte(); + } + _oneWire.init(); + + // Convert temperature + double temperature = ((temperatureVals[1] * 256) + temperatureVals[0])*0.0625; + return temperature; +} + +// Get address for a device +uint8_t* DS18B20::GetAddress(int addrIdx) +{ + if ((addrIdx >= _numValidAddresses) || (addrIdx < 0)) + return _addrTable[0]; + return _addrTable[addrIdx]; +} + +// Get address as a string +char* DS18B20::GetAddressStr(int addrIdx) +{ + if ((addrIdx >= _numValidAddresses) || (addrIdx < 0)) + return ""; + sprintf(_addrStr, "%02x %02x %02x %02x %02x %02x %02x %02x", + _addrTable[addrIdx][0], _addrTable[addrIdx][1], _addrTable[addrIdx][2], + _addrTable[addrIdx][3], _addrTable[addrIdx][4], _addrTable[addrIdx][5], + _addrTable[addrIdx][6], _addrTable[addrIdx][7]); + return _addrStr; +} + +// Debug print address +void DS18B20::DebugPrintAddress(int addrIdx) +{ + // Check valid address + if ((addrIdx >= _numValidAddresses) || (addrIdx < 0)) + { + printf("Invalid addrIdx %d", addrIdx); + return; + } + // Write out address + printf(GetAddressStr(addrIdx)); +} + +void DS18B20::SearchToGetAddresses() +{ + _numValidAddresses = 0; + for (int addrIdx = 0; addrIdx < MAX_BUS_DEVICES; addrIdx++) + { + uint8_t addr[8]; + + if ( !_oneWire.search(addr)) + { +#ifdef SHOW_18B20_DEBUGGING + printf("No more addresses.\r\n"); +#endif + _oneWire.reset_search(); + break; + } + +#ifdef SHOW_18B20_DEBUGGING + printf("Found device addr (ROM) ="); +#endif + for( int i = 0; i < 8; i++) + { + // Copy to table + _addrTable[_numValidAddresses][i] = addr[i]; +#ifdef SHOW_18B20_DEBUGGING + printf(" %02x", addr[i]); +#endif + } + + // Check CRC - only include if CRC is valid + if (_oneWire.CRC(addr, ONEWIRE_ADDR_BYTES-1) == addr[ONEWIRE_ADDR_BYTES-1]) + _numValidAddresses++; +#ifdef SHOW_18B20_DEBUGGING + else + printf(" (CRC INVALID!)"); +#endif + +#ifdef SHOW_18B20_DEBUGGING + // the first ROM byte indicates which chip + switch (addr[0]) + { + case 0x10: + printf(" Chip = DS18S20\r\n"); // or old DS1820 + break; + case 0x28: + printf(" Chip = DS18B20\r\n"); + break; + case 0x22: + printf(" Chip = DS1822\r\n"); + break; + default: + printf(" NOT DS18x20 FAMILY\r\n"); + break; + } +#endif + } +}