52 lines
1.8 KiB
C++
52 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include "esphome/core/component.h"
|
|
#include "esphome/components/sensor/sensor.h"
|
|
#include "esphome/components/voltage_sampler/voltage_sampler.h"
|
|
#include "esphome/components/output/binary_output.h"
|
|
|
|
namespace esphome {
|
|
namespace gp2y1010au0f {
|
|
|
|
class GP2Y1010AU0FSensor : public sensor::Sensor, public PollingComponent {
|
|
public:
|
|
void update() override;
|
|
void loop() override;
|
|
void dump_config() override;
|
|
float get_setup_priority() const override {
|
|
// after the base sensor has been initialized
|
|
return setup_priority::DATA - 1.0f;
|
|
}
|
|
|
|
void set_adc_source(voltage_sampler::VoltageSampler *source) { source_ = source; }
|
|
void set_voltage_refs(float offset, float multiplier) {
|
|
this->voltage_offset_ = offset;
|
|
this->voltage_multiplier_ = multiplier;
|
|
}
|
|
void set_led_output(output::BinaryOutput *output) { led_output_ = output; }
|
|
|
|
protected:
|
|
// duration in ms of the sampling phase
|
|
uint32_t sample_duration_ = 100;
|
|
// duration in us of the wait before sampling
|
|
// ref: https://global.sharp/products/device/lineup/data/pdf/datasheet/gp2y1010au_appl_e.pdf
|
|
uint32_t sample_wait_before_ = 280;
|
|
// duration in us of the wait after sampling
|
|
// it seems no need to delay on purpose since one ADC sampling takes longer than that (300-400 us on ESP8266)
|
|
// uint32_t sample_wait_after_ = 40;
|
|
// the sampling source to read voltage from
|
|
voltage_sampler::VoltageSampler *source_;
|
|
// ADC voltage reading offset
|
|
float voltage_offset_ = 0.0f;
|
|
// ADC voltage reading multiplier
|
|
float voltage_multiplier_ = 1.0f;
|
|
// the binary output to control the sampling LED
|
|
output::BinaryOutput *led_output_;
|
|
|
|
float sample_sum_ = 0.0f;
|
|
uint32_t num_samples_ = 0;
|
|
bool is_sampling_ = false;
|
|
};
|
|
|
|
} // namespace gp2y1010au0f
|
|
} // namespace esphome
|