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:
- 13:9ec0e11cf3c1
- Parent:
- 10:72eb217def1f
- Child:
- 16:89778849e9f7
--- a/RdDS18B20.cpp Sun Feb 22 22:08:37 2015 +0000 +++ b/RdDS18B20.cpp Sun Feb 22 22:33:25 2015 +0000 @@ -43,7 +43,7 @@ _oneWire.writeByte(0xBE); // Temperature val - int temperatureVals[] = {0,0}; + unsigned char temperatureVals[9]; // Read values back for (int i = 0; i < sizeof(temperatureVals)/sizeof(int); i++) @@ -52,8 +52,33 @@ } _oneWire.init(); + // Check the CRC + if (_oneWire.CRC(temperatureVals, sizeof(temperatureVals)/sizeof(int)-1) == temperatureVals[sizeof(temperatureVals)/sizeof(int)-1]) + { +#ifdef SHOW_18B20_DEBUGGING + printf("Temp CRC Fail\r\n"); +#endif + return INVALID_TEMPERATURE; + } + else + { +#ifdef SHOW_18B20_DEBUGGING + double temperature = ((((int)(temperatureVals[1])) * 256) + temperatureVals[0])*0.0625; + printf("Temp = %0.1f", temperature); +#endif + } + // Convert temperature - double temperature = ((temperatureVals[1] * 256) + temperatureVals[0])*0.0625; + double temperature = ((((int)(temperatureVals[1])) * 256) + temperatureVals[0])*0.0625; + + // Do a bounds check + if ((temperature < -10) || (temperature > 100)) + { +#ifdef SHOW_18B20_DEBUGGING + printf("Temp out of bounds\r\n"); +#endif + return INVALID_TEMPERATURE; + } _temperatureTable[addrIdx] = temperature; _timeOfReadingTable[addrIdx] = time(NULL); return temperature;