Compare commits

...

4 Commits

5 changed files with 349 additions and 1 deletions

View File

@ -257,13 +257,47 @@
"height": 13, "height": 13,
"text": "+enableOnChipHeater(enabled: boolean): boolean", "text": "+enableOnChipHeater(enabled: boolean): boolean",
"horizontalAlignment": 0 "horizontalAlignment": 0
},
{
"_type": "UMLOperationView",
"_id": "AAAAAAFwQGCQSLPmIVQ=",
"_parent": {
"$ref": "AAAAAAFupxeuwAk/ZqA="
},
"model": {
"$ref": "AAAAAAFwQGCQE7PjlD0="
},
"font": "Arial;13;0",
"left": 2221,
"top": 704,
"width": 291.63671875,
"height": 13,
"text": "+reset(): boolean",
"horizontalAlignment": 0
},
{
"_type": "UMLOperationView",
"_id": "AAAAAAFwQMQ/eLRkThk=",
"_parent": {
"$ref": "AAAAAAFupxeuwAk/ZqA="
},
"model": {
"$ref": "AAAAAAFwQMQ/RLRhTD0="
},
"font": "Arial;13;0",
"left": 2221,
"top": 719,
"width": 291.63671875,
"height": 13,
"text": "+lowBattery(): boolean",
"horizontalAlignment": 0
} }
], ],
"font": "Arial;13;0", "font": "Arial;13;0",
"left": 2216, "left": 2216,
"top": 639, "top": 639,
"width": 301.63671875, "width": 301.63671875,
"height": 68 "height": 98
}, },
{ {
"_type": "UMLReceptionCompartmentView", "_type": "UMLReceptionCompartmentView",
@ -5630,6 +5664,44 @@
"direction": "return" "direction": "return"
} }
] ]
},
{
"_type": "UMLOperation",
"_id": "AAAAAAFwQGCQE7PjlD0=",
"_parent": {
"$ref": "AAAAAAFupxeuvgk2JFo="
},
"name": "reset",
"parameters": [
{
"_type": "UMLParameter",
"_id": "AAAAAAFwQGDRMbQXu2E=",
"_parent": {
"$ref": "AAAAAAFwQGCQE7PjlD0="
},
"type": "boolean",
"direction": "return"
}
]
},
{
"_type": "UMLOperation",
"_id": "AAAAAAFwQMQ/RLRhTD0=",
"_parent": {
"$ref": "AAAAAAFupxeuvgk2JFo="
},
"name": "lowBattery",
"parameters": [
{
"_type": "UMLParameter",
"_id": "AAAAAAFwQMTQprSwKNg=",
"_parent": {
"$ref": "AAAAAAFwQMQ/RLRhTD0="
},
"type": "boolean",
"direction": "return"
}
]
} }
] ]
}, },

View File

@ -0,0 +1,55 @@
/*
* Anatole SCHRAMM-HENRY
* Tim THUREL
* Température groupe 3
*
* Test de la bibliothèque permettant de piloter le STS21
* Capteur de température de la marque SENSIRION
* Précision : 0.2°C
*/
#include "STS21.h"
STS21 sts21;
void setup()
{
Serial.begin(115200);
Serial.println("Starting sts21 test");
if(sts21.begin())
Serial.println("Sensor present !");
else
Serial.println("Sensor missing !");
Serial.println("End setup");
sts21.reset();
Serial.println("Setting chip heater");
sts21.enableOnChipHeater(true);
delay(100);
Serial.println("Setting chip heater");
sts21.enableOnChipHeater(false);
delay(100);
Serial.println("Setting resolution 12");
sts21.setResolution(STS21::RES_12);
delay(100);
Serial.println("Setting resolution 14");
sts21.setResolution(STS21::RES_14);
delay(100);
Serial.println("Setting resolution 13");
sts21.setResolution(STS21::RES_13);
delay(100);
Serial.println("Setting resolution 11");
sts21.setResolution(STS21::RES_11);
delay(100);
sts21.setResolution(STS21::RES_14);
delay(100);
}
void loop()
{
double temp = sts21.getTemperature();
Serial.printf("No Hold -> temp : %.2f\n",temp);
temp = sts21.getTemperature(false);
Serial.printf("Hold -> temp : %.2f, Battery level low : %s\n",temp, sts21.lowBattery() ? "true":"false");
delay(1000);
}

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

View File

@ -20,6 +20,9 @@ sampleVoltage KEYWORD2
getTemperature KEYWORD2 getTemperature KEYWORD2
setResolution KEYWORD2 setResolution KEYWORD2
enableOnChipHeater KEYWORD2 enableOnChipHeater KEYWORD2
reset KEYWORD2
lowBattery KEYWORD2
####################################### #######################################
# Constants (LITERAL1) # Constants (LITERAL1)