173 lines
3.1 KiB
C++
173 lines
3.1 KiB
C++
#include "STS21.h"
|
|
|
|
//#define DEBUG
|
|
|
|
double STS21::getTemperature(boolean noHold)
|
|
{
|
|
uint8_t data[2] = {0,0};
|
|
double temperature(0.0);
|
|
uint16_t alignement(0);
|
|
|
|
twi->beginTransmission(address);
|
|
if(noHold)
|
|
twi->write(NO_HOLD_MASTER);
|
|
else
|
|
twi->write(HOLD_MASTER);
|
|
|
|
if(twi->endTransmission() != 0)
|
|
return temperature;//Error
|
|
|
|
if(noHold)
|
|
{
|
|
switch(_stsRes)
|
|
{
|
|
case RES_13:
|
|
delay(50);
|
|
break;
|
|
case RES_12:
|
|
delay(35);
|
|
break;
|
|
case RES_11:
|
|
delay(20);
|
|
break;
|
|
default:
|
|
delay(95);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//On recupère les deux octets contenant la température
|
|
twi->requestFrom(address, (uint8_t)2);
|
|
if(twi->available() == 2)
|
|
{
|
|
data[0] = twi->read();
|
|
data[1] = twi->read();
|
|
}
|
|
|
|
alignement = data[0];
|
|
alignement <<= 8;
|
|
alignement += data[1] & 0xFC;
|
|
|
|
temperature = -46.85 + 175.72 * ((double)alignement / 65536.0);
|
|
|
|
return temperature;
|
|
}
|
|
|
|
uint8_t STS21::readUserRegister()
|
|
{
|
|
uint8_t returned(0);
|
|
|
|
twi->beginTransmission(address);
|
|
twi->write(READ_USER_REG);
|
|
if(twi->endTransmission() != 0)
|
|
return 0;
|
|
|
|
twi->requestFrom(address, (uint8_t)1);
|
|
|
|
if(twi->available() == 1)
|
|
{
|
|
returned = twi->read();
|
|
}
|
|
|
|
return returned;
|
|
}
|
|
|
|
boolean STS21::writeUserRegister(uint8_t value)
|
|
{
|
|
twi->beginTransmission(address);
|
|
twi->write(WRITE_USER_REG);
|
|
twi->write(value);
|
|
|
|
return twi->endTransmission() == 0;
|
|
}
|
|
|
|
boolean STS21::setResolution(STS_RES res)
|
|
{
|
|
uint8_t userReg = readUserRegister();
|
|
boolean toBeReturned(false);
|
|
#ifdef DEBUG
|
|
Serial.printf("User Reg value before : %X\n",userReg);
|
|
#endif
|
|
|
|
switch(res)
|
|
{
|
|
case RES_13:
|
|
userReg |= 0b10000000;
|
|
userReg &= 0b11111110;
|
|
break;
|
|
case RES_12:
|
|
userReg |= 0b00000001;
|
|
userReg &= 0b01111111;
|
|
break;
|
|
case RES_11:
|
|
userReg |= 0b10000001;
|
|
break;
|
|
default://Default is 14 bit resolution
|
|
userReg &= 0b01111110;
|
|
break;
|
|
}
|
|
|
|
if(writeUserRegister(userReg))
|
|
{
|
|
toBeReturned = true;
|
|
_stsRes = res;
|
|
#ifdef DEBUG
|
|
Serial.printf("Set resolution success\n");
|
|
#endif
|
|
}
|
|
|
|
userReg = readUserRegister();
|
|
#ifdef DEBUG
|
|
Serial.printf("User Reg value after : %X\n",userReg);
|
|
#endif
|
|
|
|
return toBeReturned;
|
|
}
|
|
|
|
boolean STS21::enableOnChipHeater(boolean enabled)
|
|
{
|
|
uint8_t userReg = readUserRegister();
|
|
boolean toBeReturned(false);
|
|
|
|
#ifdef DEBUG
|
|
Serial.printf("User Reg value before : %X\n",userReg);
|
|
#endif
|
|
|
|
if(enabled)
|
|
userReg |= CHIP_HEATER;
|
|
else
|
|
userReg &= (~CHIP_HEATER);
|
|
|
|
if(writeUserRegister(userReg))
|
|
{
|
|
toBeReturned = true;
|
|
_onChipHeater = enabled;
|
|
#ifdef DEBUG
|
|
Serial.printf("Set chip heater success\n");
|
|
#endif
|
|
}
|
|
|
|
userReg = readUserRegister();
|
|
#ifdef DEBUG
|
|
Serial.printf("User Reg value after : %X\n",userReg);
|
|
#endif
|
|
|
|
return toBeReturned;
|
|
}
|
|
|
|
boolean STS21::reset()
|
|
{
|
|
boolean result;
|
|
twi->beginTransmission(address);
|
|
twi->write(SOFT_RST);
|
|
result = twi->endTransmission() == 0;
|
|
delay(30);
|
|
return result;
|
|
}
|
|
|
|
boolean STS21::lowBattery()
|
|
{
|
|
uint8_t userReg = readUserRegister();
|
|
return userReg & END_OF_BAT;
|
|
}
|