8#include "gp2y1010au0f_drv.h"
14 : _adc(adc), _ir_led(led), _timer(timer), _voltage_factor(factor) {
17 _ir_led.gpioMode(GPIO::OUTPUT | GPIO::INIT_LOW);
18 _timer.setCallback([
this]() {
31 _state = STOP_MEASURE;
34void gp2y1010au0f_drv::start_measure(uint16_t m,
void (*callback)(
gp2y1010au0f_drv *)) {
39 _state = START_MEASURE;
44gp2y1010au0f_drv::~gp2y1010au0f_drv() {
45 _ir_led.gpioMode(GPIO::INPUT);
49void gp2y1010au0f_drv::process_state() {
53 _timer.setPeriod(DELAY, TIMER::ONE_SHOT);
57 _ir_led.gpioWrite(HIGH);
62 _timer.setPeriod(T - DELAY, TIMER::ONE_SHOT);
64 _raw_sum += _adc.adcReadRaw();
66 _ir_led.gpioWrite(LOW);
71 _timer.setPeriod(T - DELAY, TIMER::ONE_SHOT);
73 _state = START_MEASURE;
76 _state = STOP_MEASURE;
84 _raw_sum /= _measurements;
86 _volt = _adc.rawToVoltage(_raw_sum) * _voltage_factor;
88 if (_volt < _volt_min) _volt_min = _volt;
89 if (_volt > _volt_max) _volt_max = _volt;
91 _dust = voltage_to_dust(_volt);
106float gp2y1010au0f_drv::voltage_to_dust(
float VO) {
107 float v1 = _volt_min + 0.05f;
108 float v2 = _volt_max - 0.2f;
110 if (VO < v1)
return 0.0f;
113 return 500.0f / (v2 - v1) * VO;
115 if (VO < _volt_max) {
117 return 300.0f / (_volt_max - v2) * VO + 500.0f;