SP1 vers 3
Dependents: SoufflerieSP1-vers2
Diff: Sht31.cpp
- Revision:
- 0:86f8e66e04fc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Sht31.cpp Tue Jun 08 10:37:36 2021 +0000 @@ -0,0 +1,112 @@ +/*************************************************** + This is a library for the SHT31 Digital Humidity & Temp Sht31 + + Designed specifically to work with the SHT31 Digital Sht31 from Adafruit + ----> https://www.adafruit.com/products/2857 + + These displays use I2C to communicate, 2 pins are required to + interface + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Limor Fried/Ladyada for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ****************************************************/ + +#include "Sht31.h" +#include "mbed.h" + +Sht31::Sht31(PinName sda, PinName scl) : _i2c(sda, scl) { + _i2caddr = (0x44 << 1); + reset(); + readStatus(); +} + +int Sht31::readTemperature(void) { + if (! readTempHum()) return NAN; + return temp; +} + +int Sht31::readHumidity(void) { + if (! readTempHum()) return NAN; + return humidity; +} + +void Sht31::reset(void) { + writeCommand(SHT31_SOFTRESET); + wait_ms(10); +} + +uint16_t Sht31::readStatus(void) { + writeCommand(SHT31_READSTATUS); + char val[1]; + _i2c.read(_i2caddr, val, 1); + uint16_t stat = val[0]; + stat <<= 8; + _i2c.read(_i2caddr, val, 1); + stat |= val[0]; + // printf("0x%X\r\n", stat); + return stat; +} + +void Sht31::writeCommand(uint16_t cmd) { + char buf[2]; + buf[0] = (cmd >> 8); + buf[1] = (cmd & 0xFF); + _i2c.write(_i2caddr, buf, 2); +} + +bool Sht31::readTempHum(void) { + char readbuffer[6]; + + writeCommand(SHT31_MEAS_HIGHREP); + + wait_ms(500); + _i2c.read(_i2caddr, readbuffer, 6); + + uint16_t ST, SRH; + ST = readbuffer[0]; + ST <<= 8; + ST |= readbuffer[1]; + + if (readbuffer[2] != crc8((uint8_t *) readbuffer, 2)) { + return false; + } + + SRH = readbuffer[3]; + SRH <<= 8; + SRH |= readbuffer[4]; + + if (readbuffer[5] != crc8((uint8_t *) readbuffer+3, 2)) { + return false; + } + + double stemp = ST; + stemp *= 175; + stemp /= 0xffff; + stemp = -45 + stemp; + temp = stemp; + + double shum = SRH; + shum *= 100; + shum /= 0xFFFF; + + humidity = shum; + + return true; +} + +uint8_t Sht31::crc8(const uint8_t *data, int len) { + const uint8_t POLYNOMIAL(0x31); + uint8_t crc(0xFF); + + for ( int j = len; j; --j ) { + crc ^= *data++; + + for ( int i = 8; i; --i ) { + crc = (crc & 0x80) ? (crc << 1) ^ POLYNOMIAL : (crc << 1); + } + } + return crc; +}