From 95566e87f536c7c4774af45480797873f2a7622b Mon Sep 17 00:00:00 2001 From: Mikolaj Krzewicki Date: Wed, 4 Nov 2020 10:51:08 +0100 Subject: [PATCH 1/2] millisToWaitForConversion returns unsigned usual scenario is it is compared to millis() and the like --- DallasTemperature.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DallasTemperature.cpp b/DallasTemperature.cpp index a76bc51..1b3ee3f 100644 --- a/DallasTemperature.cpp +++ b/DallasTemperature.cpp @@ -454,7 +454,7 @@ void DallasTemperature::blockTillConversionComplete(uint8_t bitResolution) { } // returns number of milliseconds to wait till conversion is complete (based on IC datasheet) -int16_t DallasTemperature::millisToWaitForConversion(uint8_t bitResolution) { +uint16_t DallasTemperature::millisToWaitForConversion(uint8_t bitResolution) { switch (bitResolution) { case 9: From 30f15de998d76d62f4ee904d8d31d30005766a14 Mon Sep 17 00:00:00 2001 From: Mikolaj Krzewicki Date: Tue, 3 Nov 2020 21:28:01 +0100 Subject: [PATCH 2/2] Extend temperature conversion API Add a stateful millisTowaitForConversion (class knows the resolution) Make millisToWaitForConversion(uint8_t) static Add celsiusToRaw Return signed int from celsiusToRaw Add a description to celsiusToRaw --- DallasTemperature.cpp | 18 ++++++++++++++++++ DallasTemperature.h | 7 ++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/DallasTemperature.cpp b/DallasTemperature.cpp index 1b3ee3f..5c5db01 100644 --- a/DallasTemperature.cpp +++ b/DallasTemperature.cpp @@ -469,6 +469,11 @@ uint16_t DallasTemperature::millisToWaitForConversion(uint8_t bitResolution) { } +// returns number of milliseconds to wait till conversion is complete (based on IC datasheet) +uint16_t DallasTemperature::millisToWaitForConversion() { + return millisToWaitForConversion(bitResolution); +} + // Sends command to one device to save values from scratchpad to EEPROM by index // Returns true if no errors were encountered, false indicates failure bool DallasTemperature::saveScratchPadByIndex(uint8_t deviceIndex) { @@ -740,6 +745,19 @@ float DallasTemperature::rawToCelsius(int16_t raw) { } +// Convert from Celsius to raw returns temperature in raw integer format. +// The rounding error in the conversion is smaller than 0.01°C +// where the resolution of the sensor is at best 0.0625°C (in 12 bit mode). +// Rounding error can be verified by running: +// for (float t=-55.; t<125.; t+=0.01) +// { +// Serial.println( DallasTemperature::rawToCelsius(DallasTemperature::celsiusToRaw(t))-t, 4 ); +// } +int16_t DallasTemperature::celsiusToRaw(float celsius) { + + return static_cast( celsius * 128.f ); +} + // convert from raw to Fahrenheit float DallasTemperature::rawToFahrenheit(int16_t raw) { diff --git a/DallasTemperature.h b/DallasTemperature.h index cb9e027..7c3dfed 100644 --- a/DallasTemperature.h +++ b/DallasTemperature.h @@ -158,7 +158,9 @@ class DallasTemperature { // Is a conversion complete on the wire? Only applies to the first sensor on the wire. bool isConversionComplete(void); - int16_t millisToWaitForConversion(uint8_t); + static uint16_t millisToWaitForConversion(uint8_t); + + uint16_t millisToWaitForConversion(); // Sends command to one device to save values from scratchpad to EEPROM by index // Returns true if no errors were encountered, false indicates failure @@ -244,6 +246,9 @@ class DallasTemperature { // convert from raw to Celsius static float rawToCelsius(int16_t); + // convert from Celsius to raw + static int16_t celsiusToRaw(float); + // convert from raw to Fahrenheit static float rawToFahrenheit(int16_t);