M5Unit-LIGHT 0.0.2 git rev:6d734f0
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 <M5UnitComponent.hpp>
17#include <m5_utility/stl/extension.hpp>
18#include <m5_utility/container/circular_buffer.hpp>
19#include "unit_Light_data.hpp" // Data (with inline normalized())
20#include <cstdint>
21#include <limits>
22
23namespace m5 {
24namespace unit {
25
30class UnitLight : public Component, public PeriodicMeasurementAdapter<UnitLight, light::Data> {
31 M5_UNIT_COMPONENT_HPP_BUILDER(UnitLight, 0x00);
32
33public:
38 struct config_t {
40 bool start_periodic{true};
42 uint32_t interval_ms{50};
44 uint16_t dark{0};
46 uint16_t bright{4095};
47 };
48
51 explicit UnitLight(const uint8_t addr = DEFAULT_ADDRESS)
52 : Component(addr), _data{new m5::container::CircularBuffer<light::Data>(1)}
53 {
54 auto ccfg = component_config();
55 ccfg.stored_size = 1;
56 component_config(ccfg);
57 }
59 virtual ~UnitLight()
60 {
61 }
62
65 virtual bool begin() override;
68 virtual void update(const bool force = false) override;
69
74 inline config_t config() const
75 {
76 return _cfg;
77 }
80 inline void config(const config_t& cfg)
81 {
82 _cfg = cfg;
83 }
85
94 inline uint16_t analog() const
95 {
96 return !empty() ? latest().analog_raw : 0;
97 }
101 inline bool digital() const
102 {
103 return !empty() ? latest().digital : false;
104 }
110 inline float normalized() const
111 {
112 if (empty()) return std::numeric_limits<float>::quiet_NaN();
113 light::Data d = latest();
114 d.dark = _dark;
115 d.bright = _bright;
116 return d.normalized();
117 }
119
122
125 {
126 return PeriodicMeasurementAdapter<UnitLight, light::Data>::startPeriodicMeasurement();
127 }
133 inline bool startPeriodicMeasurement(const uint32_t interval_ms)
134 {
135 return PeriodicMeasurementAdapter<UnitLight, light::Data>::startPeriodicMeasurement(interval_ms);
136 }
140 {
141 return PeriodicMeasurementAdapter<UnitLight, light::Data>::stopPeriodicMeasurement();
142 }
144
147
150 bool calibrateDark();
154 bool calibrateBright();
159 void setCalibration(const uint16_t dark, const uint16_t bright);
162 void resetCalibration();
163
166 inline uint16_t dark() const
167 {
168 return _dark;
169 }
172 inline uint16_t bright() const
173 {
174 return _bright;
175 }
177
178protected:
179 bool start_periodic_measurement();
180 bool start_periodic_measurement(const uint32_t interval_ms);
181 bool stop_periodic_measurement();
182
183 bool read_measurement(light::Data& data);
184
185 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitLight, light::Data);
186
187protected:
188 std::unique_ptr<m5::container::CircularBuffer<light::Data>> _data{};
189 config_t _cfg{};
190 uint16_t _dark{0};
191 uint16_t _bright{4095};
192};
193
194} // namespace unit
195} // namespace m5
196
197#endif
Analog light-level detector with a comparator threshold output (U021)
uint16_t analog() const
Latest analog raw value.
Definition unit_Light.hpp:94
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_Light.hpp:139
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_Light.hpp:124
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:74
virtual ~UnitLight()
Destructor.
Definition unit_Light.hpp:59
UnitLight(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_Light.hpp:51
uint16_t dark() const
Current dark reference.
Definition unit_Light.hpp:166
bool startPeriodicMeasurement(const uint32_t interval_ms)
Start periodic measurement.
Definition unit_Light.hpp:133
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=0, 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:101
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:110
void config(const config_t &cfg)
Set the configuration.
Definition unit_Light.hpp:80
uint16_t bright() const
Current bright reference.
Definition unit_Light.hpp:172
For UnitLight (U021)
Top level namespace of M5Stack.
Unit-related namespace.
Settings for begin.
Definition unit_Light.hpp:38
bool start_periodic
Start periodic measurement on begin?
Definition unit_Light.hpp:40
uint32_t interval_ms
Sampling interval in milliseconds.
Definition unit_Light.hpp:42
uint16_t dark
Dark reference used for normalization (default 0)
Definition unit_Light.hpp:44
uint16_t bright
Bright reference used for normalization (default 4095 for 12-bit ADC)
Definition unit_Light.hpp:46
Measurement data group.
Definition unit_Light_data.hpp:33
float normalized() const
Normalized brightness in 0..100 (%), where 0% = dark reference and 100% = bright reference.
Definition unit_Light_data.hpp:47
uint16_t bright
ADC reading captured when the sensor was lit (bright reference)
Definition unit_Light_data.hpp:37
uint16_t dark
ADC reading captured when the sensor was covered (dark reference)
Definition unit_Light_data.hpp:36
UnitLight (SKU:U021) data types (Data struct)