Arduino library for the SHT85 temperature and humidity sensor.
Based upon the SHT31 library - https://github.com/RobTillaart/SHT31 however this library will be leading in the future as it implements derived classes for the following sensors: SHT30, SHT31, SHT35 and SHT85.
WARNING to keep self-heating below 0.1°C, the SHT85 sensor should not be used for more than 10% of the time.
Always check datasheet before connecting!
// TOPVIEW SHT85
// +-------+
// +-----\ | SDA 4 -----
// | /-+ ----+ GND 3 -----
// | +-+ ----+ +5V 2 -----
// +-----/ | SCL 1 -----
// +-------+
The SHT85 sensors should work (I2C) up to 1000 KHz. During tests with an Arduino UNO it stopped between 500 - 550 KHz. So to be safe I recommend not to use the sensor above 400 KHz. Also the differences in read time becomes quite small. (max 15% gain).
See indicative output example sketch. SPS (= samples per second) are added later.
I2C speed | read ms | SPS | notes |
---|---|---|---|
50 KHz | 6.60 | 123 | |
100 KHz | 5.11 | 140 | default |
150 KHz | 4.79 | ||
200 KHz | 4.64 | 140 | |
250 KHz | 4.56 | ||
300 KHz | 4.50 | 164 | |
350 KHz | 4.47 | ||
400 KHz | 4.45 | 164 | |
450 KHz | 4.43 | ||
500 KHz | 4.42 | 163 | |
550 KHz | ---- | fail |
At 10% load the SHT85 can be used to make about 10 - 15 SPS.
The SHT85 is protocol compatible with the SHT3x series. Main difference is the accuracy and the SHT85 only has address 0x44. Compare the data sheets to see all differences.
Accuracy table:
Sensor | Temperature | Humidity | Verified } |
---|---|---|---|
SHT30 | ~0.3° | 2.0% | N |
SHT31 | ~0.3° | 1.5% | Y |
SHT35 | ~0.2° | 1.5% | N |
SHT85 | ~0.2° | 1.5% | Y |
Note: The SHT40, SHT41 and SHT45 are not protocol compatible with SHT3x and SHT85. The SHT4x series is slightly faster than the SHT3x series.
The SHT3x comes with two I2C address options, 0x44 and 0x45. The SHT85 only has 0x44 as I2C address, so it is not possible to have more than one on a single I2C bus. This means you need to use multiple I2C buses (if your board support this), a software I2C (below) or an I2C multiplexer e.g. https://github.com/RobTillaart/TCA9548
Version 0.6.0 introduced a breaking change. The parameters from begin() moved to the constructor. You cannot set the pins in begin() any more. This reduces the dependency of processor dependent Wire implementations. The user has to call Wire.begin() and can optionally set the Wire pins before calling begin().
An elaborated library for the SHT31 sensor can be found here
Dewpoint, heatindex, related functions and conversions.
I2C multiplexer
#include "SHT85.h"
Note: the medium level is not supported (yet).
See async example for usage.
Note that the temperature and humidity values are recalculated on every call to getHumidity() and getTemperature(). If you're worried about the extra cycles, you should make sure to cache these values or only request them after you've performed a new read().
The getRawHumidity() and getRawTemperature() can be used to minimize storage or communication as the data type is 50% smaller. Another application is faster comparison with a previous value or threshold. However comparisons are quite fast.
The library has no CelsiusToRaw() function although this is relative easy.
rawTemperatureC = (tempC + 45) * (65535 / 175.0);
rawTemperatureF = (tempF + 49) * (65535 / 315.0);
rawHumidity = humidity * 655.35;
Default the offset is zero for both temperature and humidity. These functions allows one to adjust them a little. Note there is no limit to the offset so one can use huge values. This allows to use an offset of 273.15 effectively creating °Kelvin instead of Celsius.
Note: the offset is defined in degrees Celsius. To set an offset in degrees Fahrenheit, multiply the Fahrenheit offset with 0.55555556 to get Celsius steps (divide by 1.8 is slower). So an offset of 4 °F becomes 2.2222 °C.
Error | Symbolic | Description |
---|---|---|
0x00 | SHT_OK | no error |
0x81 | SHT_ERR_WRITECMD | I2C write failed |
0x82 | SHT_ERR_READBYTES | I2C read failed |
0x83 | SHT_ERR_HEATER_OFF | Could not switch off heater |
0x84 | SHT_ERR_NOT_CONNECT | Could not connect |
0x85 | SHT_ERR_CRC_TEMP | CRC error in temperature |
0x86 | SHT_ERR_CRC_HUM | CRC error in humidity |
0x87 | SHT_ERR_CRC_STATUS | CRC error in status field |
0x88 | SHT_ERR_HEATER_COOLDOWN | Heater need to cool down |
0x89 | SHT_ERR_HEATER_ON | Could not switch on heater |
0x8A | SHT_ERR_SERIAL | Could not read serial number |
WARNING: Do not use heater for long periods.
Use the heater for max 180 seconds, and let it cool down 180 seconds = 3 minutes. Version 0.3.3 and up guards the cool down time by preventing switching the heater on within 180 seconds of the last switch off. Note: this guarding is not reboot persistent.
WARNING: The user is responsible to switch the heater off manually!
The class does NOT do this automatically. Switch off the heater by explicitly calling heatOff() or indirectly by calling isHeaterOn().
BIT | Description | value | notes |
---|---|---|---|
15 | Alert pending status | 0 | no pending alerts |
1 | at least one pending alert - default | ||
14 | Reserved | 0 | |
13 | Heater status | 0 | Heater OFF - default |
1 | Heater ON | ||
12 | Reserved | 0 | |
11 | Humidity tracking alert | 0 | no alert - default |
1 | alert | ||
10 | Temperature tracking alert | 0 | no alert - default |
1 | alert | ||
9-5 | Reserved | 00000 | reserved |
4 | System reset detected | 0 | no reset since last clear status register command |
1 | reset detected (hard or soft reset command or supply fail) - default | ||
3-2 | Reserved | 00 | |
1 | Command status | 0 | last command executed successfully |
1 | last command not processed. Invalid or failed checksum | ||
0 | Write data checksum status | 0 | checksum of last write correct |
1 | checksum of last write transfer failed |
If you appreciate my libraries, you can support the development and maintenance. Improve the quality of the libraries by providing issues and Pull Requests, or donate through PayPal or GitHub sponsors.
Thank you,