M5Unit-LIGHT 0.0.2 git rev:6d734f0
Loading...
Searching...
No Matches
unit_BH1750FVI.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_BH1750FVI_HPP
14#define M5_UNIT_LIGHT_UNIT_BH1750FVI_HPP
15
16#include <M5UnitComponent.hpp>
17#include <m5_utility/stl/extension.hpp>
18#include <m5_utility/container/circular_buffer.hpp>
19#include "unit_BH1750FVI_data.hpp" // Mode, Resolution, MTREG_* constants, Data (with inline lux())
20#include <cstdint>
21#include <limits>
22
23namespace m5 {
24namespace unit {
25
26namespace bh1750fvi {
27
29namespace command {
30// Power / reset opcodes
31constexpr uint8_t POWER_DOWN{0x00};
32constexpr uint8_t POWER_ON{0x01};
33constexpr uint8_t RESET{0x07};
34
35// Continuous-mode measurement opcodes
36constexpr uint8_t CONTINUOUS_H_RES_MODE{0x10};
37constexpr uint8_t CONTINUOUS_H_RES_MODE2{0x11};
38constexpr uint8_t CONTINUOUS_L_RES_MODE{0x13};
39
40// One-time measurement opcodes
41constexpr uint8_t ONE_TIME_H_RES_MODE{0x20};
42constexpr uint8_t ONE_TIME_H_RES_MODE2{0x21};
43constexpr uint8_t ONE_TIME_L_RES_MODE{0x23}; // NOTE: same hex as slave address, not related
44
45// MTreg opcodes (bitmask bases; combine with mtreg bits)
46constexpr uint8_t CHANGE_MEASUREMENT_TIME_HIGH{0x40};
47constexpr uint8_t CHANGE_MEASUREMENT_TIME_LOW{0x60};
48} // namespace command
50
51} // namespace bh1750fvi
52
58class UnitBH1750FVI : public Component, public PeriodicMeasurementAdapter<UnitBH1750FVI, bh1750fvi::Data> {
59 M5_UNIT_COMPONENT_HPP_BUILDER(UnitBH1750FVI, 0x23);
60
61public:
63 static constexpr uint8_t ALT_ADDRESS{0x5C};
64
69 struct config_t {
71 bool start_periodic{true};
73 bh1750fvi::Resolution resolution{bh1750fvi::Resolution::High};
75 uint8_t mtreg{bh1750fvi::MTREG_DEFAULT};
76 };
77
80 explicit UnitBH1750FVI(const uint8_t addr = DEFAULT_ADDRESS)
81 : Component(addr), _data{new m5::container::CircularBuffer<bh1750fvi::Data>(1)}
82 {
83 auto ccfg = component_config();
84 ccfg.clock = 400 * 1000U; // BH1750FVI I2C max clock
85 ccfg.stored_size = 8;
86 component_config(ccfg);
87 }
90 {
91 }
92
95 virtual bool begin() override;
98 virtual void update(const bool force = false) override;
99
104 inline config_t config() const
105 {
106 return _cfg;
107 }
110 inline void config(const config_t& cfg)
111 {
112 _cfg = cfg;
113 }
115
120 inline float lux() const
121 {
122 return !empty() ? latest().lux() : std::numeric_limits<float>::quiet_NaN();
123 }
126 inline uint16_t raw() const
127 {
128 return !empty() ? latest().raw : 0;
129 }
133 {
134 return _resolution;
135 }
138 inline uint8_t mtreg() const
139 {
140 return _mtreg;
141 }
143
146
151 {
152 return PeriodicMeasurementAdapter<UnitBH1750FVI, bh1750fvi::Data>::startPeriodicMeasurement();
153 }
161 {
162 return PeriodicMeasurementAdapter<UnitBH1750FVI, bh1750fvi::Data>::startPeriodicMeasurement(resolution, mtreg);
163 }
169 {
170 return PeriodicMeasurementAdapter<UnitBH1750FVI, bh1750fvi::Data>::stopPeriodicMeasurement();
171 }
173
176
184 bool measureSingleShot(bh1750fvi::Data& data, const bh1750fvi::Resolution resolution = bh1750fvi::Resolution::High,
185 const uint8_t mtreg = bh1750fvi::MTREG_DEFAULT);
187
190
196 bool writeMTreg(const uint8_t mtreg);
197
203 bool writeSensitivityFactor(const float factor);
204
207 inline uint8_t readMTreg() const
208 {
209 return _mtreg;
210 }
212
215
217 bool powerOn();
220 bool powerDown();
223 bool softReset();
225
226protected:
227 bool start_periodic_measurement();
228 bool start_periodic_measurement(const bh1750fvi::Resolution resolution, const uint8_t mtreg);
229 bool stop_periodic_measurement();
230
231 bool read_measurement(bh1750fvi::Data& data);
232 bool write_opcode(const uint8_t opcode);
233 bool write_mtreg_opcodes(const uint8_t mtreg);
234 uint8_t opcode_for(const bh1750fvi::Mode mode, const bh1750fvi::Resolution resolution) const;
235
236 void apply_interval(const bh1750fvi::Resolution resolution, const uint8_t mtreg);
237
238 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitBH1750FVI, bh1750fvi::Data);
239
240protected:
241 std::unique_ptr<m5::container::CircularBuffer<bh1750fvi::Data>> _data{};
242 config_t _cfg{};
243 bh1750fvi::Resolution _resolution{bh1750fvi::Resolution::High};
244 uint8_t _mtreg{bh1750fvi::MTREG_DEFAULT};
245};
246
247} // namespace unit
248} // namespace m5
249
250#endif
Digital ambient light sensor.
virtual ~UnitBH1750FVI()
Destructor.
Definition unit_BH1750FVI.hpp:89
UnitBH1750FVI(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_BH1750FVI.hpp:80
bool startPeriodicMeasurement(const bh1750fvi::Resolution resolution, const uint8_t mtreg)
Start periodic measurement.
Definition unit_BH1750FVI.hpp:160
void config(const config_t &cfg)
Set the configuration.
Definition unit_BH1750FVI.hpp:110
virtual void update(const bool force=false) override
Update the unit.
Definition unit_BH1750FVI.cpp:102
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_BH1750FVI.hpp:150
static constexpr uint8_t ALT_ADDRESS
Alternate I2C address when ADDR pin is tied high.
Definition unit_BH1750FVI.hpp:63
bool writeMTreg(const uint8_t mtreg)
Write MTreg as raw value (31..254)
Definition unit_BH1750FVI.cpp:155
uint8_t mtreg() const
MTreg currently in effect.
Definition unit_BH1750FVI.hpp:138
uint8_t readMTreg() const
Gets the current MTreg cache.
Definition unit_BH1750FVI.hpp:207
virtual bool begin() override
Begin the unit.
Definition unit_BH1750FVI.cpp:50
uint16_t raw() const
Latest raw value.
Definition unit_BH1750FVI.hpp:126
bool writeSensitivityFactor(const float factor)
Write MTreg as sensitivity factor (0.45..3.68)
Definition unit_BH1750FVI.cpp:181
bool measureSingleShot(bh1750fvi::Data &data, const bh1750fvi::Resolution resolution=bh1750fvi::Resolution::High, const uint8_t mtreg=bh1750fvi::MTREG_DEFAULT)
Measure single-shot.
Definition unit_BH1750FVI.cpp:118
float lux() const
Latest illuminance (lx)
Definition unit_BH1750FVI.hpp:120
bh1750fvi::Resolution resolution() const
Resolution currently in effect.
Definition unit_BH1750FVI.hpp:132
bool powerOn()
Write POWER_ON opcode.
Definition unit_BH1750FVI.cpp:194
bool powerDown()
Write POWER_DOWN opcode.
Definition unit_BH1750FVI.cpp:199
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_BH1750FVI.hpp:168
bool softReset()
Write RESET opcode (clears data register; requires POWER_ON state)
Definition unit_BH1750FVI.cpp:210
config_t config() const
Gets the configuration.
Definition unit_BH1750FVI.hpp:104
For BH1750FVI.
Top level namespace of M5Stack.
Unit-related namespace.
Settings for begin.
Definition unit_BH1750FVI.hpp:69
bh1750fvi::Resolution resolution
Resolution if start on begin.
Definition unit_BH1750FVI.hpp:73
uint8_t mtreg
MTreg if start on begin (31..254, default 69)
Definition unit_BH1750FVI.hpp:75
bool start_periodic
Start periodic measurement on begin? (true: Continuous mode, false: standby for one-time/manual contr...
Definition unit_BH1750FVI.hpp:71
Measurement data group.
Definition unit_BH1750FVI_data.hpp:65
BH1750FVI data types (enums, constants, Data struct)
Resolution
Resolution of the measurement.
Definition unit_BH1750FVI_data.hpp:43
Mode
Measurement mode.
Definition unit_BH1750FVI_data.hpp:33