Ecriture du driver nécessaire au fonctionnement du STS21
This commit is contained in:
parent
71bb613944
commit
2c0f23ee38
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user