Ajout d'une deuxième version de l'ads1115 basée sur une bibliothèque ayant une meilleur granularitée pour le paramétrage (et parceque j'ai coder ...)
This commit is contained in:
parent
688b912539
commit
2d17efd1dc
134
lib/MeasureUnit/Ads1115V2.cpp
Normal file
134
lib/MeasureUnit/Ads1115V2.cpp
Normal file
@ -0,0 +1,134 @@
|
||||
#include "Ads1115V2.h"
|
||||
#define ADSV2_DEBUG
|
||||
|
||||
Ads1115V2::Ads1115V2() : ads1(ADS1115_ADDRESS_ADDR_GND), ads2(ADS1115_ADDRESS_ADDR_VDD)
|
||||
{
|
||||
#ifdef ADSV2_DEBUG
|
||||
Serial.println("Ads1115 constructor called");
|
||||
#endif
|
||||
}
|
||||
|
||||
Ads1115V2::~Ads1115V2()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Ads1115V2::begin()
|
||||
{
|
||||
#ifdef ADSV2_DEBUG
|
||||
Serial.println("Ads1115V2 : begin");
|
||||
#endif
|
||||
Wire.begin();
|
||||
//We set the adcs up:
|
||||
ads1.initialize();
|
||||
ads2.initialize();
|
||||
ads1.setMode(ADS1115_MODE_SINGLESHOT);
|
||||
ads2.setMode(ADS1115_MODE_SINGLESHOT);
|
||||
ads1.setRate(ADS1115_RATE_250);
|
||||
ads2.setRate(ADS1115_RATE_250);
|
||||
ads1.setGain(ADS1115_PGA_4P096);
|
||||
ads2.setGain(ADS1115_PGA_4P096);
|
||||
}
|
||||
|
||||
double Ads1115V2::getQuantum()
|
||||
{
|
||||
return 0.125;
|
||||
}
|
||||
|
||||
double Ads1115V2::sampleValue(int16_t channel, boolean sgl)
|
||||
{
|
||||
double total(0);
|
||||
for(int i(0); i < getAdcSetting().getMeasureIteration(); i++)
|
||||
{
|
||||
delay(getAdcSetting().getDelayBetweenIteration());
|
||||
total += getReading(channel, sgl);
|
||||
}
|
||||
|
||||
//We divide
|
||||
total /= (double)getAdcSetting().getMeasureIteration();
|
||||
|
||||
//We return
|
||||
return total;
|
||||
}
|
||||
|
||||
double Ads1115V2::sampleValue()
|
||||
{
|
||||
return sampleValue(-1);
|
||||
}
|
||||
|
||||
double Ads1115V2::sampleVoltage(int16_t channel, boolean sgl)
|
||||
{
|
||||
return sampleValue(channel, sgl)*0.125;
|
||||
}
|
||||
|
||||
double Ads1115V2::sampleVoltage()
|
||||
{
|
||||
return sampleValue()*0.125;
|
||||
}
|
||||
|
||||
uint16_t Ads1115V2::getReading(int16_t channel, boolean sgl)
|
||||
{
|
||||
int16_t chan(channel == -1 ? _lastChannel : channel);
|
||||
|
||||
_lastChannel = chan > 8 ? 0 : chan;
|
||||
|
||||
if(chan < 4)
|
||||
{
|
||||
ads1.setMultiplexer(chan+4);
|
||||
return ads1.getConversion(true);
|
||||
}
|
||||
else if(chan < 8)
|
||||
{
|
||||
ads2.setMultiplexer(chan);
|
||||
return ads2.getConversion(true);
|
||||
}
|
||||
else return 0;
|
||||
}
|
||||
|
||||
|
||||
//Async part
|
||||
void Ads1115V2::startSample(int16_t channel, boolean sgl)
|
||||
{
|
||||
switch(_state)
|
||||
{
|
||||
case IDLING:
|
||||
_state = SAMPLING;
|
||||
_elapsedTime = millis();
|
||||
_sampledValue = 0.0;
|
||||
_numOfSamples = 0;
|
||||
//We set the last channel attribute
|
||||
if(channel != -1)
|
||||
{
|
||||
_lastChannel = channel > 8 ? _lastChannel : channel;
|
||||
}
|
||||
|
||||
break;
|
||||
case SAMPLING:
|
||||
//If enough time elapsed, we can sample a value again
|
||||
if(millis() - _elapsedTime > getAdcSetting().getDelayBetweenIteration())
|
||||
{
|
||||
_sampledValue += getReading(channel, sgl);
|
||||
_elapsedTime = millis();
|
||||
_numOfSamples ++;
|
||||
}
|
||||
|
||||
//All samples are done:
|
||||
if(_numOfSamples == getAdcSetting().getMeasureIteration())
|
||||
{
|
||||
_sampledValue /= (double)_numOfSamples;
|
||||
_sampledValue += channel > 3 ? 82.0 : 0.0;
|
||||
_state = RESULT_READY;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Ads1115V2::startSample()
|
||||
{
|
||||
startSample(-1);
|
||||
}
|
||||
|
||||
double Ads1115V2::getSampleVoltage()
|
||||
{
|
||||
return getSampleValue() * 0.125;
|
||||
}
|
31
lib/MeasureUnit/Ads1115V2.h
Normal file
31
lib/MeasureUnit/Ads1115V2.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef ADS1115V2_H
|
||||
#define ADS1115V2_H
|
||||
#include "Adc.h"
|
||||
#include <Wire.h>
|
||||
#include <ADS1115x.h>
|
||||
|
||||
class Ads1115V2 : public Adc
|
||||
{
|
||||
public:
|
||||
Ads1115V2();
|
||||
~Ads1115V2();
|
||||
|
||||
virtual void begin();
|
||||
virtual double getQuantum();
|
||||
virtual double sampleValue(int16_t channel, boolean sgl = true);
|
||||
virtual double sampleValue();
|
||||
virtual double sampleVoltage(int16_t channel, boolean sgl = true);
|
||||
virtual double sampleVoltage();
|
||||
|
||||
//Async methods
|
||||
virtual void startSample(int16_t channel, boolean sgl = true);
|
||||
virtual void startSample();
|
||||
virtual double getSampleVoltage();
|
||||
//End of async methods
|
||||
protected:
|
||||
private:
|
||||
uint16_t getReading(int16_t channel = -1, boolean sgl = true);
|
||||
ADS1115 ads1, ads2;
|
||||
};
|
||||
|
||||
#endif //ADS1115V2_H
|
Loading…
Reference in New Issue
Block a user