M5Unit-LIGHT 0.1.0 git rev:1ddbe92
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 <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_BH1750FVI_data.hpp" // Mode, Resolution, MTREG_* constants, Data (with inline lux())
24
25namespace m5 {
26namespace unit {
27
28namespace bh1750fvi {
29
31namespace command {
32// Power / reset opcodes
33constexpr uint8_t POWER_DOWN{0x00};
34constexpr uint8_t POWER_ON{0x01};
35constexpr uint8_t RESET{0x07};
36
37// Continuous-mode measurement opcodes
38constexpr uint8_t CONTINUOUS_H_RES_MODE{0x10};
39constexpr uint8_t CONTINUOUS_H_RES_MODE2{0x11};
40constexpr uint8_t CONTINUOUS_L_RES_MODE{0x13};
41
42// One-time measurement opcodes
43constexpr uint8_t ONE_TIME_H_RES_MODE{0x20};
44constexpr uint8_t ONE_TIME_H_RES_MODE2{0x21};
45constexpr uint8_t ONE_TIME_L_RES_MODE{0x23}; // NOTE: same hex as slave address, not related
46
47// MTreg opcodes (bitmask bases; combine with mtreg bits)
48constexpr uint8_t CHANGE_MEASUREMENT_TIME_HIGH{0x40}; // OR with ((mtreg >> 5) & 0x07)
49constexpr uint8_t CHANGE_MEASUREMENT_TIME_LOW{0x60}; // OR with (mtreg & 0x1F)
50} // namespace command
52
53} // namespace bh1750fvi
54
60class UnitBH1750FVI : public Component, public PeriodicMeasurementAdapter<UnitBH1750FVI, bh1750fvi::Data> {
61 M5_UNIT_COMPONENT_HPP_BUILDER(UnitBH1750FVI, 0x23);
62
63public:
65 static constexpr uint8_t ALT_ADDRESS{0x5C};
66
71 struct config_t {
73 bool start_periodic{true};
75 bh1750fvi::Resolution resolution{bh1750fvi::Resolution::High};
77 uint8_t mtreg{bh1750fvi::MTREG_DEFAULT};
78 };
79
82 explicit UnitBH1750FVI(const uint8_t addr = DEFAULT_ADDRESS)
83 : Component(addr), _data{new m5::container::CircularBuffer<bh1750fvi::Data>(1)}
84 {
85 auto ccfg = component_config();
86 ccfg.clock = 400 * 1000U; // BH1750FVI I2C max clock
87 ccfg.stored_size = 8;
88 component_config(ccfg);
89 }
92 {
93 }
94
97 virtual bool begin() override;
100 virtual void update(const bool force = false) override;
101
106 inline config_t config() const
107 {
108 return _cfg;
109 }
112 inline void config(const config_t& cfg)
113 {
114 _cfg = cfg;
115 }
117
122 inline float lux() const
123 {
124 return !empty() ? latest().lux() : std::numeric_limits<float>::quiet_NaN();
125 }
128 inline uint16_t raw() const
129 {
130 return !empty() ? latest().raw : 0;
131 }
133
139 {
140 return _resolution;
141 }
144 inline uint8_t mtreg() const
145 {
146 return _mtreg;
147 }
149
152
159 {
160 return PeriodicMeasurementAdapter<UnitBH1750FVI, bh1750fvi::Data>::startPeriodicMeasurement();
161 }
171 {
172 return PeriodicMeasurementAdapter<UnitBH1750FVI, bh1750fvi::Data>::startPeriodicMeasurement(resolution, mtreg);
173 }
179 {
180 return PeriodicMeasurementAdapter<UnitBH1750FVI, bh1750fvi::Data>::stopPeriodicMeasurement();
181 }
183
186
196 bool measureSingleShot(bh1750fvi::Data& data, const bh1750fvi::Resolution resolution = bh1750fvi::Resolution::High,
197 const uint8_t mtreg = bh1750fvi::MTREG_DEFAULT);
199
202
208 bool writeMTreg(const uint8_t mtreg);
209
215 bool writeSensitivityFactor(const float factor);
216
220 [[deprecated("Use mtreg() instead")]] inline uint8_t readMTreg() const
221 {
222 return mtreg();
223 }
225
228
230 bool powerOn();
234 bool powerDown();
237 bool softReset();
239
240protected:
241 bool start_periodic_measurement();
242 bool start_periodic_measurement(const bh1750fvi::Resolution resolution, const uint8_t mtreg);
243 bool stop_periodic_measurement();
244
245 bool read_measurement(bh1750fvi::Data& data);
246 bool write_opcode(const uint8_t opcode);
247 bool write_mtreg_opcodes(const uint8_t mtreg);
248 uint8_t opcode_for(const bh1750fvi::Mode mode, const bh1750fvi::Resolution resolution) const;
249
250 void apply_interval(const bh1750fvi::Resolution resolution, const uint8_t mtreg);
251
252 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitBH1750FVI, bh1750fvi::Data);
253
254protected:
255 std::unique_ptr<m5::container::CircularBuffer<bh1750fvi::Data>> _data{};
256 config_t _cfg{};
257 bh1750fvi::Resolution _resolution{bh1750fvi::Resolution::High};
258 uint8_t _mtreg{bh1750fvi::MTREG_DEFAULT};
259};
260
261} // namespace unit
262} // namespace m5
263
264#endif
Digital ambient light sensor.
virtual ~UnitBH1750FVI()
Destructor.
Definition unit_BH1750FVI.hpp:91
UnitBH1750FVI(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_BH1750FVI.hpp:82
bool startPeriodicMeasurement(const bh1750fvi::Resolution resolution, const uint8_t mtreg)
Start periodic measurement.
Definition unit_BH1750FVI.hpp:170
void config(const config_t &cfg)
Set the configuration.
Definition unit_BH1750FVI.hpp:112
virtual void update(const bool force=false) override
Update the unit.
Definition unit_BH1750FVI.cpp:101
bool startPeriodicMeasurement()
Start periodic measurement with the resolution / mtreg of config()
Definition unit_BH1750FVI.hpp:158
static constexpr uint8_t ALT_ADDRESS
Alternate I2C address when ADDR pin is tied high.
Definition unit_BH1750FVI.hpp:65
bool writeMTreg(const uint8_t mtreg)
Write MTreg as raw value (31..254)
Definition unit_BH1750FVI.cpp:154
uint8_t mtreg() const
MTreg currently in effect.
Definition unit_BH1750FVI.hpp:144
uint8_t readMTreg() const
Gets the current MTreg cache.
Definition unit_BH1750FVI.hpp:220
virtual bool begin() override
Begin the unit.
Definition unit_BH1750FVI.cpp:51
uint16_t raw() const
Latest raw value.
Definition unit_BH1750FVI.hpp:128
bool writeSensitivityFactor(const float factor)
Write MTreg as sensitivity factor (0.45..3.68)
Definition unit_BH1750FVI.cpp:180
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:117
float lux() const
Latest illuminance (lx)
Definition unit_BH1750FVI.hpp:122
bh1750fvi::Resolution resolution() const
Resolution currently in effect.
Definition unit_BH1750FVI.hpp:138
bool powerOn()
Write POWER_ON opcode.
Definition unit_BH1750FVI.cpp:191
bool powerDown()
Write POWER_DOWN opcode.
Definition unit_BH1750FVI.cpp:196
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_BH1750FVI.hpp:178
bool softReset()
Write RESET opcode (clears data register; requires POWER_ON state)
Definition unit_BH1750FVI.cpp:207
config_t config() const
Gets the configuration.
Definition unit_BH1750FVI.hpp:106
For BH1750FVI.
Top level namespace of M5Stack.
Unit-related namespace.
Settings for begin.
Definition unit_BH1750FVI.hpp:71
bh1750fvi::Resolution resolution
Resolution if start on begin.
Definition unit_BH1750FVI.hpp:75
uint8_t mtreg
MTreg if start on begin (31..254, default 69)
Definition unit_BH1750FVI.hpp:77
bool start_periodic
Start periodic measurement on begin? (true: Continuous mode, false: standby for one-time/manual contr...
Definition unit_BH1750FVI.hpp:73
Measurement data group.
Definition unit_BH1750FVI_data.hpp:63
BH1750FVI data types (enums, constants, Data struct)
Resolution
Resolution of the measurement.
Definition unit_BH1750FVI_data.hpp:41
Mode
Measurement mode.
Definition unit_BH1750FVI_data.hpp:31