10#ifndef M5_UNIT_WEIGHT_I2C_UNIT_WEIGHT_I2C_HPP
11#define M5_UNIT_WEIGHT_I2C_UNIT_WEIGHT_I2C_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <m5_utility/types.hpp>
29enum class Mode : uint8_t { Float, Int };
36 static_assert(
sizeof(float) == 4,
"Invalid float size");
37 std::array<uint8_t, 4>
raw{};
48 return std::numeric_limits<float>::quiet_NaN();
51 std::memcpy(&val,
raw.data(),
raw.size());
61 ?
static_cast<int32_t
>(
static_cast<uint32_t
>(
raw[0]) | (
static_cast<uint32_t
>(
raw[1]) << 8) |
62 (
static_cast<uint32_t
>(
raw[2]) << 16) | (
static_cast<uint32_t
>(
raw[3]) << 24))
63 : std::numeric_limits<int32_t>::min();
72class UnitWeightI2C :
public Component,
public PeriodicMeasurementAdapter<UnitWeightI2C, weighti2c::Data> {
96 : Component(addr), _data{new
m5::container::CircularBuffer<weighti2c::Data>(1)}
98 auto ccfg = component_config();
99 ccfg.clock = 100 * 1000U;
100 component_config(ccfg);
102 virtual ~UnitWeightI2C()
110 virtual bool begin()
override;
115 virtual void update(
const bool force =
false)
override;
140 return !empty() ? oldest().weight() : std::numeric_limits<float>::quiet_NaN();
148 return !empty() ? oldest().iweight() : std::numeric_limits<int32_t>::min();
162 return PeriodicMeasurementAdapter<UnitWeightI2C, weighti2c::Data>::startPeriodicMeasurement(mode, interval);
170 return PeriodicMeasurementAdapter<UnitWeightI2C, weighti2c::Data>::stopPeriodicMeasurement();
208 bool writeGap(
const float gap,
const uint32_t duration = 100);
284 bool read_register(
const uint8_t reg, uint8_t* buf,
const size_t len);
285 inline bool read_register8(
const uint8_t reg, uint8_t& val)
287 return read_register(reg, &val, 1);
290 bool start_periodic_measurement(
const weighti2c::Mode mode,
const uint32_t interval);
291 bool stop_periodic_measurement();
292 bool read_measurement(weighti2c::Data& d,
const weighti2c::Mode m);
293 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitWeightI2C, weighti2c::Data);
296 weighti2c::Mode _mode{};
297 std::unique_ptr<m5::container::CircularBuffer<weighti2c::Data>> _data{};
305constexpr uint8_t RAW_ADC_REG {0x00};
306constexpr uint8_t WEIGHT_REG {0x10};
307constexpr uint8_t GAP_REG {0x40};
308constexpr uint8_t OFFSET_REG {0x50};
309constexpr uint8_t WEIGHTX100_INT_REG {0x60};
310constexpr uint8_t WEIGHTX100_STRING_REG {0x70};
311constexpr uint8_t FILTER_REG {0x80};
312constexpr uint8_t FILTER_LP_REG {0x80};
313constexpr uint8_t FILTER_AVG_REG {0x81};
314constexpr uint8_t FILTER_EMA_REG {0x82};
315constexpr uint8_t FIRMWARE_VERSION_REG {0xFE};
316constexpr uint8_t I2C_ADDRESS_REG {0xFF};
WeightI2C unit.
Definition unit_WeightI2C.hpp:72
bool writeAvgFilterLevel(const uint8_t level)
Write the Averaging Filter level.
Definition unit_WeightI2C.cpp:185
bool startPeriodicMeasurement(const weighti2c::Mode mode, const uint32_t interval=80)
Start periodic measurement.
Definition unit_WeightI2C.hpp:160
bool measureSingleshot(weighti2c::Data &data, const weighti2c::Mode mode)
Measurement single shot.
Definition unit_WeightI2C.cpp:102
bool isEnabledLPFilter(bool &enabled)
Is enabled the Low-Pass Filter?
Definition unit_WeightI2C.cpp:164
config_t config()
Gets the configuration.
Definition unit_WeightI2C.hpp:120
bool readEmaFilterAlpha(uint8_t &alpha)
Read the Exponential Moving Average Filter alpha.
Definition unit_WeightI2C.cpp:194
bool changeI2CAddress(const uint8_t i2c_address)
Change unit I2C address.
Definition unit_WeightI2C.cpp:214
bool writeGap(const float gap, const uint32_t duration=100)
Write the gap value.
Definition unit_WeightI2C.cpp:137
bool readAvgFilterLevel(uint8_t &level)
Read the Averaging Filter level.
Definition unit_WeightI2C.cpp:180
void config(const config_t &cfg)
Set the configuration.
Definition unit_WeightI2C.hpp:125
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_WeightI2C.hpp:168
bool writeEmaFilterAlpha(const uint8_t alpha)
Write the Exponential Moving Average Filter alpha.
Definition unit_WeightI2C.cpp:199
bool readRawADC(int32_t &value)
Read the Raw ADC.
Definition unit_WeightI2C.cpp:153
bool enableLPFilter(const bool enable)
Enable the Low-Pass Filter.
Definition unit_WeightI2C.cpp:175
int32_t iweight() const
Oldest measured weight (integer)
Definition unit_WeightI2C.hpp:146
bool readI2CAddress(uint8_t &i2c_address)
Read the I2C address.
Definition unit_WeightI2C.cpp:208
bool resetOffset()
Reset offset.
Definition unit_WeightI2C.cpp:148
bool readGap(float &gap)
Read the gap value.
Definition unit_WeightI2C.cpp:127
virtual void update(const bool force=false) override
Update the cached periodic measurement data.
Definition unit_WeightI2C.cpp:67
float weight() const
Oldest measured weight (float)
Definition unit_WeightI2C.hpp:138
virtual bool begin() override
Initialize the unit and apply the current configuration.
Definition unit_WeightI2C.cpp:25
Top level namespace of M5Stack.
Settings for begin.
Definition unit_WeightI2C.hpp:80
bool start_periodic
Start periodic measurement on begin?
Definition unit_WeightI2C.hpp:88
bool lp_enable
Enable the Low-Pass Filter.
Definition unit_WeightI2C.hpp:82
uint8_t avg_filter_level
Averaging Filter level (0 - 50)
Definition unit_WeightI2C.hpp:84
uint8_t ema_filter_alpha
Exponential Moving Average Filter alpha (0-99)
Definition unit_WeightI2C.hpp:86
uint32_t interval
Measurement interval if start on begin.
Definition unit_WeightI2C.hpp:92
weighti2c::Mode mode
Measurement mode if start on begin.
Definition unit_WeightI2C.hpp:90
Measurement data group.
Definition unit_WeightI2C.hpp:35
int32_t iweight() const
Get the measured weight as an integer value multiplied by 100.
Definition unit_WeightI2C.hpp:58
float weight() const
Get the measured weight as a floating-point value.
Definition unit_WeightI2C.hpp:45
std::array< uint8_t, 4 > raw
True if the payload should be interpreted with weight()
Definition unit_WeightI2C.hpp:37
Mode
Measurement mode.
Definition unit_WeightI2C.hpp:29