13#ifndef M5_UNIT_LIGHT_UNIT_LIGHT_HPP
14#define M5_UNIT_LIGHT_UNIT_LIGHT_HPP
20#include <M5UnitComponent.hpp>
21#include <m5_utility/container/circular_buffer.hpp>
32class UnitLight :
public Component,
public PeriodicMeasurementAdapter<UnitLight, light::Data> {
33 M5_UNIT_COMPONENT_HPP_BUILDER(
UnitLight, 0x00);
46 uint16_t
dark{light::DEFAULT_DARK};
48 uint16_t
bright{light::DEFAULT_BRIGHT};
53 explicit UnitLight(
const uint8_t addr = DEFAULT_ADDRESS)
54 : Component(addr), _data{new
m5::container::CircularBuffer<
light::Data>(1)}
56 auto ccfg = component_config();
58 component_config(ccfg);
67 virtual bool begin()
override;
70 virtual void update(
const bool force =
false)
override;
100 return !empty() ? latest().analog_raw : 0;
107 return !empty() ? latest().digital :
false;
117 return std::numeric_limits<float>::quiet_NaN();
122 return d.normalized();
132 return PeriodicMeasurementAdapter<UnitLight, light::Data>::startPeriodicMeasurement();
141 return PeriodicMeasurementAdapter<UnitLight, light::Data>::startPeriodicMeasurement(interval_ms);
147 return PeriodicMeasurementAdapter<UnitLight, light::Data>::stopPeriodicMeasurement();
184 bool start_periodic_measurement();
185 bool start_periodic_measurement(
const uint32_t interval_ms);
186 bool stop_periodic_measurement();
193 std::unique_ptr<m5::container::CircularBuffer<light::Data>> _data{};
195 uint16_t _dark{light::DEFAULT_DARK};
196 uint16_t _bright{light::DEFAULT_BRIGHT};
Analog light-level detector with a comparator threshold output (U021)
uint16_t analog() const
Latest analog raw value.
Definition unit_Light.hpp:98
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_Light.hpp:145
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_Light.hpp:130
void setCalibration(const uint16_t dark, const uint16_t bright)
Set dark/bright references explicitly.
Definition unit_Light.cpp:98
config_t config() const
Gets the configuration.
Definition unit_Light.hpp:76
virtual ~UnitLight()
Destructor.
Definition unit_Light.hpp:61
UnitLight(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_Light.hpp:53
uint16_t dark() const
Current dark reference.
Definition unit_Light.hpp:171
bool startPeriodicMeasurement(const uint32_t interval_ms)
Start periodic measurement.
Definition unit_Light.hpp:139
virtual void update(const bool force=false) override
Update the unit.
Definition unit_Light.cpp:62
virtual bool begin() override
Begin the unit (configures RX as analog input, TX as digital input)
Definition unit_Light.cpp:28
void resetCalibration()
Reset calibration (dark = light::DEFAULT_DARK (0), bright = light::DEFAULT_BRIGHT (4095))
Definition unit_Light.cpp:104
bool calibrateDark()
Record the current analog reading as the dark reference.
Definition unit_Light.cpp:78
bool digital() const
Latest digital threshold output.
Definition unit_Light.hpp:105
bool calibrateBright()
Record the current analog reading as the bright reference.
Definition unit_Light.cpp:88
float normalized() const
Latest normalized light level (0..100), recomputed against the current calibration.
Definition unit_Light.hpp:114
void config(const config_t &cfg)
Set the configuration.
Definition unit_Light.hpp:82
uint16_t bright() const
Current bright reference.
Definition unit_Light.hpp:177
Top level namespace of M5Stack.
Settings for begin.
Definition unit_Light.hpp:40
bool start_periodic
Start periodic measurement on begin?
Definition unit_Light.hpp:42
uint32_t interval_ms
Sampling interval in milliseconds (default light::DEFAULT_INTERVAL_MS)
Definition unit_Light.hpp:44
uint16_t dark
Dark reference used for normalization (default light::DEFAULT_DARK)
Definition unit_Light.hpp:46
uint16_t bright
Bright reference used for normalization (default light::DEFAULT_BRIGHT)
Definition unit_Light.hpp:48
Measurement data group.
Definition unit_Light_data.hpp:40
uint16_t dark
ADC reading captured when the sensor was covered (dark reference)
Definition unit_Light_data.hpp:43
UnitLight (SKU:U021) data types (default values and Data struct)