From 2c0f23ee388f76ba0842fe8eea02b2ab4937eb87 Mon Sep 17 00:00:00 2001 From: anschrammh Date: Fri, 14 Feb 2020 00:07:39 +0100 Subject: [PATCH] =?UTF-8?q?Ecriture=20du=20driver=20n=C3=A9cessaire=20au?= =?UTF-8?q?=20fonctionnement=20du=20STS21?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/I2CDeviceLib/STS21.cpp | 171 +++++++++++++++++++++++++++++++++++++ lib/I2CDeviceLib/STS21.h | 47 ++++++++++ 2 files changed, 218 insertions(+) diff --git a/lib/I2CDeviceLib/STS21.cpp b/lib/I2CDeviceLib/STS21.cpp index 8b13789..a67b262 100644 --- a/lib/I2CDeviceLib/STS21.cpp +++ b/lib/I2CDeviceLib/STS21.cpp @@ -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; +} diff --git a/lib/I2CDeviceLib/STS21.h b/lib/I2CDeviceLib/STS21.h index 8b13789..b158955 100644 --- a/lib/I2CDeviceLib/STS21.h +++ b/lib/I2CDeviceLib/STS21.h @@ -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