diff --git a/libraries/DS18B20_INT/DS18B20_INT.cpp b/libraries/DS18B20_INT/DS18B20_INT.cpp index 0f042624..900b6686 100644 --- a/libraries/DS18B20_INT/DS18B20_INT.cpp +++ b/libraries/DS18B20_INT/DS18B20_INT.cpp @@ -1,10 +1,11 @@ // // FILE: DS18B20_INT.cpp // AUTHOR: Rob.Tillaart@gmail.com -// VERSION: 0.1.7 +// VERSION: 0.2.0 // DATE: 2017-07-25 // PUPROSE: library for DS18B20 temperature sensor - integer only. // URL: https://github.com/RobTillaart/DS18B20_INT +// https://github.com/RobTillaart/DS18B20_RT // // HISTORY: // 0.1.0 2017-07-25 initial version @@ -15,6 +16,8 @@ // 0.1.5 2021-06-16 add retries parameter to begin() // 0.1.6 2021-10-03 add dependency + fix build-CI // 0.1.7 2021-12-17 update library.json, license, minor edits +// 0.2.0 2022-06-23 fix #10 getTempCentiC() (thanks negroKiordi) +// fix reading sensor #include "DS18B20_INT.h" @@ -26,13 +29,17 @@ // Device resolution -#define TEMP_9_BIT 0x1F // 9 bit +#define TEMP_9_BIT 0x1F // 9 bit +#define TEMP_10_BIT 0x3F // 10 bit +#define TEMP_11_BIT 0x5F // 11 bit +#define TEMP_12_BIT 0x7F // 12 bit DS18B20_INT::DS18B20_INT(OneWire* ow) { - _oneWire = ow; + _oneWire = ow; _addressFound = false; + _resolution = TEMP_9_BIT; } @@ -57,7 +64,7 @@ bool DS18B20_INT::begin(uint8_t retries) // two dummy values for LOW & HIGH ALARM _oneWire->write(0); _oneWire->write(100); - _oneWire->write(TEMP_9_BIT); // lowest as we do only integer math. + _oneWire->write(_resolution); // lowest as we do only integer math. _oneWire->reset(); } return _addressFound; @@ -80,12 +87,7 @@ bool DS18B20_INT::isConversionComplete(void) int16_t DS18B20_INT::getTempC(void) { - _oneWire->reset(); - _oneWire->select(_deviceAddress); - _oneWire->write(READSCRATCH); - int16_t rawTemperature = ((int16_t)_oneWire->read()) << 8; - rawTemperature |= _oneWire->read(); - _oneWire->reset(); + int16_t rawTemperature = _readRaw(); rawTemperature >>= 4; if (rawTemperature < -55) return DEVICE_DISCONNECTED; return rawTemperature; @@ -105,5 +107,66 @@ bool DS18B20_INT::getAddress(uint8_t* buf) } +void DS18B20_INT::setResolution(uint8_t bits) +{ + uint8_t newRes = 0; + switch (bits) + { + case 12: newRes = TEMP_12_BIT; break; + case 11: newRes = TEMP_11_BIT; break; + case 10: newRes = TEMP_10_BIT; break; + default: newRes = TEMP_9_BIT; break; + } + if (newRes != _resolution) + { + _resolution = newRes; + begin(); + } +} + + +uint8_t DS18B20_INT::getResolution() +{ + switch (_resolution) + { + case TEMP_12_BIT: return 12; + case TEMP_11_BIT: return 11; + case TEMP_10_BIT: return 10; + case TEMP_9_BIT: return 9; + } + return 0; +} + + +int16_t DS18B20_INT::getTempCentiC(void) +{ + int16_t rawTemperature = _readRaw(); + // rawTemperature = rawTemperature * 100 / 16; + rawTemperature *= 25; + rawTemperature >>= 2; + // use at own risk. + // if (rawTemperature < -5500) return DEVICE_DISCONNECTED * 100; + return rawTemperature; +} + + +////////////////////////////////////////////////// +// +// PRIVATE +// +int16_t DS18B20_INT::_readRaw(void) +{ + _oneWire->reset(); + _oneWire->select(_deviceAddress); + _oneWire->write(READSCRATCH); + int16_t rawTemperature = ((int16_t)_oneWire->read()); + rawTemperature |= _oneWire->read() << 8; + _oneWire->reset(); + return rawTemperature; +} + + + + // -- END OF FILE -- diff --git a/libraries/DS18B20_INT/DS18B20_INT.h b/libraries/DS18B20_INT/DS18B20_INT.h index 07396bc0..5f5d2a0e 100644 --- a/libraries/DS18B20_INT/DS18B20_INT.h +++ b/libraries/DS18B20_INT/DS18B20_INT.h @@ -2,11 +2,12 @@ // // FILE: DS18B20_INT.h // AUTHOR: Rob.Tillaart@gmail.com -// VERSION: 0.1.7 +// VERSION: 0.2.0 // DATE: 2017-07-25 // PUPROSE: Minimalistic library for DS18B20 temperature sensor // uses only integer math (no float to minimize footprint) // URL: https://github.com/RobTillaart/DS18B20_INT +// https://github.com/RobTillaart/DS18B20_RT // // BOTTOM VIEW @@ -20,7 +21,7 @@ // -#define DS18B20_INT_LIB_VERSION (F("0.1.7")) +#define DS18B20_INT_LIB_VERSION (F("0.2.0")) #include "Arduino.h" #include "OneWire.h" @@ -41,10 +42,18 @@ public: bool isConversionComplete(void); bool getAddress(uint8_t* buf); + void setResolution(uint8_t bits = 9); + uint8_t getResolution(); + int16_t getTempCentiC(void); + + private: DeviceAddress _deviceAddress; OneWire* _oneWire; bool _addressFound; + + uint8_t _resolution; + int16_t _readRaw(); }; diff --git a/libraries/DS18B20_INT/README.md b/libraries/DS18B20_INT/README.md index 3d4b6a09..df06e525 100644 --- a/libraries/DS18B20_INT/README.md +++ b/libraries/DS18B20_INT/README.md @@ -24,6 +24,8 @@ I'm a great fan of the above library however some time ago I needed to strip it to save a few dozen bytes. I reworked that minimalistic version into a library and I added a number of Arduino examples to help you get started. +This library is also related to - https://github.com/RobTillaart/DS18B20_RT + ## Interface @@ -37,10 +39,29 @@ returns true if all is OK. there will be a number of retries to connect, default - **void requestTemperatures()** trigger temperature conversion. - **bool isConversionComplete()** check if conversion is complete. - **int16_t getTempC()** returns temperature in whole degrees only. -55..125 --127 = DEVICE_DISCONNECTED +or -127 = DEVICE_DISCONNECTED - **bool getAddress()** returns true if the sensor is configured (available). +### CentiC part + +The following functions are experimental since 0.2.0 +They allow to use a higher resolution while not using floats. +This keeps the library small. + +- **void setResolution(uint8_t bits = 9)** sets the internal resolution to 9, 10, 11 or 12 bits. +Other numbers will be mapped on 9. +This will affect the conversion time for a measurement. +Internally it will call **begin()** to set the new resolution if needed. +- **void getResolution()** returns the bits set, default 9. +Convenience function. +- **getTempCentiC(void)** returns the measured temperature times 100. -5500..12500 +So 10.62°C will be returned as 1062. + +**Warning** The DEVICE_DISCONNECTED is not tested for, but is commented in the code. +Use at own risk. + + ## Operation This library supports only one DS18B20 per Arduino/ MCU pin. @@ -60,8 +81,6 @@ This library supports only one DS18B20 per Arduino/ MCU pin. Connect a pull-up resistor 4.7 KOhm between pin3 and pin2. When the wires are longer this resistor needs to be smaller. -Check examples. - ### Pull up resistor @@ -78,7 +97,7 @@ Note: thicker wires require smaller resistors (typically 1 step in E12 series) | 100cm (3'4") | 3K3 | 2K2 | | 200cm (6'8") | 2K2 | 1K0 | | 500cm (16'8") | 1K0 | \* | -| longer | * | \* | +| longer | \* | \* | \* = no info, smaller @@ -93,4 +112,7 @@ and all people who contributed to that lib. - add examples - a multi sensor == multiple pins, no bus +- add rounding for **getTempC()**. + - now it truncates, so it can be 0.5°C off. + - add "0.5" to raw and truncate diff --git a/libraries/DS18B20_INT/examples/DS18B20_INT/DS18B20_INT.ino b/libraries/DS18B20_INT/examples/DS18B20_INT/DS18B20_INT.ino index 618a64c5..c9ed4af2 100644 --- a/libraries/DS18B20_INT/examples/DS18B20_INT/DS18B20_INT.ino +++ b/libraries/DS18B20_INT/examples/DS18B20_INT/DS18B20_INT.ino @@ -1,7 +1,6 @@ // // FILE: DS18B20_INT.ino // AUTHOR: Rob Tillaart -// VERSION: 0.0.1 // PURPOSE: Minimalistic demo @@ -43,4 +42,3 @@ void loop() // -- END OF FILE -- - diff --git a/libraries/DS18B20_INT/examples/DS18B20_INT_getTempCentiC/DS18B20_INT_getTempCentiC.ino b/libraries/DS18B20_INT/examples/DS18B20_INT_getTempCentiC/DS18B20_INT_getTempCentiC.ino new file mode 100644 index 00000000..aeb22883 --- /dev/null +++ b/libraries/DS18B20_INT/examples/DS18B20_INT_getTempCentiC/DS18B20_INT_getTempCentiC.ino @@ -0,0 +1,46 @@ +// +// FILE: DS18B20_INT_getTempCentiC.ino +// AUTHOR: Rob Tillaart +// PURPOSE: Minimalistic demo + + +#include "DS18B20_INT.h" + +#define ONE_WIRE_BUS 2 + +OneWire oneWire(ONE_WIRE_BUS); +DS18B20_INT sensor(&oneWire); + +uint32_t start, stop; + + +void setup() +{ + Serial.begin(115200); + Serial.println(__FILE__); + sensor.begin(); + sensor.setResolution(12); + Serial.println(sensor.getResolution()); +} + + +void loop() +{ + int n = 0; + start = millis(); + sensor.requestTemperatures(); + while (!sensor.isConversionComplete()) n++; + int t = sensor.getTempCentiC(); + stop = millis(); + + Serial.print(stop - start); + Serial.print("\t"); + Serial.print(n); + Serial.print("\t"); + Serial.println(t); + Serial.println(); + delay(1000); +} + + +// -- END OF FILE -- diff --git a/libraries/DS18B20_INT/keywords.txt b/libraries/DS18B20_INT/keywords.txt index 39c02721..177efc50 100644 --- a/libraries/DS18B20_INT/keywords.txt +++ b/libraries/DS18B20_INT/keywords.txt @@ -11,6 +11,10 @@ requestTemperatures KEYWORD2 isConversionComplete KEYWORD2 getAddress KEYWORD2 +setResolution KEYWORD2 +getResolution KEYWORD2 +getTempCentiC KEYWORD2 + # Constants (LITERAL1) DS18B20_INT_LIB_VERSION LITERAL1 diff --git a/libraries/DS18B20_INT/library.json b/libraries/DS18B20_INT/library.json index 5d765b19..dbb79c63 100644 --- a/libraries/DS18B20_INT/library.json +++ b/libraries/DS18B20_INT/library.json @@ -23,7 +23,7 @@ "version": "^2.3.5" } ], - "version": "0.1.7", + "version": "0.2.0", "license": "MIT", "frameworks": "arduino", "platforms": "*", diff --git a/libraries/DS18B20_INT/library.properties b/libraries/DS18B20_INT/library.properties index c1b3db3a..a0060cce 100644 --- a/libraries/DS18B20_INT/library.properties +++ b/libraries/DS18B20_INT/library.properties @@ -1,5 +1,5 @@ name=DS18B20_int -version=0.1.7 +version=0.2.0 author=Rob Tillaart maintainer=Rob Tillaart sentence=Library for DS18B20 restricted to a single sensor per pin.