M5Unit-LIGHT 0.1.0 git rev:1ddbe92
Loading...
Searching...
No Matches
unit_Light.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
13#ifndef M5_UNIT_LIGHT_UNIT_LIGHT_HPP
14#define M5_UNIT_LIGHT_UNIT_LIGHT_HPP
15
16#include <cstdint>
17#include <limits>
18#include <memory> // std::unique_ptr
19
20#include <M5UnitComponent.hpp>
21#include <m5_utility/container/circular_buffer.hpp>
22
23#include "unit_Light_data.hpp" // Data (with inline normalized())
24
25namespace m5 {
26namespace unit {
27
32class UnitLight : public Component, public PeriodicMeasurementAdapter<UnitLight, light::Data> {
33 M5_UNIT_COMPONENT_HPP_BUILDER(UnitLight, 0x00);
34
35public:
40 struct config_t {
42 bool start_periodic{true};
44 uint32_t interval_ms{light::DEFAULT_INTERVAL_MS};
46 uint16_t dark{light::DEFAULT_DARK};
48 uint16_t bright{light::DEFAULT_BRIGHT};
49 };
50
53 explicit UnitLight(const uint8_t addr = DEFAULT_ADDRESS)
54 : Component(addr), _data{new m5::container::CircularBuffer<light::Data>(1)}
55 {
56 auto ccfg = component_config();
57 ccfg.stored_size = 1;
58 component_config(ccfg);
59 }
61 virtual ~UnitLight()
62 {
63 }
64
67 virtual bool begin() override;
70 virtual void update(const bool force = false) override;
71
76 inline config_t config() const
77 {
78 return _cfg;
79 }
82 inline void config(const config_t& cfg)
83 {
84 _cfg = cfg;
85 }
87
98 inline uint16_t analog() const
99 {
100 return !empty() ? latest().analog_raw : 0;
101 }
105 inline bool digital() const
106 {
107 return !empty() ? latest().digital : false;
108 }
114 inline float normalized() const
115 {
116 if (empty()) {
117 return std::numeric_limits<float>::quiet_NaN();
118 }
119 light::Data d{latest()};
120 d.dark = _dark;
121 d.bright = _bright;
122 return d.normalized();
123 }
125
128
131 {
132 return PeriodicMeasurementAdapter<UnitLight, light::Data>::startPeriodicMeasurement();
133 }
139 inline bool startPeriodicMeasurement(const uint32_t interval_ms)
140 {
141 return PeriodicMeasurementAdapter<UnitLight, light::Data>::startPeriodicMeasurement(interval_ms);
142 }
146 {
147 return PeriodicMeasurementAdapter<UnitLight, light::Data>::stopPeriodicMeasurement();
148 }
150
156
158 bool calibrateDark();
161 bool calibrateBright();
165 void setCalibration(const uint16_t dark, const uint16_t bright);
167 void resetCalibration();
168
171 inline uint16_t dark() const
172 {
173 return _dark;
174 }
177 inline uint16_t bright() const
178 {
179 return _bright;
180 }
182
183protected:
184 bool start_periodic_measurement();
185 bool start_periodic_measurement(const uint32_t interval_ms);
186 bool stop_periodic_measurement();
187
188 bool read_measurement(light::Data& data);
189
190 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitLight, light::Data);
191
192protected:
193 std::unique_ptr<m5::container::CircularBuffer<light::Data>> _data{};
194 config_t _cfg{};
195 uint16_t _dark{light::DEFAULT_DARK};
196 uint16_t _bright{light::DEFAULT_BRIGHT};
197};
198
199} // namespace unit
200} // namespace m5
201
202#endif
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
For UnitLight (U021)
Top level namespace of M5Stack.
Unit-related namespace.
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)