From ee20964f39cc0b20009f8667a229600375a314ad Mon Sep 17 00:00:00 2001 From: anschrammh Date: Thu, 28 Nov 2019 20:52:08 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20de=20l'ensemble=20des=20fichiers=20cons?= =?UTF-8?q?tituant=20la=20biblioth=C3=A8que=20pour=20les=20p=C3=A9rph?= =?UTF-8?q?=C3=A9riques=20I2C=20(seulement=20une=20partie=20des=20foctionn?= =?UTF-8?q?alit=C3=A9es=20sont=20impl=C3=A9ment=C3=A9es=20pour=20le=20LTC2?= =?UTF-8?q?497)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/I2CDeviceLib/I2CDevice.cpp | 15 +++ lib/I2CDeviceLib/I2CDevice.h | 24 ++++ lib/I2CDeviceLib/LTC2497.cpp | 150 ++++++++++++++++++++++ lib/I2CDeviceLib/LTC2497.h | 45 +++++++ lib/I2CDeviceLib/STS21.cpp | 1 + lib/I2CDeviceLib/STS21.h | 1 + lib/I2CDeviceLib/examples/basic/basic.ino | 19 +++ lib/I2CDeviceLib/keywords.txt | 48 +++++++ 8 files changed, 303 insertions(+) create mode 100644 lib/I2CDeviceLib/I2CDevice.cpp create mode 100644 lib/I2CDeviceLib/I2CDevice.h create mode 100644 lib/I2CDeviceLib/LTC2497.cpp create mode 100644 lib/I2CDeviceLib/LTC2497.h create mode 100644 lib/I2CDeviceLib/STS21.cpp create mode 100644 lib/I2CDeviceLib/STS21.h create mode 100644 lib/I2CDeviceLib/examples/basic/basic.ino create mode 100644 lib/I2CDeviceLib/keywords.txt diff --git a/lib/I2CDeviceLib/I2CDevice.cpp b/lib/I2CDeviceLib/I2CDevice.cpp new file mode 100644 index 0000000..d04370a --- /dev/null +++ b/lib/I2CDeviceLib/I2CDevice.cpp @@ -0,0 +1,15 @@ +#include "I2CDevice.h" + +I2CDevice::I2CDevice(uint8_t address, TwoWire *twi) : address(address), twi(twi), isPresent(false) +{ + +} + +boolean I2CDevice::begin() +{ + twi->begin(); //On rejoint le bus I2C en tant que master + twi->beginTransmission(address); + isPresent = twi->endTransmission() == 0; + + return isPresent; +} diff --git a/lib/I2CDeviceLib/I2CDevice.h b/lib/I2CDeviceLib/I2CDevice.h new file mode 100644 index 0000000..1719f78 --- /dev/null +++ b/lib/I2CDeviceLib/I2CDevice.h @@ -0,0 +1,24 @@ +/** + * + */ + + #ifndef I2CDEVICE_H + #define I2CDEVICE_H + + #include + #include + + class I2CDevice + { + public: + I2CDevice(const uint8_t address, TwoWire *twi = &Wire); + protected: + virtual boolean begin() = 0; + + const uint8_t address; + TwoWire *twi; + boolean isPresent; + private: + }; + + #endif //I2CDEVICE_H diff --git a/lib/I2CDeviceLib/LTC2497.cpp b/lib/I2CDeviceLib/LTC2497.cpp new file mode 100644 index 0000000..497f098 --- /dev/null +++ b/lib/I2CDeviceLib/LTC2497.cpp @@ -0,0 +1,150 @@ +#include "LTC2497.h" +#include + +#define DEBUG + +LTC2497::LTC2497(const uint8_t address, double vref) : I2CDevice(address), _vref(vref), _adcRes(16), _quantum(_vref / (pow(2, _adcRes)-1)) +{ + for(uint8_t i = 0; i < 3; i++) + _dataBytes[i] = 0b00000000; +} + +void LTC2497::setVref(double vref) +{ + _vref = vref; + _quantum = _vref / (pow(2, _adcRes) - 1); +} + +int32_t LTC2497::sampleValue(ADC_CHAN channel, boolean sgl) +{ + //1) On commence par écrire un octet contenant des options et l'adresse du channel a sampler + //2) On lit la valeur samplée + + if(!isPresent) + { + #ifdef DEBUG + Serial.println("Peripherique non present (penser à faire un begin)"); + #endif + return 0; + } + + uint8_t toBeWritten(0), retStatus(0), i(3); + uint32_t value(0); + + toBeWritten |= 0b10100000;//On met les premiers bits à 101 afin de prendre en compte l'adresse du channel pour la mesure + toBeWritten |= 0b00010000;//On met l'adc en single ended line et pas en mode différentiel + toBeWritten |= channel;//On selectionne le channel + + twi->beginTransmission(address); + twi->write(toBeWritten); + if(twi->endTransmission() != 0) + { + //Erreur lors de la transmission + #ifdef DEBUG + Serial.println("Erreur lors de la transmission"); + #endif + return 0; + } + + retStatus = (size_t) twi->requestFrom(address, (size_t)3/*, true*/); + + if(retStatus == 0) + { + #ifdef DEBUG + Serial.println("Erreur lors de la reception du sample"); + #endif + return 0; + } + + while(twi->available()) + { + _dataBytes[--i] = twi->read(); + + if(i == 0) //!i c'est ok aussi + { + break; + } + } + + //Traitement des données recues + value |= _dataBytes[2]; + //On met à zero les deux derniers bits + value &= 0b00111111; + value << 8; + value |= _dataBytes[1]; + _dataBytes[0] >> 6; + value << 2; + value |= _dataBytes[0]; + + return value; +} + +int32_t LTC2497::sampleValue() +{ + if(!isPresent) + { + #ifdef DEBUG + Serial.println("Peripherique non present (penser à faire un begin)"); + #endif + return 0; + } + + uint8_t toBeWritten(0), retStatus(0), i(3); + uint32_t value(0); + + toBeWritten |= 0b10000000;//On met les premiers bits à 100 pour demander à resample le channel précédent + + + twi->beginTransmission(address); + twi->write(toBeWritten); + if(twi->endTransmission() != 0) + { + //Erreur lors de la transmission + #ifdef DEBUG + Serial.println("Erreur lors de la transmission"); + #endif + return 0; + } + + retStatus = (size_t) twi->requestFrom(address, (size_t)3/*, true*/); + + if(retStatus == 0) + { + #ifdef DEBUG + Serial.println("Erreur lors de la reception du sample"); + #endif + return 0; + } + + while(twi->available()) + { + _dataBytes[--i] = twi->read(); + + if(i == 0) //!i c'est ok aussi + { + break; + } + } + + //Traitement des données recues + value |= _dataBytes[2]; + //On met à zero les deux derniers bits + value &= 0b00111111; + value << 8; + value |= _dataBytes[1]; + _dataBytes[0] >> 6; + value << 2; + value |= _dataBytes[0]; + + return value; +} + +double LTC2497::sampleVoltage(ADC_CHAN channel, boolean sgl) +{ + +} + +double LTC2497::sampleVoltage() +{ + +} diff --git a/lib/I2CDeviceLib/LTC2497.h b/lib/I2CDeviceLib/LTC2497.h new file mode 100644 index 0000000..81da5f3 --- /dev/null +++ b/lib/I2CDeviceLib/LTC2497.h @@ -0,0 +1,45 @@ +/* + * + */ + + #ifndef LTC2497_H + #define LTC2497_H + + #include "I2CDevice.h" + + class LTC2497 : public I2CDevice + { + public: + enum ADC_CHAN { CHAN_0 = 0b00000000, + CHAN_1 = 0b00001000, + CHAN_2 = 0b00000001, + CHAN_3 = 0b00001001, + CHAN_4 = 0b00000010, + CHAN_5 = 0b00001010, + CHAN_6 = 0b00000011, + CHAN_7 = 0b00001011, + CHAN_8 = 0b00000100, + CHAN_9 = 0b00001100, + CHAN_10 = 0b00000101, + CHAN_11 = 0b00001101, + CHAN_12 = 0b00000110, + CHAN_13 = 0b00001110, + CHAN_14 = 0b00000111, + CHAN_15 = 0b00001111}; + + LTC2497(const uint8_t address = 0x45, double vref = 3300); + + virtual boolean begin(){return I2CDevice::begin();}; + void setVref(double vref); + int32_t sampleValue(ADC_CHAN channel, boolean sgl = true); + int32_t sampleValue(); + double sampleVoltage(ADC_CHAN channel, boolean sgl = true); + double sampleVoltage(); + protected: + private: + double _vref; //Delta de tension de la plage : vref-gnd en mV + uint8_t _dataBytes[3], _adcRes; + double _quantum; + }; + + #endif //LTC2497_H diff --git a/lib/I2CDeviceLib/STS21.cpp b/lib/I2CDeviceLib/STS21.cpp new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/I2CDeviceLib/STS21.cpp @@ -0,0 +1 @@ + diff --git a/lib/I2CDeviceLib/STS21.h b/lib/I2CDeviceLib/STS21.h new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/I2CDeviceLib/STS21.h @@ -0,0 +1 @@ + diff --git a/lib/I2CDeviceLib/examples/basic/basic.ino b/lib/I2CDeviceLib/examples/basic/basic.ino new file mode 100644 index 0000000..0ef2133 --- /dev/null +++ b/lib/I2CDeviceLib/examples/basic/basic.ino @@ -0,0 +1,19 @@ +#include "LTC2497.h" + +LTC2497 ltc2497; + +void setup() +{ + Serial.begin(9600); + delay(1000); + Serial.println("Starting :"); + Serial.print("ADC Begin : ");Serial.println(ltc2497.begin()); +} + + +void loop() +{ + uint32_t valeur = ltc2497.sampleValue(LTC2497::CHAN_2); + Serial.print("Valeur adc : ");Serial.println(valeur); + delay(2000); +} diff --git a/lib/I2CDeviceLib/keywords.txt b/lib/I2CDeviceLib/keywords.txt new file mode 100644 index 0000000..a05cf3c --- /dev/null +++ b/lib/I2CDeviceLib/keywords.txt @@ -0,0 +1,48 @@ +####################################### +# Syntax Coloring Map I2CDeviceLib +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +LTC2497 KEYWORD1 +I2CDevice KEYWORD1 +STS21 KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### +begin KEYWORD2 +setVref KEYWORD2 +sampleValue KEYWORD2 +sampleVoltage KEYWORD2 +getTemperature KEYWORD2 +setResolution KEYWORD2 +enableOnChipHeater KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### +CHAN_0 LITERAL1 +CHAN_1 LITERAL1 +CHAN_2 LITERAL1 +CHAN_3 LITERAL1 +CHAN_4 LITERAL1 +CHAN_5 LITERAL1 +CHAN_6 LITERAL1 +CHAN_7 LITERAL1 +CHAN_8 LITERAL1 +CHAN_9 LITERAL1 +CHAN_10 LITERAL1 +CHAN_11 LITERAL1 +CHAN_12 LITERAL1 +CHAN_13 LITERAL1 +CHAN_14 LITERAL1 +CHAN_15 LITERAL1 +ADC_CHAN LITERAL1 +STS_RES LITERAL1 +RES_11 LITERAL1 +RES_12 LITERAL1 +RES_13 LITERAL1 +RES_14 LITERAL1