122 lines
3.4 KiB
C++
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);
|
|
}
|