135 lines
2.7 KiB
C++
135 lines
2.7 KiB
C++
#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;
|
|
}
|