[![Arduino CI](https://github.com/robtillaart/SHT85/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci) [![GitHub release](https://img.shields.io/github/release/RobTillaart/SHT85.svg?maxAge=3600)](https://github.com/RobTillaart/SHT85/releases) [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/SHT85/blob/master/LICENSE) # SHT85 Arduino library for the SHT85 temperature and humidity sensor Based upon the SHT31 library - https://github.com/RobTillaart/SHT31 **Warning:** to keep self-heating below 0.1°C, the SHT85 sensor should not be used for more than 10% of the time. ## Description ``` // TOPVIEW // +-------+ // +-----\ | SDA 4 ----- // | /-+ ----+ VCC 3 ----- // | +-+ ----+ GND 2 ----- // +-----/ | SCL 1 ----- // +-------+ ``` The SHT85 sensors should work up to 1000 KHz, however during tests with an Arduino UNO it stopped at ~500 KHz so to be safe I recommend not to use it above 400 KHz. Also the differences in readtime becomes quite small. (max 15% gain). See output example sketch. | I2C speed | read ms | notes | |:---------:|:-------:|:------| | 100 KHz | 5.11 | | | 150 KHz | 4.79 | | | 200 KHz | 4.64 | | | 250 KHz | 4.56 | | | 300 KHz | 4.50 | | | 350 KHz | 4.47 | | | 400 KHz | 4.45 | | | 450 KHz | 4.43 | | | 500 KHz | 4.42 | | | 550 KHz | ---- | fail | ### Compatibility This library should also work for SHT30, SHT31 and SHT35 but this is not verified yet. | SENSOR | Temperature accuracy | Humidity accuracy | |:----:|:----:|:----:| | SHT30 | ~0.3 | 2.0 | | SHT31 | ~0.3 | 1.5 | | SHT35 | ~0.2 | 1.5 | | SHT85 | ~0.2 | 1.5 | Need to investigate if the interface is identical? If so the libraries might be merged. ## Interface #### Base interface - **SHT85()** constructor. - **begin(address, dataPin, clockPin)** begin function for ESP8266 & ESP32; **WARNING: not verified yet** returns false if device address is incorrect or device cannot be reset. - **begin(address, TwoWire \*wire = &Wire)** for platforms with multiple I2C busses. - **read(bool fast = true)** blocks 4 (fast) or 15 (slow) milliseconds + actual read + math. Does read both the temperature and humidity. - **isConnected()** check sensor is reachable over I2C. Returns false if not connected. - **uint16_t readStatus()** details see datasheet and **Status fields** below - **uint32_t lastRead()** in milliSeconds since start of program. - **reset(bool hard = false)** resets the sensor, soft reset by default. Returns false if fails. - **getHumidity()** returns relative humidity in %. Needs a **read()** to update. - **getTemperature()** returns temperature in °C. Needs a **read()** to update. #### Error interface - **getError()** returns last set error flag and clear it. Be sure to clear the error flag by calling **getError()** before calling any command as the error flag could be from a previous command. | 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 statusfield | #### Heater interface Use the heater for max **180** seconds, and let it cool down an equal period of time. **WARNING:** Do not use heater for long periods. **WARNING:** The user is responsible to switch the heater off manually! The class does **NOT** do this automatically. - **setHeatTimeout(uint8_t seconds)** Set the time out of the heat cycle. This value is truncated to max 180 seconds. - **heatOn()** switches heat cycle on. Returns false if fails. - **heatOff()** switches heat cycle off. Returns false if fails. - **isHeaterOn()** is the sensor still in heating cycle? replaces **heatUp()**. Will switch heat off if max heating time has passed. - **heatUp()** will be obsolete in the future. #### Async interface See async example for usage - **requestData()** requests a new measurement. Returns false if this fails. - **dataReady()** checks if enough time has passed to read the data. (typical 15 millis) - **readData(bool fast = true)** fast skips CRC check. Returns false if reading fails or in case of a CRC fail. ## Status fields | BIT | Description | values | |:----:|:----|:----| | 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' | | 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 cmd executed successfully | | | | '1': last cmd not processed. Invalid or failed checksum | | 0 | Write data checksum status | '0': checksum of last write correct | | | | '1': checksum of last write transfer failed | ## Future - verify working with ESP32 - merge with other SHT sensors if possible - investigate command ART (auto sampling at 4 Hz) - investigate command BREAK (stop auto sampling) - direct Fahrenheit formula ## Operation See examples