├── .arduino-ci.yml ├── .github ├── FUNDING.yml └── workflows │ ├── arduino-lint.yml │ ├── arduino_test_runner.yml │ └── jsoncheck.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── SHT85.cpp ├── SHT85.h ├── examples ├── SHT85_I2C_speed │ └── SHT85_I2C_speed.ino ├── SHT85_demo │ └── SHT85_demo.ino ├── SHT85_demo_async │ └── SHT85_demo_async.ino ├── SHT85_demo_offset │ └── SHT85_demo_offset.ino ├── SHT85_demo_plotter │ └── SHT85_demo_plotter.ino ├── SHT85_multiplex │ ├── .arduino-ci.yml │ └── SHT85_multiplex.ino └── sht30_test_address │ └── sht30_test_address.ino ├── keywords.txt ├── library.json ├── library.properties └── test └── unit_test_001.cpp /.arduino-ci.yml: -------------------------------------------------------------------------------- 1 | platforms: 2 | rpipico: 3 | board: rp2040:rp2040:rpipico 4 | package: rp2040:rp2040 5 | gcc: 6 | features: 7 | defines: 8 | - ARDUINO_ARCH_RP2040 9 | warnings: 10 | flags: 11 | 12 | packages: 13 | rp2040:rp2040: 14 | url: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json 15 | 16 | compile: 17 | # Choosing to run compilation tests on 2 different Arduino platforms 18 | platforms: 19 | - uno 20 | # - due 21 | # - zero 22 | # - leonardo 23 | - m4 24 | - esp32 25 | - esp8266 26 | # - mega2560 27 | - rpipico 28 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: RobTillaart 4 | custom: "https://www.paypal.me/robtillaart" 5 | -------------------------------------------------------------------------------- /.github/workflows/arduino-lint.yml: -------------------------------------------------------------------------------- 1 | name: Arduino-lint 2 | 3 | on: [push, pull_request] 4 | jobs: 5 | lint: 6 | runs-on: ubuntu-latest 7 | timeout-minutes: 5 8 | steps: 9 | - uses: actions/checkout@v4 10 | - uses: arduino/arduino-lint-action@v1 11 | with: 12 | library-manager: update 13 | compliance: strict -------------------------------------------------------------------------------- /.github/workflows/arduino_test_runner.yml: -------------------------------------------------------------------------------- 1 | name: Arduino CI 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | runTest: 7 | runs-on: ubuntu-latest 8 | timeout-minutes: 20 9 | 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: ruby/setup-ruby@v1 13 | with: 14 | ruby-version: 2.6 15 | - run: | 16 | gem install arduino_ci 17 | arduino_ci.rb 18 | -------------------------------------------------------------------------------- /.github/workflows/jsoncheck.yml: -------------------------------------------------------------------------------- 1 | name: JSON check 2 | 3 | on: 4 | push: 5 | paths: 6 | - '**.json' 7 | pull_request: 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | timeout-minutes: 5 13 | steps: 14 | - uses: actions/checkout@v4 15 | - name: json-syntax-check 16 | uses: limitusus/json-syntax-check@v2 17 | with: 18 | pattern: "\\.json$" -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log SHT85 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](http://keepachangelog.com/) 6 | and this project adheres to [Semantic Versioning](http://semver.org/). 7 | 8 | 9 | ## [0.6.2] - 2025-05-10 10 | - fix #30, sync SHT31 getSerialNumber 11 | - changed defines for commands in static constexpr (.cpp) 12 | - update examples 13 | - update readme.md 14 | - update keywords.txt 15 | - minor edits 16 | 17 | ## [0.6.1] - 2025-04-28 18 | - add **clearStatus()**, kudos to Elbandi (see SHT31) 19 | - update readme.md 20 | - add example SHT30_test_address.ino 21 | - minor edits 22 | 23 | ## [0.6.0] - 2023-12-09 24 | - refactor API, move parameters from begin() to constructor 25 | - update readme.md 26 | - update examples 27 | - minor edits 28 | 29 | ---- 30 | 31 | ## [0.5.1] - 2023-09-21 32 | - fix #21, again ... 33 | 34 | ## [0.5.0] - 2023-09-21 35 | - fix #21, support Wire1 for ESP32 36 | - move TwoWire selection to constructor. 37 | - update readme.md 38 | 39 | ---- 40 | 41 | ## [0.4.2] - 2023-09-05 42 | - fix #19 SHT85 cannot be address 0x45 43 | - rewrote begin() 44 | - removed example SHT85_duo 45 | - add example SHT85_multiplex 46 | - add section about multiple SHT85 to readme.md 47 | - redo badges in readme.md 48 | - minor edits 49 | 50 | ## [0.4.1] - 2022-05-09 51 | - add **uint32_t getSerialNumber()** for SHT85 (no CRC check). 52 | - improve error handling. 53 | - update readme.md 54 | 55 | ## [0.4.0] - 2022-12-14 56 | - redo asynchronous interface 57 | - add **uint32_t getLastRequest()** timestamp. 58 | - add offset functions for temperature and humidity. 59 | - update readme.md 60 | - move code from .h to .cpp 61 | - updated unit test 62 | - add examples 63 | - update keywords.txt 64 | - update GitHub actions 65 | - update license 2023 66 | - minor edits 67 | 68 | ---- 69 | 70 | ## [0.3.3] - 2022-11-24 71 | - Add RP2040 support to build-CI. 72 | - Add CHANGELOG.md 73 | 74 | ## [0.3.2] - 2022-01-17 75 | - fix #8 add SHT_DEFAULT_ADDRESS + 2x begin() 76 | 77 | ## [0.3.1] - 2021-12-28 78 | - update library.json 79 | - update readme.md 80 | - update license 81 | - minor edits 82 | 83 | ## [0.3.0] - 2021-10-20 84 | - Fix #6 image in documentation, 85 | - pdate build-CI 86 | 87 | ---- 88 | 89 | ## [0.2.0] - 2021-08-24 90 | - split off base class 91 | - create derived classes SHT85, 30, 31, 35 92 | 93 | ---- 94 | 95 | ## [0.1.4] - 2021-08-24 96 | - prevent heater to switch on too fast. 97 | - update readme 98 | 99 | ## [0.1.3] - 2021-08-06 100 | - expose raw data from sensor 101 | 102 | ## [0.1.2] - 2021-05-27 103 | - fix Arduino-lint 104 | 105 | ## [0.1.1] - 2021-03-13 106 | - initial release 107 | 108 | ## [0.1.0] - 2021-02-10 109 | - initial version 110 | 111 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021-2025 Rob Tillaart 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RobTillaart/SHT85/66a9729ec605a306d7addcd36ea1a7373408156b/README.md -------------------------------------------------------------------------------- /SHT85.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // FILE: SHT85.cpp 3 | // AUTHOR: Rob Tillaart 4 | // VERSION: 0.6.2 5 | // DATE: 2021-02-10 6 | // PURPOSE: Arduino library for the SHT85 temperature and humidity sensor 7 | // https://nl.rs-online.com/web/p/temperature-humidity-sensor-ics/1826530 8 | // URL: https://github.com/RobTillaart/SHT85 9 | 10 | 11 | 12 | #include "SHT85.h" 13 | 14 | 15 | // SUPPORTED COMMANDS - single shot mode only 16 | static constexpr uint16_t SHT_READ_STATUS = 0xF32D; 17 | static constexpr uint16_t SHT_CLEAR_STATUS = 0x3041; 18 | 19 | static constexpr uint16_t SHT_SOFT_RESET = 0x30A2; 20 | static constexpr uint16_t SHT_HARD_RESET = 0x0006; 21 | 22 | static constexpr uint16_t SHT_MEASUREMENT_FAST = 0x2416; // page 10 datasheet 23 | static constexpr uint16_t SHT_MEASUREMENT_SLOW = 0x2400; // no clock stretching 24 | 25 | static constexpr uint16_t SHT_HEAT_ON = 0x306D; 26 | static constexpr uint16_t SHT_HEAT_OFF = 0x3066; 27 | static constexpr uint32_t SHT_HEATER_TIMEOUT = 180000UL; // milliseconds 28 | 29 | static constexpr uint16_t SHT_GET_SERIAL_NUMBER = 0x3682; // no clock stretching 30 | 31 | 32 | SHT::SHT(uint8_t address, TwoWire *wire) 33 | { 34 | _address = address; 35 | _wire = wire; 36 | _lastRead = 0; 37 | _rawTemperature = 0; 38 | _rawHumidity = 0; 39 | _heatTimeout = 0; 40 | _heaterStart = 0; 41 | _heaterStop = 0; 42 | _heaterOn = false; 43 | _error = SHT_OK; 44 | _type = 0; 45 | _temperatureOffset = 0; 46 | _humidityOffset = 0; 47 | } 48 | 49 | 50 | bool SHT::begin() 51 | { 52 | if ((_address != 0x44) && (_address != 0x45)) 53 | { 54 | return false; 55 | } 56 | return reset(); 57 | } 58 | 59 | 60 | uint8_t SHT::getAddress() 61 | { 62 | return _address; 63 | } 64 | 65 | 66 | uint8_t SHT::getType() 67 | { 68 | return _type; 69 | } 70 | 71 | 72 | /////////////////////////////////////////////////// 73 | // 74 | // SYNCHRONUOUS interface 75 | // 76 | bool SHT::read(bool fast) 77 | { 78 | // prevent error on failed request. 79 | if (requestData(fast) == false) 80 | { 81 | return false; 82 | } 83 | while(dataReady(fast) == false) yield(); 84 | return readData(fast); 85 | } 86 | 87 | 88 | /////////////////////////////////////////////////// 89 | // 90 | // ASYNCHRONUOUS interface 91 | // 92 | bool SHT::requestData(bool fast) 93 | { 94 | if (writeCmd(fast ? SHT_MEASUREMENT_FAST : SHT_MEASUREMENT_SLOW) == false) 95 | { 96 | return false; 97 | } 98 | _lastRequest = millis(); 99 | return true; 100 | } 101 | 102 | 103 | bool SHT::dataReady(bool fast) 104 | { 105 | return ((millis() - _lastRequest) > (fast ? 4 : 15)); 106 | } 107 | 108 | 109 | bool SHT::readData(bool fast) 110 | { 111 | uint8_t buffer[6]; 112 | if (readBytes(6, (uint8_t*) &buffer[0]) == false) 113 | { 114 | return false; 115 | } 116 | 117 | if (!fast) 118 | { 119 | if (buffer[2] != crc8(buffer, 2)) 120 | { 121 | _error = SHT_ERR_CRC_TEMP; 122 | return false; 123 | } 124 | if (buffer[5] != crc8(buffer + 3, 2)) 125 | { 126 | _error = SHT_ERR_CRC_HUM; 127 | return false; 128 | } 129 | } 130 | 131 | _rawTemperature = (buffer[0] << 8) + buffer[1]; 132 | _rawHumidity = (buffer[3] << 8) + buffer[4]; 133 | 134 | _lastRead = millis(); 135 | 136 | _error = SHT_OK; 137 | return true; 138 | } 139 | 140 | 141 | uint32_t SHT::lastRequest() 142 | { 143 | return _lastRequest; 144 | } 145 | 146 | 147 | /////////////////////////////////////////////////// 148 | // 149 | // STATUS 150 | // 151 | bool SHT::isConnected() 152 | { 153 | _wire->beginTransmission(_address); 154 | int rv = _wire->endTransmission(); 155 | if (rv != 0) 156 | { 157 | _error = SHT_ERR_NOT_CONNECT; 158 | return false; 159 | } 160 | _error = SHT_OK; 161 | return true; 162 | } 163 | 164 | 165 | #ifdef doc 166 | // bit - description 167 | // ================== 168 | // 15 Alert pending status 169 | // '0': no pending alerts 170 | // '1': at least one pending alert - default 171 | // 14 Reserved ‘0’ 172 | // 13 Heater status 173 | // '0’ : Heater OFF - default 174 | // '1’ : Heater ON 175 | // 12 Reserved '0’ 176 | // 11 Humidity tracking alert 177 | // '0’ : no alert - default 178 | // '1’ : alert 179 | // 10 Temp tracking alert 180 | // '0’ : no alert - default 181 | // '1’ : alert 182 | // 9:5 Reserved '00000’ 183 | // 4 System reset detected 184 | // '0': no reset since last ‘clear status register’ command 185 | // '1': reset detected (hard or soft reset command or supply fail) - default 186 | // 3:2 Reserved ‘00’ 187 | // 1 Command status 188 | // '0': last command executed successfully 189 | // '1': last command not processed. Invalid or failed checksum 190 | // 0 Write data checksum status 191 | // '0': checksum of last write correct 192 | // '1': checksum of last write transfer failed 193 | #endif 194 | 195 | 196 | uint16_t SHT::readStatus() 197 | { 198 | uint8_t status[3] = { 0, 0, 0 }; 199 | // page 13 datasheet 200 | if (writeCmd(SHT_READ_STATUS) == false) 201 | { 202 | return 0xFFFF; 203 | } 204 | // 16 bit status + CRC 205 | if (readBytes(3, (uint8_t*) &status[0]) == false) 206 | { 207 | return 0xFFFF; 208 | } 209 | 210 | if (status[2] != crc8(status, 2)) 211 | { 212 | _error = SHT_ERR_CRC_STATUS; 213 | return 0xFFFF; 214 | } 215 | return (uint16_t) (status[0] << 8) + status[1]; 216 | } 217 | 218 | 219 | // resets the following bits 220 | // 15 Alert pending status 221 | // 11 Humidity tracking alert 222 | // 10 Temp tracking alert 223 | // 4 System reset detected 224 | bool SHT::clearStatus() 225 | { 226 | if (writeCmd(SHT_CLEAR_STATUS) == false) 227 | { 228 | return false; 229 | } 230 | return true; 231 | } 232 | 233 | 234 | uint32_t SHT::lastRead() 235 | { 236 | return _lastRead; 237 | } 238 | 239 | 240 | bool SHT::reset(bool hard) 241 | { 242 | bool b = writeCmd(hard ? SHT_HARD_RESET : SHT_SOFT_RESET); 243 | if (b == false) 244 | { 245 | return false; 246 | } 247 | delay(1); // table 4 datasheet 248 | return true; 249 | } 250 | 251 | 252 | int SHT::getError() 253 | { 254 | int rv = _error; 255 | _error = SHT_OK; 256 | return rv; 257 | } 258 | 259 | 260 | /////////////////////////////////////////////////// 261 | // 262 | // HEATER 263 | // 264 | void SHT::setHeatTimeout(uint8_t seconds) 265 | { 266 | _heatTimeout = seconds; 267 | if (_heatTimeout > 180) _heatTimeout = 180; 268 | } 269 | 270 | 271 | uint8_t SHT::getHeatTimeout() 272 | { 273 | return _heatTimeout; 274 | } 275 | 276 | 277 | bool SHT::heatOn() 278 | { 279 | if (isHeaterOn()) return true; 280 | if ((_heaterStop > 0) && (millis() - _heaterStop < SHT_HEATER_TIMEOUT)) 281 | { 282 | _error = SHT_ERR_HEATER_COOLDOWN; 283 | return false; 284 | } 285 | if (writeCmd(SHT_HEAT_ON) == false) 286 | { 287 | _error = SHT_ERR_HEATER_ON; // more specific error! 288 | return false; 289 | } 290 | _heaterStart = millis(); 291 | _heaterOn = true; 292 | return true; 293 | } 294 | 295 | 296 | bool SHT::heatOff() 297 | { 298 | // always switch off the heater - ignore _heaterOn flag. 299 | if (writeCmd(SHT_HEAT_OFF) == false) 300 | { 301 | _error = SHT_ERR_HEATER_OFF; // can be serious! 302 | return false; 303 | } 304 | _heaterStop = millis(); 305 | _heaterOn = false; 306 | return true; 307 | } 308 | 309 | 310 | bool SHT::isHeaterOn() 311 | { 312 | if (_heaterOn == false) 313 | { 314 | return false; 315 | } 316 | // did not exceed time out 317 | if (millis() - _heaterStart < (_heatTimeout * 1000UL)) 318 | { 319 | return true; 320 | } 321 | heatOff(); 322 | return false; 323 | } 324 | 325 | 326 | ////////////////////////////////////////////////////////// 327 | // 328 | // TEMPERATURE & HUMIDITY 329 | // 330 | float SHT::getHumidity() 331 | { 332 | float hum = _rawHumidity * (100.0 / 65535); 333 | if (_humidityOffset != 0) hum += _humidityOffset; 334 | return hum; 335 | } 336 | 337 | 338 | float SHT::getTemperature() 339 | { 340 | float temp = _rawTemperature * (175.0 / 65535) - 45; 341 | if (_temperatureOffset != 0) temp += _temperatureOffset; 342 | return temp; 343 | } 344 | 345 | 346 | float SHT::getFahrenheit() 347 | { 348 | float temp = _rawTemperature * (63.0 / 13107.0) - 49; 349 | if (_temperatureOffset != 0) temp += _temperatureOffset * 1.8; 350 | return temp; 351 | } 352 | 353 | 354 | uint16_t SHT::getRawHumidity() 355 | { 356 | return _rawHumidity; 357 | } 358 | 359 | 360 | uint16_t SHT::getRawTemperature() 361 | { 362 | return _rawTemperature; 363 | } 364 | 365 | 366 | void SHT::setTemperatureOffset(float offset) 367 | { 368 | _temperatureOffset = offset; 369 | } 370 | 371 | 372 | float SHT::getTemperatureOffset() 373 | { 374 | return _temperatureOffset; 375 | } 376 | 377 | 378 | void SHT::setHumidityOffset(float offset) 379 | { 380 | _humidityOffset = offset; 381 | } 382 | 383 | 384 | float SHT::getHumidityOffset() 385 | { 386 | return _humidityOffset; 387 | } 388 | 389 | 390 | ////////////////////////////////////////////////////////// 391 | // 392 | // PROTECTED 393 | // 394 | uint8_t SHT::crc8(const uint8_t *data, uint8_t len) 395 | { 396 | // CRC-8 formula from page 14 of SHT spec pdf 397 | const uint8_t POLY(0x31); 398 | uint8_t crc(0xFF); 399 | 400 | for (uint8_t j = len; j; --j) 401 | { 402 | crc ^= *data++; 403 | 404 | for (uint8_t i = 8; i; --i) 405 | { 406 | crc = (crc & 0x80) ? (crc << 1) ^ POLY : (crc << 1); 407 | } 408 | } 409 | return crc; 410 | } 411 | 412 | 413 | bool SHT::writeCmd(uint16_t cmd) 414 | { 415 | _wire->beginTransmission(_address); 416 | _wire->write(cmd >> 8 ); 417 | _wire->write(cmd & 0xFF); 418 | if (_wire->endTransmission() != 0) 419 | { 420 | _error = SHT_ERR_WRITECMD; 421 | return false; 422 | } 423 | _error = SHT_OK; 424 | return true; 425 | } 426 | 427 | 428 | bool SHT::readBytes(uint8_t n, uint8_t *val) 429 | { 430 | int rv = _wire->requestFrom(_address, (uint8_t) n); 431 | if (rv != n) 432 | { 433 | _error = SHT_ERR_READBYTES; 434 | return false; 435 | } 436 | for (uint8_t i = 0; i < n; i++) 437 | { 438 | val[i] = _wire->read(); 439 | } 440 | _error = SHT_OK; 441 | return true; 442 | } 443 | 444 | 445 | bool SHT::getSerialNumber(uint32_t &serial, bool fast) { 446 | if (writeCmd(SHT_GET_SERIAL_NUMBER) == false) { 447 | return false; 448 | } 449 | delayMicroseconds(500); // timing sensitive. 450 | uint8_t buffer[6]; 451 | if (readBytes(6, &buffer[0]) == false) { 452 | return false; 453 | } 454 | 455 | if (!fast) { 456 | if (buffer[2] != crc8(buffer, 2)) { 457 | _error = SHT_ERR_SERIAL_NUMBER_CRC; 458 | return false; 459 | } 460 | if (buffer[5] != crc8(buffer + 3, 2)) { 461 | _error = SHT_ERR_SERIAL_NUMBER_CRC; 462 | return false; 463 | } 464 | } 465 | serial = buffer[0]; 466 | serial <<= 8; 467 | serial += buffer[1]; 468 | serial <<= 8; 469 | serial += buffer[3]; 470 | serial <<= 8; 471 | serial += buffer[4]; 472 | return true; 473 | } 474 | 475 | 476 | //////////////////////////////////////////////////////// 477 | // 478 | // DERIVED CLASSES 479 | // 480 | SHT30::SHT30(uint8_t address, TwoWire *wire) : SHT(address, wire) 481 | { 482 | _type = 30; 483 | } 484 | 485 | 486 | SHT31::SHT31(uint8_t address, TwoWire *wire) : SHT(address, wire) 487 | { 488 | _type = 31; 489 | } 490 | 491 | 492 | SHT35::SHT35(uint8_t address, TwoWire *wire) : SHT(address, wire) 493 | { 494 | _type = 35; 495 | } 496 | 497 | 498 | SHT85::SHT85(uint8_t address, TwoWire *wire) : SHT(address, wire) 499 | { 500 | _type = 85; 501 | } 502 | 503 | 504 | bool SHT85::begin() 505 | { 506 | if (_address != 0x44) return false; 507 | return SHT::begin(); 508 | } 509 | 510 | 511 | // -- END OF FILE -- 512 | 513 | -------------------------------------------------------------------------------- /SHT85.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | // 3 | // FILE: SHT85.h 4 | // AUTHOR: Rob Tillaart 5 | // VERSION: 0.6.2 6 | // DATE: 2021-02-10 7 | // PURPOSE: Arduino library for the SHT85 temperature and humidity sensor 8 | // https://nl.rs-online.com/web/p/temperature-humidity-sensor-ics/1826530 9 | // URL: https://github.com/RobTillaart/SHT85 10 | // 11 | // keep lib in sync with https://github.com/RobTillaart/SHT31 12 | // 13 | // ALWAYS check datasheet for connections. 14 | // 15 | // TOPVIEW SHT85 16 | // +-------+ 17 | // +-----\ | SDA 4 ----- 18 | // | +-+ ----+ GND 3 ----- 19 | // | +-+ ----+ +5V 2 ----- 20 | // +-----/ | SCL 1 ----- 21 | // +-------+ 22 | 23 | 24 | #include "Arduino.h" 25 | #include "Wire.h" 26 | 27 | 28 | #define SHT_LIB_VERSION (F("0.6.2")) 29 | #define SHT85_LIB_VERSION SHT_LIB_VERSION 30 | 31 | #ifndef SHT_DEFAULT_ADDRESS 32 | #define SHT_DEFAULT_ADDRESS 0x44 33 | #endif 34 | 35 | // fields readStatus 36 | #define SHT_STATUS_ALERT_PENDING (1 << 15) 37 | #define SHT_STATUS_HEATER_ON (1 << 13) 38 | #define SHT_STATUS_HUM_TRACK_ALERT (1 << 11) 39 | #define SHT_STATUS_TEMP_TRACK_ALERT (1 << 10) 40 | #define SHT_STATUS_SYSTEM_RESET (1 << 4) 41 | #define SHT_STATUS_COMMAND_STATUS (1 << 1) 42 | #define SHT_STATUS_WRITE_CRC_STATUS (1 << 0) 43 | 44 | // error codes 45 | #define SHT_OK 0x00 46 | #define SHT_ERR_WRITECMD 0x81 47 | #define SHT_ERR_READBYTES 0x82 48 | #define SHT_ERR_HEATER_OFF 0x83 49 | #define SHT_ERR_NOT_CONNECT 0x84 50 | #define SHT_ERR_CRC_TEMP 0x85 51 | #define SHT_ERR_CRC_HUM 0x86 52 | #define SHT_ERR_CRC_STATUS 0x87 53 | #define SHT_ERR_HEATER_COOLDOWN 0x88 54 | #define SHT_ERR_HEATER_ON 0x89 55 | #define SHT_ERR_SERIAL_NUMBER_CRC 0x8A 56 | 57 | 58 | class SHT 59 | { 60 | public: 61 | SHT(uint8_t address, TwoWire *wire = &Wire); 62 | 63 | bool begin(); 64 | uint8_t getAddress(); 65 | uint8_t getType(); 66 | 67 | 68 | // SYNCHRONOUS INTERFACE 69 | // read blocks 4 or 15 milliseconds + actual read + math 70 | bool read(bool fast = true); 71 | 72 | 73 | // ASYNCHRONOUS INTERFACE 74 | bool requestData(bool fast = true); 75 | bool dataReady(bool fast = true); 76 | bool readData(bool fast = true); 77 | uint32_t lastRequest(); 78 | 79 | 80 | // STATUS 81 | // check sensor is reachable over I2C 82 | bool isConnected(); 83 | 84 | // details see datasheet; summary in SHT85.cpp file 85 | uint16_t readStatus(); 86 | bool clearStatus(); 87 | 88 | // lastRead is in milliSeconds since start 89 | uint32_t lastRead(); 90 | 91 | bool reset(bool hard = false); 92 | 93 | // returns last error and clears error flag 94 | int getError(); 95 | 96 | 97 | // HEATER 98 | // do not use heater for long periods, 99 | // use it for max 3 minutes to heat up 100 | // and let it cool down at least 3 minutes. 101 | void setHeatTimeout(uint8_t seconds); 102 | uint8_t getHeatTimeout(); 103 | bool heatOn(); 104 | bool heatOff(); 105 | // is the sensor still heating up? 106 | bool isHeaterOn(); 107 | 108 | 109 | // TEMPERATURE & HUMIDITY 110 | float getHumidity(); 111 | float getTemperature(); 112 | float getFahrenheit(); 113 | uint16_t getRawHumidity(); 114 | uint16_t getRawTemperature(); 115 | 116 | // TEMPERATURE & HUMIDITY OFFSET 117 | void setTemperatureOffset(float offset = 0); 118 | float getTemperatureOffset(); 119 | void setHumidityOffset(float offset = 0); 120 | float getHumidityOffset(); 121 | 122 | // fast == true, => skips CRC check 123 | bool getSerialNumber(uint32_t &serial, bool fast = true); 124 | 125 | 126 | protected: 127 | uint8_t crc8(const uint8_t *data, uint8_t len); 128 | bool writeCmd(uint16_t cmd); 129 | bool readBytes(uint8_t n, uint8_t *val); 130 | TwoWire* _wire; 131 | 132 | uint8_t _address; 133 | uint8_t _heatTimeout; // seconds 134 | uint32_t _lastRead; 135 | uint32_t _lastRequest; // for async interface 136 | uint32_t _heaterStart; // timestamp 137 | uint32_t _heaterStop; // timestamp 138 | bool _heaterOn; 139 | uint8_t _type; // base class = 0 140 | 141 | uint16_t _rawHumidity; 142 | uint16_t _rawTemperature; 143 | 144 | // offset in degrees Celsius 145 | float _temperatureOffset = 0; 146 | float _humidityOffset = 0; 147 | 148 | uint8_t _error; 149 | }; 150 | 151 | 152 | 153 | //////////////////////////////////////////////////////// 154 | // 155 | // DERIVED CLASSES 156 | // 157 | class SHT30 : public SHT 158 | { 159 | public: 160 | SHT30(uint8_t address, TwoWire *wire = &Wire); 161 | }; 162 | 163 | 164 | class SHT31 : public SHT 165 | { 166 | public: 167 | SHT31(uint8_t address, TwoWire *wire = &Wire); 168 | }; 169 | 170 | 171 | class SHT35 : public SHT 172 | { 173 | public: 174 | SHT35(uint8_t address, TwoWire *wire = &Wire); 175 | }; 176 | 177 | 178 | class SHT85 : public SHT 179 | { 180 | public: 181 | SHT85(uint8_t address, TwoWire *wire = &Wire); 182 | 183 | // catch incorrect calls with an address, only 0x44 allowed, see #19 184 | bool begin(); 185 | }; 186 | 187 | 188 | // -- END OF FILE -- 189 | 190 | -------------------------------------------------------------------------------- /examples/SHT85_I2C_speed/SHT85_I2C_speed.ino: -------------------------------------------------------------------------------- 1 | // 2 | // FILE: SHT85_I2C_speed.ino 3 | // AUTHOR: Rob Tillaart 4 | // PURPOSE: demo 5 | // URL: https://github.com/RobTillaart/SHT85 6 | // 7 | // TOPVIEW SHT85 (check datasheet) 8 | // +-------+ 9 | // +-----\ | SDA 4 ----- 10 | // | +-+ ----+ GND 3 ----- 11 | // | +-+ ----+ +5V 2 ----- 12 | // +-----/ | SCL 1 ----- 13 | // +-------+ 14 | 15 | 16 | #include "SHT85.h" 17 | 18 | #define SHT85_ADDRESS 0x44 19 | 20 | uint32_t start; 21 | uint32_t stop; 22 | 23 | SHT85 sht(SHT85_ADDRESS); 24 | 25 | 26 | void setup() 27 | { 28 | // while(!Serial); // uncomment if needed 29 | Serial.begin(115200); 30 | Serial.println(); 31 | Serial.println(__FILE__); 32 | Serial.print("SHT_LIB_VERSION: \t"); 33 | Serial.println(SHT_LIB_VERSION); 34 | Serial.println(); 35 | 36 | Wire.begin(); 37 | Wire.setClock(100000); 38 | sht.begin(); 39 | for (uint32_t clk = 50000; clk < 550000; clk += 50000) 40 | { 41 | Wire.setClock(clk); 42 | start = micros(); 43 | sht.read(); // default = true/fast slow = false 44 | stop = micros(); 45 | Serial.print(clk); 46 | Serial.print("\t"); 47 | Serial.println((stop - start) * 0.001); 48 | delay(100); 49 | } 50 | Serial.println("\ndone..."); 51 | } 52 | 53 | 54 | void loop() 55 | { 56 | } 57 | 58 | 59 | // -- END OF FILE -- 60 | -------------------------------------------------------------------------------- /examples/SHT85_demo/SHT85_demo.ino: -------------------------------------------------------------------------------- 1 | // 2 | // FILE: SHT85_demo.ino 3 | // AUTHOR: Rob Tillaart 4 | // PURPOSE: demo 5 | // URL: https://github.com/RobTillaart/SHT85 6 | // 7 | // TOPVIEW SHT85 (check datasheet) 8 | // +-------+ 9 | // +-----\ | SDA 4 ----- 10 | // | +-+ ----+ GND 3 ----- 11 | // | +-+ ----+ +5V 2 ----- 12 | // +-----/ | SCL 1 ----- 13 | // +-------+ 14 | 15 | 16 | #include "SHT85.h" 17 | 18 | #define SHT85_ADDRESS 0x44 19 | 20 | uint32_t start; 21 | uint32_t stop; 22 | 23 | SHT85 sht(SHT85_ADDRESS); 24 | 25 | 26 | void setup() 27 | { 28 | // while(!Serial); // uncomment if needed 29 | Serial.begin(115200); 30 | Serial.println(); 31 | Serial.println(__FILE__); 32 | Serial.print("SHT_LIB_VERSION: \t"); 33 | Serial.println(SHT_LIB_VERSION); 34 | Serial.println(); 35 | 36 | Wire.begin(); 37 | Wire.setClock(100000); 38 | sht.begin(); 39 | 40 | uint16_t stat = sht.readStatus(); 41 | Serial.print(stat, HEX); 42 | Serial.println(); 43 | 44 | uint32_t ser; 45 | bool b = sht.getSerialNumber(ser, true); 46 | if (b) 47 | { 48 | Serial.print(ser, HEX); 49 | Serial.println(); 50 | } 51 | else 52 | { 53 | Serial.println("Error: could not get serial number."); 54 | } 55 | delay(1000); 56 | } 57 | 58 | 59 | void loop() 60 | { 61 | start = micros(); 62 | sht.read(); // default = true/fast slow = false 63 | stop = micros(); 64 | 65 | Serial.print("\t"); 66 | Serial.print((stop - start) * 0.001); 67 | Serial.print("\t"); 68 | Serial.print(sht.getTemperature(), 1); 69 | Serial.print("\t"); 70 | Serial.println(sht.getHumidity(), 1); 71 | delay(100); 72 | } 73 | 74 | 75 | // -- END OF FILE -- 76 | 77 | -------------------------------------------------------------------------------- /examples/SHT85_demo_async/SHT85_demo_async.ino: -------------------------------------------------------------------------------- 1 | // 2 | // FILE: SHT85_demo_async.ino 3 | // AUTHOR: Rob Tillaart 4 | // PURPOSE: demo async interface 5 | // URL: https://github.com/RobTillaart/SHT85 6 | // 7 | // TOPVIEW SHT85 (check datasheet) 8 | // +-------+ 9 | // +-----\ | SDA 4 ----- 10 | // | +-+ ----+ GND 3 ----- 11 | // | +-+ ----+ +5V 2 ----- 12 | // +-----/ | SCL 1 ----- 13 | // +-------+ 14 | 15 | 16 | // TODO verify with HW 17 | 18 | 19 | #include "SHT85.h" 20 | 21 | #define SHT85_ADDRESS 0x44 22 | 23 | SHT85 sht(SHT85_ADDRESS); 24 | 25 | 26 | void setup() 27 | { 28 | // while(!Serial); // uncomment if needed 29 | Serial.begin(115200); 30 | Serial.println(); 31 | Serial.println(__FILE__); 32 | Serial.print("SHT_LIB_VERSION: \t"); 33 | Serial.println(SHT_LIB_VERSION); 34 | Serial.println(); 35 | 36 | Wire.begin(); 37 | Wire.setClock(100000); 38 | sht.begin(); 39 | 40 | uint16_t stat = sht.readStatus(); 41 | Serial.print(stat, HEX); 42 | Serial.println(); 43 | 44 | sht.requestData(); 45 | } 46 | 47 | 48 | void loop() 49 | { 50 | if (sht.dataReady()) 51 | { 52 | sht.readData(); 53 | Serial.print("\t"); 54 | Serial.print(micros()); 55 | Serial.print("\t"); 56 | Serial.print(sht.lastRequest()); 57 | Serial.print("\t"); 58 | Serial.print(sht.getTemperature(), 1); 59 | Serial.print("\t"); 60 | Serial.println(sht.getHumidity(), 1); 61 | sht.requestData(); 62 | } 63 | delay(10000); // do not call sensor too often (see datasheet) 64 | } 65 | 66 | 67 | // -- END OF FILE -- 68 | 69 | -------------------------------------------------------------------------------- /examples/SHT85_demo_offset/SHT85_demo_offset.ino: -------------------------------------------------------------------------------- 1 | // 2 | // FILE: SHT85_demo_offset.ino 3 | // AUTHOR: Rob Tillaart 4 | // PURPOSE: demo 5 | // URL: https://github.com/RobTillaart/SHT85 6 | // 7 | // TOPVIEW SHT85 (check datasheet) 8 | // +-------+ 9 | // +-----\ | SDA 4 ----- 10 | // | +-+ ----+ GND 3 ----- 11 | // | +-+ ----+ +5V 2 ----- 12 | // +-----/ | SCL 1 ----- 13 | // +-------+ 14 | 15 | 16 | #include "SHT85.h" 17 | 18 | #define SHT85_ADDRESS 0x44 19 | 20 | uint32_t start; 21 | uint32_t stop; 22 | 23 | uint16_t count = 0; 24 | uint32_t last = 0; 25 | 26 | SHT85 sht(SHT85_ADDRESS); 27 | 28 | 29 | void setup() 30 | { 31 | // while(!Serial); // uncomment if needed 32 | Serial.begin(115200); 33 | Serial.println(); 34 | Serial.println(__FILE__); 35 | Serial.print("SHT_LIB_VERSION: \t"); 36 | Serial.println(SHT_LIB_VERSION); 37 | Serial.println(); 38 | 39 | Wire.begin(); 40 | Wire.setClock(100000); 41 | sht.begin(); 42 | 43 | // uint16_t stat = sht.readStatus(); 44 | // Serial.print(stat, HEX); 45 | // Serial.println(); 46 | Serial.println("OffT\t OffH\t temp\t hum"); 47 | 48 | sht.setTemperatureOffset((random(100) - 50) * 0.01); 49 | sht.setHumidityOffset((random(100) - 50) * 0.01); 50 | } 51 | 52 | 53 | void loop() 54 | { 55 | if (millis() - last >= 1000) 56 | { 57 | last = millis(); 58 | sht.read(); 59 | 60 | Serial.print(sht.getTemperatureOffset(), 2); 61 | Serial.print("\t"); 62 | Serial.print(sht.getHumidityOffset(), 2); 63 | Serial.print("\t"); 64 | Serial.print(sht.getTemperature(), 2); 65 | Serial.print("\t"); 66 | Serial.println(sht.getHumidity(), 2); 67 | } 68 | } 69 | 70 | 71 | void loop2() 72 | { 73 | if (millis() - last >= 1000) 74 | { 75 | last = millis(); 76 | sht.read(); 77 | 78 | // just add awfull noisy offset +-0.5 degrees C 79 | sht.setTemperatureOffset((random(100) - 50) * 0.01); 80 | sht.setHumidityOffset((random(100) - 50) * 0.01); 81 | 82 | Serial.print(sht.getTemperatureOffset(), 2); 83 | Serial.print("\t"); 84 | Serial.print(sht.getHumidityOffset(), 2); 85 | Serial.print("\t"); 86 | Serial.print(sht.getTemperature(), 2); 87 | Serial.print("\t"); 88 | Serial.println(sht.getHumidity(), 2); 89 | } 90 | } 91 | 92 | 93 | // -- END OF FILE -- 94 | -------------------------------------------------------------------------------- /examples/SHT85_demo_plotter/SHT85_demo_plotter.ino: -------------------------------------------------------------------------------- 1 | // 2 | // FILE: SHT85_demo_plotter.ino 3 | // AUTHOR: Rob Tillaart 4 | // PURPOSE: demo 5 | // URL: https://github.com/RobTillaart/SHT85 6 | // 7 | // TOPVIEW SHT85 (check datasheet) 8 | // +-------+ 9 | // +-----\ | SDA 4 ----- 10 | // | +-+ ----+ GND 3 ----- 11 | // | +-+ ----+ +5V 2 ----- 12 | // +-----/ | SCL 1 ----- 13 | // +-------+ 14 | 15 | 16 | #include "SHT85.h" 17 | 18 | #define SHT85_ADDRESS 0x44 19 | 20 | uint32_t start; 21 | uint32_t stop; 22 | 23 | uint16_t count = 0; 24 | uint32_t last = 0; 25 | 26 | // SHT85 sht(SHT85_ADDRESS, &Wire1); 27 | SHT85 sht(SHT85_ADDRESS); 28 | 29 | 30 | void setup() 31 | { 32 | // while(!Serial); // uncomment if needed 33 | Serial.begin(115200); 34 | // Serial.println(); 35 | // Serial.println(__FILE__); 36 | // Serial.print("SHT_LIB_VERSION: \t"); 37 | // Serial.println(SHT_LIB_VERSION); 38 | // Serial.println(); 39 | 40 | Wire.begin(); 41 | Wire.setClock(100000); 42 | sht.begin(); 43 | 44 | // uint16_t stat = sht.readStatus(); 45 | // Serial.print(stat, HEX); 46 | // Serial.println(); 47 | Serial.println("count\t time\t temp\t hum"); 48 | } 49 | 50 | 51 | void loop() 52 | { 53 | start = micros(); 54 | sht.read(); // default = true/fast slow = false 55 | stop = micros(); 56 | 57 | Serial.print("\t"); 58 | Serial.print(count++); 59 | Serial.print("\t"); 60 | Serial.print((stop - start) * 0.001, 3); 61 | Serial.print("\t"); 62 | Serial.print(sht.getTemperature(), 2); 63 | Serial.print("\t"); 64 | Serial.println(sht.getHumidity(), 2); 65 | if (millis() - last >= 1000) 66 | { 67 | last = millis(); 68 | count = 0; 69 | } 70 | } 71 | 72 | 73 | // -- END OF FILE -- 74 | -------------------------------------------------------------------------------- /examples/SHT85_multiplex/.arduino-ci.yml: -------------------------------------------------------------------------------- 1 | platforms: 2 | rpipico: 3 | board: rp2040:rp2040:rpipico 4 | package: rp2040:rp2040 5 | gcc: 6 | features: 7 | defines: 8 | - ARDUINO_ARCH_RP2040 9 | warnings: 10 | flags: 11 | 12 | packages: 13 | rp2040:rp2040: 14 | url: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json 15 | 16 | compile: 17 | # Choosing to run compilation tests on 2 different Arduino platforms 18 | platforms: 19 | - uno 20 | # - due 21 | # - zero 22 | # - leonardo 23 | - m4 24 | - esp32 25 | - esp8266 26 | # - mega2560 27 | - rpipico 28 | libraries: 29 | - TCA9548 30 | -------------------------------------------------------------------------------- /examples/SHT85_multiplex/SHT85_multiplex.ino: -------------------------------------------------------------------------------- 1 | // 2 | // FILE: SHT85_multiplex.ino 3 | // AUTHOR: Rob Tillaart 4 | // PURPOSE: demo 5 | // URL: https://github.com/RobTillaart/SHT85 6 | // 7 | // TOPVIEW SHT85 (check datasheet) 8 | // +-------+ 9 | // +-----\ | SDA 4 ----- 10 | // | +-+ ----+ GND 3 ----- 11 | // | +-+ ----+ +5V 2 ----- 12 | // +-----/ | SCL 1 ----- 13 | // +-------+ 14 | 15 | // TODO: test with hardware 16 | 17 | #include "SHT85.h" 18 | #include "TCA9548.h" 19 | 20 | TCA9548 MP(0x70); 21 | 22 | #define SHT85_ADDRESS 0x44 23 | 24 | SHT85 sht(SHT85_ADDRESS); // the object is reused in the multiplexing. 25 | 26 | 27 | void setup() 28 | { 29 | // while(!Serial); // uncomment if needed 30 | Serial.begin(115200); 31 | Serial.println(); 32 | Serial.println(__FILE__); 33 | Serial.print("SHT_LIB_VERSION: \t"); 34 | Serial.println(SHT_LIB_VERSION); 35 | Serial.print("TCA9548_LIB_VERSION: \t"); 36 | Serial.println(TCA9548_LIB_VERSION); 37 | Serial.println(); 38 | 39 | Wire.begin(); 40 | Wire.setClock(100000); 41 | 42 | if (MP.begin() == false) 43 | { 44 | Serial.println("Error: Could not connect to the multiplexer."); 45 | while (1); 46 | } 47 | 48 | // initialize 4 SHT85's 49 | for (int channel = 0; channel < 4; channel++) 50 | { 51 | Serial.print(channel); 52 | MP.selectChannel(channel); // rotate over all SHT85's 53 | if (sht.begin() == false) 54 | { 55 | Serial.println("\tconnect error.");; 56 | } 57 | else 58 | { 59 | Serial.println("\tOK!.");; 60 | } 61 | delay(10); 62 | } 63 | 64 | Serial.println(); 65 | } 66 | 67 | 68 | void loop() 69 | { 70 | Serial.print(millis()); 71 | Serial.print("\t"); 72 | for (int channel = 0; channel < 4; channel++) 73 | { 74 | sht.read(); // default = true/fast slow = false 75 | Serial.print(sht.getTemperature(), 1); 76 | Serial.print("\t"); 77 | Serial.print(sht.getHumidity(), 1); 78 | delay(100); 79 | } 80 | } 81 | 82 | 83 | // -- END OF FILE -- 84 | -------------------------------------------------------------------------------- /examples/sht30_test_address/sht30_test_address.ino: -------------------------------------------------------------------------------- 1 | // FILE: sht30_test_address.ino 2 | // AUTHOR: Rob Tillaart 3 | // PURPOSE: Check both addresses 4 | // URL: https://github.com/RobTillaart/SHT85 5 | 6 | 7 | #include "SHT85.h" 8 | 9 | uint32_t start; 10 | uint32_t stop; 11 | 12 | SHT30 sht1(0x44); 13 | SHT30 sht2(0x45); 14 | 15 | 16 | void setup() 17 | { 18 | // while(!Serial); // uncomment if needed 19 | Serial.begin(115200); 20 | Serial.println(); 21 | Serial.println(__FILE__); 22 | Serial.print("SHT_LIB_VERSION: \t"); 23 | Serial.println(SHT_LIB_VERSION); 24 | Serial.println(); 25 | 26 | Wire.begin(); 27 | Wire.setClock(100000); 28 | sht1.begin(); 29 | sht2.begin(); 30 | 31 | Serial.println("\nCONNECT"); 32 | Serial.println(sht1.isConnected()); 33 | Serial.println(sht2.isConnected()); 34 | 35 | Serial.println("\nSTATUS"); 36 | uint16_t stat = sht1.readStatus(); 37 | Serial.print(stat, HEX); 38 | Serial.println(); 39 | stat = sht2.readStatus(); 40 | Serial.print(stat, HEX); 41 | Serial.println(); 42 | 43 | delay(1000); 44 | } 45 | 46 | 47 | void loop() 48 | { 49 | start = micros(); 50 | sht1.read(); // default = true/fast slow = false 51 | stop = micros(); 52 | Serial.print("SHT1:\t"); 53 | Serial.print((stop - start) * 0.001); 54 | Serial.print("\t"); 55 | Serial.print(sht1.getTemperature(), 1); 56 | Serial.print("\t"); 57 | Serial.println(sht1.getHumidity(), 1); 58 | delay(100); 59 | 60 | start = micros(); 61 | sht2.read(); // default = true/fast slow = false 62 | stop = micros(); 63 | Serial.print("SHT2:\t"); 64 | Serial.print((stop - start) * 0.001); 65 | Serial.print("\t"); 66 | Serial.print(sht2.getTemperature(), 1); 67 | Serial.print("\t"); 68 | Serial.println(sht2.getHumidity(), 1); 69 | delay(100); 70 | } 71 | 72 | 73 | // -- END OF FILE -- -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | # Syntax Colouring Map For SHT85 temperature and humidity sensor 2 | 3 | 4 | # Data types (KEYWORD1) 5 | SHT KEYWORD1 6 | SHT30 KEYWORD1 7 | SHT31 KEYWORD1 8 | SHT35 KEYWORD1 9 | SHT85 KEYWORD1 10 | 11 | 12 | # Methods and Functions (KEYWORD2) 13 | begin KEYWORD2 14 | getAddress KEYWORD2 15 | getType KEYWORD2 16 | 17 | read KEYWORD2 18 | requestData KEYWORD2 19 | dataReady KEYWORD2 20 | readData KEYWORD2 21 | lastRequest KEYWORD2 22 | 23 | isConnected KEYWORD2 24 | readStatus KEYWORD2 25 | lastRead KEYWORD2 26 | reset KEYWORD2 27 | getError KEYWORD2 28 | 29 | setHeatTimeout KEYWORD2 30 | getHeatTimeout KEYWORD2 31 | heatOn KEYWORD2 32 | heatOff KEYWORD2 33 | isHeaterOn KEYWORD2 34 | 35 | getHumidity KEYWORD2 36 | getTemperature KEYWORD2 37 | getFahrenheit KEYWORD2 38 | getRawHumidity KEYWORD2 39 | getRawTemperature KEYWORD2 40 | 41 | setTemperatureOffset KEYWORD2 42 | getTemperatureOffset KEYWORD2 43 | setHumidityOffset KEYWORD2 44 | getHumidityOffset KEYWORD2 45 | 46 | getSerialNumber KEYWORD2 47 | 48 | 49 | # Instances (KEYWORD2) 50 | 51 | 52 | # Constants (LITERAL1) 53 | SHT_LIB_VERSION LITERAL1 54 | 55 | SHT_DEFAULT_ADDRESS 56 | 57 | SHT_STATUS_ALERT_PENDING LITERAL1 58 | SHT_STATUS_HEATER_ON LITERAL1 59 | SHT_STATUS_HUM_TRACK_ALERT LITERAL1 60 | SHT_STATUS_TEMP_TRACK_ALERT LITERAL1 61 | SHT_STATUS_SYSTEM_RESET LITERAL1 62 | SHT_STATUS_COMMAND_STATUS LITERAL1 63 | SHT_STATUS_WRITE_CRC_STATUS LITERAL1 64 | 65 | SHT_OK LITERAL1 66 | SHT_ERR_WRITECMD LITERAL1 67 | SHT_ERR_READBYTES LITERAL1 68 | SHT_ERR_HEATER_OFF LITERAL1 69 | SHT_ERR_NOT_CONNECT LITERAL1 70 | SHT_ERR_CRC_TEMP LITERAL1 71 | SHT_ERR_CRC_HUM LITERAL1 72 | SHT_ERR_CRC_STATUS LITERAL1 73 | SHT_ERR_HEATER_COOLDOWN LITERAL1 74 | SHT_ERR_HEATER_ON LITERAL1 75 | SHT_ERR_SERIAL_NUMBER_CRC LITERAL1 76 | -------------------------------------------------------------------------------- /library.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SHT85", 3 | "keywords": "SHT85,Temperature,Humidity,I2C,SHT30, SHT31, SHT35, Sensirion", 4 | "description": "Arduino library for the SHT85, SHT30, SHT31, SHT35 temperature and humidity sensors and compatibles.", 5 | "authors": 6 | [ 7 | { 8 | "name": "Rob Tillaart", 9 | "email": "Rob.Tillaart@gmail.com", 10 | "maintainer": true 11 | } 12 | ], 13 | "repository": 14 | { 15 | "type": "git", 16 | "url": "https://github.com/RobTillaart/SHT85" 17 | }, 18 | "version": "0.6.2", 19 | "license": "MIT", 20 | "frameworks": "*", 21 | "platforms": "*", 22 | "headers": "SHT85.h" 23 | } 24 | -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=SHT85 2 | version=0.6.2 3 | author=Rob Tillaart 4 | maintainer=Rob Tillaart 5 | sentence=Arduino library for the SHT85, SHT30, SHT31, SHT35 Sensirion temperature and humidity sensors and compatibles. 6 | paragraph= 7 | category=Sensors 8 | url=https://github.com/RobTillaart/SHT85 9 | architectures=* 10 | includes=SHT85.h 11 | depends= -------------------------------------------------------------------------------- /test/unit_test_001.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // FILE: unit_test_001.cpp 3 | // AUTHOR: Rob Tillaart 4 | // VERSION: 0.1.0 5 | // DATE: 2021-02-10 6 | // PURPOSE: unit tests for the SHT85 temperature and humidity sensor 7 | // https://github.com/RobTillaart/SHT85 8 | // https://nl.rs-online.com/web/p/temperature-humidity-sensor-ics/1826530 9 | // https://github.com/Arduino-CI/arduino_ci/blob/master/REFERENCE.md 10 | // 11 | 12 | // supported assertions 13 | // ---------------------------- 14 | // assertEqual(expected, actual) 15 | // assertNotEqual(expected, actual) 16 | // assertLess(expected, actual) 17 | // assertMore(expected, actual) 18 | // assertLessOrEqual(expected, actual) 19 | // assertMoreOrEqual(expected, actual) 20 | // assertTrue(actual) 21 | // assertFalse(actual) 22 | // assertNull(actual) 23 | 24 | /* 25 | most unit tests will test for fail 26 | as there is no sensor connected 27 | and there is no mock-up. 28 | 29 | It appears that Wire.write does not fail without sensor... 30 | */ 31 | 32 | 33 | #include 34 | 35 | #include "Arduino.h" 36 | #include "SHT85.h" 37 | 38 | 39 | int expect; // TODO needed as there seems a problem with 8 bit comparisons (char?) 40 | 41 | uint32_t start, stop; 42 | 43 | 44 | unittest_setup() 45 | { 46 | fprintf(stderr, "SHT_LIB_VERSION: %s\n", (char *) SHT_LIB_VERSION); 47 | } 48 | 49 | 50 | unittest_teardown() 51 | { 52 | } 53 | 54 | 55 | unittest(test_constants_1) 56 | { 57 | assertEqual(SHT_DEFAULT_ADDRESS, 0x44); 58 | 59 | fprintf(stderr, "fields readStatus\n"); 60 | assertEqual(SHT_STATUS_ALERT_PENDING , (1 << 15) ); 61 | assertEqual(SHT_STATUS_HEATER_ON , (1 << 13) ); 62 | assertEqual(SHT_STATUS_HUM_TRACK_ALERT , (1 << 11) ); 63 | assertEqual(SHT_STATUS_TEMP_TRACK_ALERT, (1 << 10) ); 64 | assertEqual(SHT_STATUS_SYSTEM_RESET , (1 << 4) ); 65 | assertEqual(SHT_STATUS_COMMAND_STATUS , (1 << 1) ); 66 | assertEqual(SHT_STATUS_WRITE_CRC_STATUS, (1 << 0) ); 67 | } 68 | 69 | 70 | unittest(test_constants_2) 71 | { 72 | fprintf(stderr, "error codes\n"); 73 | assertEqual(SHT_OK , 0x00); 74 | assertEqual(SHT_ERR_WRITECMD , 0x81); 75 | assertEqual(SHT_ERR_READBYTES , 0x82); 76 | assertEqual(SHT_ERR_HEATER_OFF , 0x83); 77 | assertEqual(SHT_ERR_NOT_CONNECT , 0x84); 78 | assertEqual(SHT_ERR_CRC_TEMP , 0x85); 79 | assertEqual(SHT_ERR_CRC_HUM , 0x86); 80 | assertEqual(SHT_ERR_CRC_STATUS , 0x87); 81 | assertEqual(SHT_ERR_HEATER_COOLDOWN, 0x88); 82 | assertEqual(SHT_ERR_HEATER_ON , 0x89); 83 | } 84 | 85 | 86 | unittest(test_begin) 87 | { 88 | SHT85 sht(0x44); 89 | 90 | Wire.begin(); 91 | bool b = sht.begin(); 92 | assertEqual(b, true); 93 | 94 | assertTrue(sht.reset()); 95 | expect = SHT_OK; 96 | assertEqual(expect, sht.getError()); 97 | 98 | Serial.println(sht.getTemperature()); 99 | Serial.println(sht.getHumidity()); 100 | Serial.println(sht.getRawTemperature()); 101 | Serial.println(sht.getRawHumidity()); 102 | 103 | // default value == 0 104 | assertEqual(-45, sht.getTemperature()); 105 | assertEqual(-49, sht.getFahrenheit()); 106 | assertEqual(0, sht.getHumidity()); 107 | assertEqual(0, sht.getRawTemperature()); 108 | assertEqual(0, sht.getRawHumidity()); 109 | } 110 | 111 | 112 | unittest(test_read) 113 | { 114 | SHT85 sht(0x44); 115 | 116 | Wire.begin(); 117 | bool b = sht.begin(); 118 | assertEqual(b, true); 119 | 120 | assertTrue(sht.isConnected()); 121 | expect = SHT_OK; 122 | assertEqual(expect, sht.getError()); 123 | } 124 | 125 | 126 | unittest(test_readStatus) 127 | { 128 | SHT85 sht(0x44); 129 | 130 | Wire.begin(); 131 | bool b = sht.begin(); 132 | assertEqual(b, true); 133 | 134 | assertEqual(0xFFFF, sht.readStatus()); 135 | expect = SHT_ERR_READBYTES; 136 | assertEqual(expect, sht.getError()); 137 | } 138 | 139 | 140 | unittest(test_heater) 141 | { 142 | SHT85 sht(0x44); 143 | 144 | Wire.begin(); 145 | bool b = sht.begin(); 146 | assertEqual(b, true); 147 | 148 | assertTrue(sht.heatOn()); 149 | expect = SHT_OK; 150 | assertEqual(expect, sht.getError()); 151 | 152 | assertTrue(sht.heatOff()); 153 | expect = SHT_OK; 154 | assertEqual(expect, sht.getError()); 155 | 156 | assertFalse(sht.isHeaterOn()); 157 | expect = SHT_OK; 158 | assertEqual(expect, sht.getError()); 159 | } 160 | 161 | 162 | unittest(test_async) 163 | { 164 | SHT85 sht(0x44); 165 | 166 | Wire.begin(); 167 | bool b = sht.begin(); 168 | assertEqual(b, true); 169 | 170 | assertTrue(sht.requestData()); 171 | expect = SHT_OK; 172 | assertEqual(expect, sht.getError()); 173 | 174 | assertFalse(sht.dataReady()); 175 | expect = SHT_OK; 176 | assertEqual(expect, sht.getError()); 177 | 178 | assertFalse(sht.readData()); 179 | expect = SHT_ERR_READBYTES; 180 | assertEqual(expect, sht.getError()); 181 | 182 | assertFalse(sht.readData(true)); 183 | expect = SHT_ERR_READBYTES; 184 | assertEqual(expect, sht.getError()); 185 | 186 | assertFalse(sht.readData(false)); 187 | expect = SHT_ERR_READBYTES; 188 | assertEqual(expect, sht.getError()); 189 | } 190 | 191 | 192 | 193 | unittest(test_offset) 194 | { 195 | SHT85 sht(0x44); 196 | 197 | Wire.begin(); 198 | bool b = sht.begin(); 199 | fprintf(stderr, "temperature\n"); 200 | for (int i = -5; i < 6; i++) 201 | { 202 | sht.setTemperatureOffset(i); 203 | assertEqual(i, sht.getTemperatureOffset()); 204 | } 205 | fprintf(stderr, "humidity\n"); 206 | for (int i = -5; i < 6; i++) 207 | { 208 | sht.setHumidityOffset(i); 209 | assertEqual(i, sht.getHumidityOffset()); 210 | } 211 | } 212 | 213 | 214 | ////////////////////////////////////////// 215 | // 216 | // Test derived types 217 | // 218 | unittest(test_getType) 219 | { 220 | SHT sht(0x44); 221 | SHT30 sht0(0x44); 222 | SHT31 sht1(0x44); 223 | SHT35 sht2(0x44); 224 | SHT85 sht3(0x44); 225 | 226 | assertEqual(00, sht.getType()); 227 | assertEqual(30, sht0.getType()); 228 | assertEqual(31, sht1.getType()); 229 | assertEqual(35, sht2.getType()); 230 | assertEqual(85, sht3.getType()); 231 | } 232 | 233 | 234 | unittest_main() 235 | 236 | 237 | // -- END OF FILE -- 238 | 239 | --------------------------------------------------------------------------------