SP1 vers 3
Dependents: SoufflerieSP1-vers2
Revision 0:86f8e66e04fc, committed 2021-06-08
- Comitter:
- petit
- Date:
- Tue Jun 08 10:37:36 2021 +0000
- Commit message:
- SP1 vers 3
Changed in this revision
Sht31.cpp | Show annotated file Show diff for this revision Revisions of this file |
Sht31.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 86f8e66e04fc Sht31.cpp --- /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; +}
diff -r 000000000000 -r 86f8e66e04fc Sht31.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Sht31.h Tue Jun 08 10:37:36 2021 +0000 @@ -0,0 +1,53 @@ +/*************************************************** + 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 + ****************************************************/ + +#ifndef Sht31_H +#define Sht31_H + +#include "mbed.h" + +#define SHT31_DEFAULT_ADDR 0x44 +#define SHT31_MEAS_HIGHREP_STRETCH 0x2C06 +#define SHT31_MEAS_MEDREP_STRETCH 0x2C0D +#define SHT31_MEAS_LOWREP_STRETCH 0x2C10 +#define SHT31_MEAS_HIGHREP 0x2400 +#define SHT31_MEAS_MEDREP 0x240B +#define SHT31_MEAS_LOWREP 0x2416 +#define SHT31_READSTATUS 0xF32D +#define SHT31_CLEARSTATUS 0x3041 +#define SHT31_SOFTRESET 0x30A2 +#define SHT31_HEATEREN 0x306D +#define SHT31_HEATERDIS 0x3066 + +class Sht31 { +public: + Sht31(PinName sda, PinName scl); + int readTemperature(void); + int readHumidity(void); + +private: + void reset(void); + uint16_t readStatus(void); + void writeCommand(uint16_t cmd); + bool readTempHum(void); + uint8_t crc8(const uint8_t *data, int len); + + I2C _i2c; + int _i2caddr; + int humidity, temp; +}; + +#endif