ATMEGA328PU_lowPower_weathe.../src/app/WSPeripherals.cpp

122 lines
3.4 KiB
C++

#include "WSPeripherals.h"
WSPeripherals::WSPeripherals(const BoardConfig &boardConfig): _boardConfig(boardConfig), _HTU21(HTU21D_RES_RH12_TEMP14), _NRF(boardConfig.NRFCe, boardConfig.NRFCs)
{}
uint8_t WSPeripherals::init()
{
uint8_t toReturn(0);
//We initialize used pins :
pinMode(_boardConfig.LDOEnable, OUTPUT);
_3V3PowerRail(OFF);
pinMode(_boardConfig.LDRVSensEnable, OUTPUT);
digitalWrite(_boardConfig.LDRVSensEnable, HIGH); //High means that it is disabled and low is active /!\/
pinMode(_boardConfig.BATVSensEnable, OUTPUT);
digitalWrite(_boardConfig.BATVSensEnable, LOW);
//Unused pins are set as inputs with internal pullup enabled to reduce power consumption during sleep
pinMode(0,INPUT_PULLUP);
//pinMode(1,INPUT_PULLUP); TX pin for serial
pinMode(6,INPUT_PULLUP);
pinMode(7,INPUT_PULLUP);
pinMode(8,INPUT_PULLUP);
pinMode(9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
pinMode(11,INPUT_PULLUP);
pinMode(12,INPUT_PULLUP);
pinMode(A2,INPUT_PULLUP);
pinMode(A3,INPUT_PULLUP);
pinMode(A6,INPUT_PULLUP);
pinMode(A7,INPUT_PULLUP);
//We check that every external devices are responding
_3V3PowerRail(ON);
toReturn |= _BMP280.begin(0x76);
toReturn |= _HTU21.begin() << 1;
toReturn |= _NRF.begin() << 2;
_3V3PowerRail(OFF);
return toReturn;
}
uint8_t WSPeripherals::initExternalPeripherals()
{
uint8_t toReturn(0);
toReturn |= _BMP280.begin(0x76);
toReturn |= _HTU21.begin() << 1;
toReturn |= _NRF.begin() << 2;
//We disable the I2C internal pullups :
digitalWrite(SDA, LOW);
digitalWrite(SCL, LOW);
return toReturn;
}
float WSPeripherals::batteryVoltage()
{
//We close the voltage divider bridge and we do the measurement
digitalWrite(_boardConfig.BATVSensEnable, HIGH);
int rawBatteryValue = analogRead(_boardConfig.BATAnalogVSens);
digitalWrite(_boardConfig.BATVSensEnable, LOW);
return float(rawBatteryValue) * ADC_QUANTUM * VOLTAGE_DIV_COEFF;
}
int WSPeripherals::sunlightMeasurement()
{
//We enable the voltage divider bridge and we do the measurement
digitalWrite(_boardConfig.LDRVSensEnable, LOW);
int rawSunlightMeasurement = analogRead(_boardConfig.LDRAnalogVSens);
digitalWrite(_boardConfig.LDRVSensEnable, HIGH);
return rawSunlightMeasurement;
}
void WSPeripherals::temperatureAndATMPressureFromBMP280(float *temperature, float *ATMPressure)
{
if(!temperature && !ATMPressure)return;
_BMP280.setSampling( Adafruit_BMP280::MODE_FORCED,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_4000);
if(temperature)
*temperature = _BMP280.readTemperature();
if(ATMPressure)
*ATMPressure = _BMP280.readPressure();
}
float WSPeripherals::temperatureFromHTU21()
{
return _HTU21.readTemperature();
}
float WSPeripherals::humidity()
{
return _HTU21.readHumidity();
}
float WSPeripherals::compensatedHumidity()
{
return _HTU21.readCompensatedHumidity();
}
void WSPeripherals::_3V3PowerRail(State state)
{
digitalWrite(_boardConfig.LDOEnable, state);
if(state) //We let some time for the voltage to stabilize on the rail.
delay(10);
}
const RF24 &WSPeripherals::getRadio(){return _NRF;}
void WSPeripherals::applyRadioConfig(uint8_t channel, uint8_t paLevel, rf24_datarate_e datarate)
{
_NRF.setChannel(channel);
_NRF.setPALevel(paLevel);
_NRF.setDataRate(datarate);
}