ESPHome 2026.8.1
Loading...
Searching...
No Matches
mcp4461.h
Go to the documentation of this file.
1#pragma once
2
4#include "esphome/core/log.h"
6
7namespace esphome::mcp4461 {
8
9struct WiperState {
10 bool enabled = true;
11 uint16_t state = 0;
12 optional<float> initial_value;
13 bool terminal_a = true;
14 bool terminal_b = true;
15 bool terminal_w = true;
16 bool terminal_hw = true;
17 bool wiper_lock_active = false;
18 bool update_level = false;
19 bool update_terminal = false;
20 // Nonvolatile persistence (volatile wipers 0-3 only): when enabled, every level change is
21 // mirrored into the chip's NV wiper register after nonvolatile_write_delay of stability, so
22 // the chip restores it on power-on. The delay both debounces bursts (e.g. light transitions
23 // writing dozens of levels per second) and protects the EEPROM's limited endurance —
24 // without it, every intermediate step would cost one of the ~1M erase/write cycles and
25 // stall the bus for up to t_WC (10 ms) each.
26 bool nonvolatile = false;
28 bool nonvolatile_dirty = false;
30};
31
32// default wiper state is 128 / 0x80h
33enum class Mcp4461Commands : uint8_t { WRITE = 0x00, INCREMENT = 0x04, DECREMENT = 0x08, READ = 0x0C };
34
35enum class Mcp4461Addresses : uint8_t {
36 MCP4461_VW0 = 0x00,
37 MCP4461_VW1 = 0x10,
38 MCP4461_VW2 = 0x60,
39 MCP4461_VW3 = 0x70,
40 MCP4461_STATUS = 0x50,
41 MCP4461_TCON0 = 0x40,
42 MCP4461_TCON1 = 0xA0,
43 MCP4461_EEPROM_1 = 0xB0
44};
45
46enum class Mcp4461WiperIdx : uint8_t {
55};
56
57enum class Mcp4461EepromLocation : uint8_t {
63};
64
66
67class Mcp4461Wiper;
68
69// Mcp4461Component
70class Mcp4461Component final : public Component, public i2c::I2CDevice {
71 public:
72 Mcp4461Component(bool disable_wiper_0, bool disable_wiper_1, bool disable_wiper_2, bool disable_wiper_3)
73 : wiper_0_disabled_(disable_wiper_0),
74 wiper_1_disabled_(disable_wiper_1),
75 wiper_2_disabled_(disable_wiper_2),
76 wiper_3_disabled_(disable_wiper_3) {
77 this->reg_[0].enabled = !wiper_0_disabled_;
78 this->reg_[1].enabled = !wiper_1_disabled_;
79 this->reg_[2].enabled = !wiper_2_disabled_;
80 this->reg_[3].enabled = !wiper_3_disabled_;
81 }
82
83 void setup() override;
84 void dump_config() override;
85 float get_setup_priority() const override { return setup_priority::HARDWARE; }
86 void loop() override;
90 uint16_t get_eeprom_value(Mcp4461EepromLocation location);
94 bool set_eeprom_value(Mcp4461EepromLocation location, uint16_t value);
98 void set_initial_value(Mcp4461WiperIdx wiper, float initial_value);
103 void set_nonvolatile(Mcp4461WiperIdx wiper, uint32_t write_delay_ms);
107 void initialize_terminal_disabled(Mcp4461WiperIdx wiper, char terminal);
110
111 protected:
112 friend class Mcp4461Wiper;
113 bool read_16_(uint8_t address, uint16_t *buf);
115 uint8_t get_wiper_address_(uint8_t wiper);
119 uint16_t read_wiper_level_(uint8_t wiper, bool *ok = nullptr);
120 uint8_t get_status_register_();
121 uint16_t get_wiper_level_(Mcp4461WiperIdx wiper);
122 bool set_wiper_level_(Mcp4461WiperIdx wiper, uint16_t value);
124 void enable_wiper_(Mcp4461WiperIdx wiper);
128 void enable_terminal_(Mcp4461WiperIdx wiper, char terminal);
129 void disable_terminal_(Mcp4461WiperIdx, char terminal);
130 bool is_writing_();
136 bool is_eeprom_ready_for_writing_(bool wait_if_not_ready);
137 void write_wiper_level_(uint8_t wiper, uint16_t value);
138 bool mcp4461_write_(uint8_t addr, uint16_t data, bool nonvolatile = false);
139 uint8_t calc_terminal_connector_byte_(Mcp4461TerminalIdx terminal_connector);
140 void update_terminal_register_(Mcp4461TerminalIdx terminal_connector);
141 uint8_t get_terminal_register_(Mcp4461TerminalIdx terminal_connector);
142 bool set_terminal_register_(Mcp4461TerminalIdx terminal_connector, uint8_t data);
143
144 // Converts a status to a human readable string
145 static const LogString *get_message_string(int status) {
146 switch (status) {
148 return LOG_STR("I2C error - communication with MCP4461 failed!");
150 return LOG_STR("Status register could not be read");
152 return LOG_STR("Invalid status register value - bits 1,7 or 8 are 0");
154 return LOG_STR("Invalid value for wiper given");
156 return LOG_STR("MCP4461 is write protected. Setting nonvolatile wipers/eeprom values is prohibited.");
158 return LOG_STR("MCP4461 Wiper is already enabled, ignoring cmd to enable.");
160 return LOG_STR("MCP4461 Wiper is disabled. All actions on this wiper are prohibited.");
162 return LOG_STR("MCP4461 Wiper is locked using WiperLock-technology. All actions on this wiper are prohibited.");
164 return LOG_STR("Status OK");
166 return LOG_STR(
167 "Increment/decrement, store, and terminal control are prohibited on the nonvolatile wipers (E-H).");
168 default:
169 return LOG_STR("Unknown");
170 }
171 }
172
174 MCP4461_STATUS_OK = 0, // CMD completed successfully
175 MCP4461_FAILED, // component failed
176 MCP4461_STATUS_I2C_ERROR, // Unable to communicate with device
177 MCP4461_STATUS_REGISTER_INVALID, // Status register value was invalid
178 MCP4461_STATUS_REGISTER_ERROR, // Error fetching status register
180 MCP4461_VALUE_INVALID, // Invalid value given for wiper / eeprom
181 MCP4461_WRITE_PROTECTED, // The value was read, but the CRC over the payload (valid and data) does not match
182 MCP4461_WIPER_ENABLED, // The wiper is enabled, discard additional enabling actions
183 MCP4461_WIPER_DISABLED, // The wiper is disabled - all actions for this wiper will be aborted/discarded
184 MCP4461_WIPER_LOCKED, // The wiper is locked using WiperLock-technology - all actions for this wiper will be
185 // aborted/discarded
186 } error_code_{MCP4461_STATUS_OK};
187
190 bool write_protected_{false};
191 bool wiper_0_disabled_{false};
192 bool wiper_1_disabled_{false};
193 bool wiper_2_disabled_{false};
194 bool wiper_3_disabled_{false};
195};
196} // namespace esphome::mcp4461
uint8_t address
Definition bl0906.h:4
uint8_t status
Definition bl0942.h:8
This Class provides the methods to read/write bytes from/to an i2c device.
Definition i2c.h:132
void set_initial_value(Mcp4461WiperIdx wiper, float initial_value)
public function used to set initial value
Definition mcp4461.cpp:67
bool increase_wiper_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:428
uint8_t calc_terminal_connector_byte_(Mcp4461TerminalIdx terminal_connector)
Definition mcp4461.cpp:510
uint8_t get_terminal_register_(Mcp4461TerminalIdx terminal_connector)
Definition mcp4461.cpp:527
void update_terminal_register_(Mcp4461TerminalIdx terminal_connector)
Definition mcp4461.cpp:546
uint16_t get_eeprom_value(Mcp4461EepromLocation location)
get eeprom value from location
Definition mcp4461.cpp:659
void process_nonvolatile_dirty_()
Deferred NV mirroring driven from loop() — see WiperState::nonvolatile.
Definition mcp4461.cpp:151
bool set_eeprom_value(Mcp4461EepromLocation location, uint16_t value)
set eeprom value at specified location
Definition mcp4461.cpp:680
void disable_wiper_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:406
void initialize_terminal_disabled(Mcp4461WiperIdx wiper, char terminal)
public function used to set disable terminal config
Definition mcp4461.cpp:72
void enable_wiper_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:384
bool mcp4461_write_(uint8_t addr, uint16_t data, bool nonvolatile=false)
Definition mcp4461.cpp:750
bool read_16_(uint8_t address, uint16_t *buf)
Definition mcp4461.cpp:245
enum esphome::mcp4461::Mcp4461Component::ErrorCode MCP4461_STATUS_OK
void enable_terminal_(Mcp4461WiperIdx wiper, char terminal)
Definition mcp4461.cpp:595
bool is_eeprom_ready_for_writing_(bool wait_if_not_ready)
Definition mcp4461.cpp:715
float get_setup_priority() const override
Definition mcp4461.h:85
uint16_t read_wiper_level_(uint8_t wiper, bool *ok=nullptr)
Read a wiper register.
Definition mcp4461.cpp:307
uint16_t get_wiper_level_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:290
Mcp4461Component(bool disable_wiper_0, bool disable_wiper_1, bool disable_wiper_2, bool disable_wiper_3)
Definition mcp4461.h:72
static const LogString * get_message_string(int status)
Definition mcp4461.h:145
bool update_wiper_level_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:331
uint8_t get_wiper_address_(uint8_t wiper)
Definition mcp4461.cpp:260
void disable_terminal_(Mcp4461WiperIdx, char terminal)
Definition mcp4461.cpp:628
bool store_level_nonvolatile_(Mcp4461WiperIdx wiper)
Copy the current volatile level of wiper 0-3 into its NV register (immediate, blocking only for a pen...
Definition mcp4461.cpp:179
void write_wiper_level_(uint8_t wiper, uint16_t value)
Definition mcp4461.cpp:375
bool decrease_wiper_(Mcp4461WiperIdx wiper)
Definition mcp4461.cpp:469
bool set_terminal_register_(Mcp4461TerminalIdx terminal_connector, uint8_t data)
Definition mcp4461.cpp:573
bool set_wiper_level_(Mcp4461WiperIdx wiper, uint16_t value)
Definition mcp4461.cpp:347
void read_status_register_to_log()
read status register to log
Definition mcp4461.cpp:237
void set_nonvolatile(Mcp4461WiperIdx wiper, uint32_t write_delay_ms)
enable nonvolatile persistence for a volatile wiper (0-3): every level change is mirrored to the corr...
Definition mcp4461.cpp:58
constexpr float HARDWARE
For components that deal with hardware and are very important like GPIO switch.
Definition component.h:43
static void uint32_t
optional< float > initial_value
Definition mcp4461.h:12
uint32_t nonvolatile_write_delay_ms
Definition mcp4461.h:27