128 lines
2.3 KiB
C++
128 lines
2.3 KiB
C++
#include "Ads1115.h"
|
|
#define ADS_DEBUG
|
|
|
|
Ads1115::Ads1115() : ads1(0x48), ads2(0x49)
|
|
{
|
|
#ifdef ADS_DEBUG
|
|
Serial.println("Ads1115 constructor called");
|
|
#endif
|
|
//We set the adcs up:
|
|
ads1.setGain(GAIN_ONE);
|
|
ads2.setGain(GAIN_ONE);
|
|
}
|
|
|
|
Ads1115::~Ads1115()
|
|
{
|
|
|
|
}
|
|
|
|
void Ads1115::begin()
|
|
{
|
|
#ifdef ADS_DEBUG
|
|
Serial.println("Ads1115 : begin");
|
|
#endif
|
|
ads1.begin();
|
|
ads2.begin();
|
|
}
|
|
|
|
double Ads1115::getQuantum()
|
|
{
|
|
return 0.125;
|
|
}
|
|
|
|
double Ads1115::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 Ads1115::sampleValue()
|
|
{
|
|
return sampleValue(-1);
|
|
}
|
|
|
|
double Ads1115::sampleVoltage(int16_t channel, boolean sgl)
|
|
{
|
|
return sampleValue(channel, sgl)*0.125;
|
|
}
|
|
|
|
double Ads1115::sampleVoltage()
|
|
{
|
|
return sampleValue()*0.125;
|
|
}
|
|
|
|
uint16_t Ads1115::getReading(int16_t channel, boolean sgl)
|
|
{
|
|
int16_t chan(channel == -1 ? _lastChannel : channel);
|
|
|
|
_lastChannel = chan > 8 ? 0 : chan;
|
|
|
|
if(chan < 4)
|
|
{
|
|
return ads1.readADC_SingleEnded(chan);
|
|
}
|
|
else if(chan < 8)
|
|
{
|
|
return ads2.readADC_SingleEnded(chan - 4);
|
|
}
|
|
else return 0;
|
|
}
|
|
|
|
|
|
//Async part
|
|
void Ads1115::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 Ads1115::startSample()
|
|
{
|
|
startSample(-1);
|
|
}
|
|
|
|
double Ads1115::getSampleVoltage()
|
|
{
|
|
return getSampleValue() * 0.125;
|
|
}
|