projet3_temperature/lib/MeasureUnit/Ads1115V2.cpp

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;
}