Files
2024-07-20 22:09:06 +08:00

114 lines
3.1 KiB
C++

#include "DFRobot_SHT20.h"
void DFRobot_SHT20::initSHT20(TwoWire &wirePort)
{
i2cPort = &wirePort;
i2cPort->begin();
}
uint16_t DFRobot_SHT20::readValue(byte cmd)
{
i2cPort->beginTransmission(SLAVE_ADDRESS);
i2cPort->write(cmd);
i2cPort->endTransmission();
byte toRead;
byte counter;
for(counter = 0, toRead = 0 ; counter < MAX_COUNTER && toRead != 3; counter++){
delay(DELAY_INTERVAL);
toRead = i2cPort->requestFrom(SLAVE_ADDRESS, 3);
}
if(counter == MAX_COUNTER){
return (ERROR_I2C_TIMEOUT);
}
byte msb, lsb, checksum;
msb = i2cPort->read();
lsb = i2cPort->read();
checksum = i2cPort->read();
uint16_t rawValue = ((uint16_t) msb << 8) | (uint16_t) lsb;
if(checkCRC(rawValue, checksum) != 0){
return (ERROR_BAD_CRC);
}
return rawValue & 0xFFFC;
}
float DFRobot_SHT20::readHumidity(void)
{
uint16_t rawHumidity = readValue(TRIGGER_HUMD_MEASURE_NOHOLD);
if(rawHumidity == ERROR_I2C_TIMEOUT || rawHumidity == ERROR_BAD_CRC){
return(rawHumidity);
}
float tempRH = rawHumidity * (125.0 / 65536.0);
float rh = tempRH - 6.0;
return (rh);
}
float DFRobot_SHT20::readTemperature(void)
{
uint16_t rawTemperature = readValue(TRIGGER_TEMP_MEASURE_NOHOLD);
if(rawTemperature == ERROR_I2C_TIMEOUT || rawTemperature == ERROR_BAD_CRC){
return(rawTemperature);
}
float tempTemperature = rawTemperature * (175.72 / 65536.0);
float realTemperature = tempTemperature - 46.85;
return (realTemperature);
}
void DFRobot_SHT20::setResolution(byte resolution)
{
byte userRegister = readUserRegister();
userRegister &= B01111110;
resolution &= B10000001;
userRegister |= resolution;
writeUserRegister(userRegister);
}
byte DFRobot_SHT20::readUserRegister(void)
{
byte userRegister;
i2cPort->beginTransmission(SLAVE_ADDRESS);
i2cPort->write(READ_USER_REG);
i2cPort->endTransmission();
i2cPort->requestFrom(SLAVE_ADDRESS, 1);
userRegister = i2cPort->read();
return (userRegister);
}
void DFRobot_SHT20::writeUserRegister(byte val)
{
i2cPort->beginTransmission(SLAVE_ADDRESS);
i2cPort->write(WRITE_USER_REG);
i2cPort->write(val);
i2cPort->endTransmission();
}
byte DFRobot_SHT20::checkCRC(uint16_t message_from_sensor, uint8_t check_value_from_sensor)
{
uint32_t remainder = (uint32_t)message_from_sensor << 8;
remainder |= check_value_from_sensor;
uint32_t divsor = (uint32_t)SHIFTED_DIVISOR;
for(int i = 0 ; i < 16 ; i++){
if(remainder & (uint32_t)1 << (23 - i)){
remainder ^= divsor;
}
divsor >>= 1;
}
return (byte)remainder;
}
void DFRobot_SHT20::showReslut(const char *prefix, int val)
{
Serial.print(prefix);
if(val){
Serial.println("yes");
}else{
Serial.println("no");
}
}
void DFRobot_SHT20::checkSHT20(void)
{
byte reg = readUserRegister();
showReslut("End of battery: ", reg & USER_REGISTER_END_OF_BATTERY);
showReslut("Heater enabled: ", reg & USER_REGISTER_HEATER_ENABLED);
showReslut("Disable OTP reload: ", reg & USER_REGISTER_DISABLE_OTP_RELOAD);
}