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