Ecriture du driver nécessaire au fonctionnement du STS21

This commit is contained in:
anschrammh 2020-02-14 00:07:39 +01:00
parent 71bb613944
commit 2c0f23ee38
2 changed files with 218 additions and 0 deletions

View File

@ -1 +1,172 @@
#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;
}

View File

@ -1 +1,48 @@
/*
* Anatole SCHRAMM-HENRY
* Tim THUREL
* Température groupe 3
* Date 14/02/2020 00:05
*
* Classe permettant de piloter le STS21
* Capteur de température de la marque SENSIRION
* Précision : 0.2°C
*
* Tout droit réservé
*/
#ifndef STS21_H
#define STS21_H
#include "I2CDevice.h"
//Définition des commandes
#define HOLD_MASTER 0xE3
#define NO_HOLD_MASTER 0xF3
#define WRITE_USER_REG 0xE6
#define READ_USER_REG 0xE7
#define SOFT_RST 0xFE
//User register bits
#define END_OF_BAT 0x40
#define CHIP_HEATER 0x04
class STS21 : public I2CDevice
{
public:
enum STS_RES {RES_11 = 3, RES_12 = 1, RES_13 = 2, RES_14 = 0};
STS21(uint8_t addr = 0x4A):I2CDevice(addr), _onChipHeater(false), _stsRes(RES_14) {delay(20);}
~STS21(){}
virtual boolean begin(){return I2CDevice::begin();};
double getTemperature(boolean noHold = true);//Degré celsius
boolean setResolution(STS_RES res);
boolean enableOnChipHeater(boolean enabled);
boolean reset();
boolean lowBattery();//Retourne vrai si le bit indiquant un niveau de batterie faible est present, faux sinon
protected:
private:
uint8_t readUserRegister();
boolean writeUserRegister(uint8_t value);
boolean _onChipHeater;
STS_RES _stsRes;
};
#endif //STS21_H