10#ifndef M5_UNIT_METER_UNIT_ADS111X_HPP
11#define M5_UNIT_METER_UNIT_ADS111X_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/stl/extension.hpp>
15#include <m5_utility/container/circular_buffer.hpp>
31enum class Mux : uint8_t {
87 inline bool os()
const
89 return value & (1U << 15);
91 inline Mux mux()
const
93 return static_cast<Mux
>((value >> 12) & 0x07);
95 inline Gain pga()
const
97 uint8_t v = (value >> 9) & 0x07;
98 return static_cast<Gain
>(v > 5 ? 5 : v);
100 inline bool mode()
const
102 return value & (1U << 8);
106 return static_cast<Sampling>((value >> 5) & 0x07);
108 inline bool comp_mode()
const
110 return value & (1U << 4);
112 inline bool comp_pol()
const
114 return value & (1U << 3);
116 inline bool comp_lat()
const
118 return value & (1U << 2);
124 inline void os(
const bool b)
126 value = (value & ~(1U << 15)) | ((b ? 1U : 0) << 15);
128 inline void mux(
const Mux m)
130 value = (value & ~(0x07 << 12)) | ((m5::stl::to_underlying(m) & 0x07) << 12);
132 inline void pga(
const Gain g)
134 value = (value & ~(0x07 << 9)) | ((m5::stl::to_underlying(g) & 0x07) << 9);
136 inline void mode(
const bool b)
138 value = (value & ~(1U << 8)) | ((b ? 1U : 0) << 8);
140 inline void dr(
const Sampling r)
142 value = (value & ~(0x07 << 5)) | ((m5::stl::to_underlying(r) & 0x07) << 5);
144 inline void comp_mode(
const bool b)
146 value = (value & ~(1U << 4)) | ((b ? 1U : 0) << 4);
148 inline void comp_pol(
const bool b)
150 value = (value & ~(1U << 3)) | ((b ? 1U : 0) << 3);
152 inline void comp_lat(
const bool b)
154 value = (value & ~(1U << 2)) | ((b ? 1U : 0) << 2);
156 inline void comp_que(
const ComparatorQueue c)
158 value = (value & ~0x03U) | (m5::stl::to_underlying(c) & 0x03);
171 inline int16_t
adc()
const
173 return static_cast<int16_t
>(raw);
183class UnitADS111x :
public Component,
public PeriodicMeasurementAdapter<UnitADS111x, ads111x::Data> {
184 M5_UNIT_COMPONENT_HPP_BUILDER(UnitADS111x, 0x00);
204 explicit UnitADS111x(
const uint8_t addr = DEFAULT_ADDRESS)
205 : Component(addr), _data{new
m5::container::CircularBuffer<
ads111x::
Data>(1)}
207 auto ccfg = component_config();
208 ccfg.clock = 400 * 1000U;
209 component_config(ccfg);
211 virtual ~UnitADS111x()
215 virtual bool begin()
override;
216 virtual void update(
const bool force =
false)
override;
247 inline int16_t
adc()
const
249 return !empty() ? oldest().adc() : std::numeric_limits<int16_t>::min();
261 return PeriodicMeasurementAdapter<UnitADS111x, ads111x::Data>::startPeriodicMeasurement();
274 return PeriodicMeasurementAdapter<UnitADS111x, ads111x::Data>::startPeriodicMeasurement(rate, mux,
gain,
283 return PeriodicMeasurementAdapter<UnitADS111x, ads111x::Data>::stopPeriodicMeasurement();
294 return _ads_cfg.mux();
303 return _ads_cfg.dr();
312 return _ads_cfg.comp_mode();
321 return _ads_cfg.comp_pol();
330 return _ads_cfg.comp_lat();
336 return _ads_cfg.comp_que();
415 bool start_periodic_measurement();
418 bool stop_periodic_measurement();
421 bool start_single_measurement();
422 bool in_conversion();
424 bool read_config(ads111x::Config& c);
425 bool write_config(
const ads111x::Config& c);
431 bool write_comparator_mode(
const bool b);
432 bool write_comparator_polarity(
const bool b);
433 bool write_latching_comparator(
const bool b);
439 std::unique_ptr<m5::container::CircularBuffer<ads111x::Data>> _data{};
440 float _coefficient{};
441 ads111x::Config _ads_cfg{};
449constexpr uint8_t CONVERSION_REG{0x00};
450constexpr uint8_t CONFIG_REG{0x01};
451constexpr uint8_t LOW_THRESHOLD_REG{0x02};
452constexpr uint8_t HIGH_THRESHOLD_REG{0x03};
Base class for ADS111x series.
bool comparatorMode() const
Gets the comparator mode.
Definition unit_ADS111x.hpp:310
bool latchingComparator() const
Gets the Latching comparator.
Definition unit_ADS111x.hpp:328
bool readThreshold(int16_t &high, int16_t &low)
Reads the threshold values.
Definition unit_ADS111x.cpp:227
virtual bool writeComparatorMode(const bool b)=0
Write the comparator mode.
ads111x::ComparatorQueue comparatorQueue() const
Gets the comparator queue.
Definition unit_ADS111x.hpp:334
bool comparatorPolarity() const
Gets the comparator polarity.
Definition unit_ADS111x.hpp:319
bool writeSamplingRate(const ads111x::Sampling rate)
Write the data rate.
Definition unit_ADS111x.cpp:109
virtual bool writeComparatorQueue(const ads111x::ComparatorQueue c)=0
Write the comparator queue.
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_ADS111x.hpp:259
virtual bool writeMultiplexer(const ads111x::Mux mux)=0
Write the input multiplexer.
ads111x::Sampling samplingRate() const
Gets the sampling rate.
Definition unit_ADS111x.hpp:301
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_ADS111x.hpp:281
virtual bool writeComparatorPolarity(const bool b)=0
Write the comparator polarity.
float coefficient() const
Coefficient value.
Definition unit_ADS111x.hpp:238
virtual bool writeLatchingComparator(const bool b)=0
Write the latching comparator.
virtual bool writeGain(const ads111x::Gain gain)=0
Write the programmable gain amplifier.
config_t config()
Gets the configuration.
Definition unit_ADS111x.hpp:221
bool writeThreshold(const int16_t high, const int16_t low)
Write the threshold values.
Definition unit_ADS111x.cpp:238
ads111x::Mux multiplexer() const
Gets the input multiplexer.
Definition unit_ADS111x.hpp:292
void config(const config_t &cfg)
Set the configuration.
Definition unit_ADS111x.hpp:226
int16_t adc() const
Oldest measured ADC.
Definition unit_ADS111x.hpp:247
bool startPeriodicMeasurement(const ads111x::Sampling rate, const ads111x::Mux mux, const ads111x::Gain gain, const ads111x::ComparatorQueue comp_que)
Start periodic measurement.
Definition unit_ADS111x.hpp:271
bool measureSingleshot(ads111x::Data &data, const uint32_t timeoutMillis=1000U)
Measurement single shot.
Definition unit_ADS111x.cpp:152
bool generalReset()
General reset.
Definition unit_ADS111x.cpp:204
ads111x::Gain gain() const
Gets the programmable gain amplifier.
Definition unit_ADS111x.cpp:104
Top level namespace of M5stack.
Settings for begin.
Definition unit_ADS111x.hpp:191
bool start_periodic
Start periodic measurement on begin?
Definition unit_ADS111x.hpp:193
ads111x::Gain gain
Gain if start on begin (Not supported in some classes)
Definition unit_ADS111x.hpp:199
ads111x::Mux mux
Mux if start on begin (Not supported in some classes)
Definition unit_ADS111x.hpp:197
ads111x::ComparatorQueue comp_que
ComparatorQueue if start on begin (Not supported in some classes)
Definition unit_ADS111x.hpp:201
ads111x::Sampling rate
sampling rate if start on begin
Definition unit_ADS111x.hpp:195
Measurement data group.
Definition unit_ADS111x.hpp:168
int16_t adc() const
ADC.
Definition unit_ADS111x.hpp:171
Sampling
Data rate setting (samples per second)
Definition unit_ADS111x.hpp:61
@ Rate128
128 sps as default
Mux
Input multiplexer.
Definition unit_ADS111x.hpp:31
@ GND_2
Positive:AIN2 Negative:GND.
@ AIN_01
Positive:AIN0 Negative:AIN1 as default.
@ AIN_23
Positive:AIN2 Negative:AIN3.
@ AIN_13
Positive:AIN1 Negative:AIN3.
@ GND_1
Positive:AIN1 Negative:GND.
@ GND_0
Positive:AIN0 Negative:GND.
@ AIN_03
Positive:AIN0 Negative:AIN3.
@ GND_3
Positive:AIN3 Negative:GND.
ComparatorQueue
the value determines the number of successive conversions exceeding the upper or lower threshold requ...
Definition unit_ADS111x.hpp:77
@ One
Assert after one conversion.
@ Four
Assert after four conversion.
@ Two
Assert after two conversion.
Gain
Programmable gain amplifier.
Definition unit_ADS111x.hpp:47
@ PGA_2048
+/- 2.048 V as default