ESPHome 2026.2.3
Loading...
Searching...
No Matches
rotary_encoder.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4
6#include "esphome/core/hal.h"
9
10namespace esphome {
11namespace rotary_encoder {
12
18
26
30
31 volatile int32_t counter{0};
33 int32_t min_value{INT32_MIN};
34 int32_t max_value{INT32_MAX};
35 int32_t last_read{0};
36 uint8_t state{0};
37 bool first_read{true};
38
39 std::array<int8_t, 8> rotation_events{};
41
42 static void gpio_intr(RotaryEncoderSensorStore *arg);
43};
44
46 public:
47 void set_pin_a(InternalGPIOPin *pin_a) { pin_a_ = pin_a; }
48 void set_pin_b(InternalGPIOPin *pin_b) { pin_b_ = pin_b; }
49
58
67
69 void set_value(int value) {
70 this->store_.counter = value;
71 this->loop();
72 }
73
74 void set_reset_pin(GPIOPin *pin_i) { this->pin_i_ = pin_i; }
75 void set_min_value(int32_t min_value);
76 void set_max_value(int32_t max_value);
77 void set_publish_initial_value(bool publish_initial_value) { publish_initial_value_ = publish_initial_value; }
78
79 // ========== INTERNAL METHODS ==========
80 // (In most use cases you won't need these)
81 void setup() override;
82 void dump_config() override;
83 void loop() override;
84
85 void add_on_clockwise_callback(std::function<void()> callback) {
86 this->on_clockwise_callback_.add(std::move(callback));
87 }
88
89 void add_on_anticlockwise_callback(std::function<void()> callback) {
90 this->on_anticlockwise_callback_.add(std::move(callback));
91 }
92
93 void register_listener(std::function<void(uint32_t)> listener) { this->listeners_.add(std::move(listener)); }
94
95 protected:
98 GPIOPin *pin_i_{nullptr};
102
104
107 CallbackManager<void(int32_t)> listeners_{};
108};
109
110template<typename... Ts> class RotaryEncoderSetValueAction : public Action<Ts...> {
111 public:
114
115 void play(const Ts &...x) override { this->encoder_->set_value(this->value_.value(x...)); }
116
117 protected:
119};
120
122 public:
124 parent->add_on_clockwise_callback([this]() { this->trigger(); });
125 }
126};
127
129 public:
131 parent->add_on_anticlockwise_callback([this]() { this->trigger(); });
132 }
133};
134
135} // namespace rotary_encoder
136} // namespace esphome
BedjetMode mode
BedJet operating mode.
virtual void play(const Ts &...x)=0
Copy of GPIOPin that is safe to use from ISRs (with no virtual functions)
Definition gpio.h:92
void trigger(const Ts &...x)
Definition automation.h:279
void set_publish_initial_value(bool publish_initial_value)
void set_value(int value)
Manually set the value of the counter.
CallbackManager< void()> on_anticlockwise_callback_
CallbackManager< void(int32_t)> listeners_
void add_on_anticlockwise_callback(std::function< void()> callback)
bool publish_initial_value_
Index pin, if this is not nullptr, the counter will reset to 0 once this pin is HIGH.
void register_listener(std::function< void(uint32_t)> listener)
void set_resolution(RotaryEncoderResolution mode)
Set the resolution of the rotary encoder.
void add_on_clockwise_callback(std::function< void()> callback)
void set_restore_mode(RotaryEncoderRestoreMode restore_mode)
Set the restore mode of the rotary encoder.
RotaryEncoderSetValueAction(RotaryEncoderSensor *encoder)
TEMPLATABLE_VALUE(int, value) void play(const Ts &...x) override
Base-class for all sensors.
Definition sensor.h:43
RotaryEncoderResolution
All possible resolutions for the rotary encoder.
@ ROTARY_ENCODER_2_PULSES_PER_CYCLE
increment counter by 1 with every A-B cycle, slow response but accurate
@ ROTARY_ENCODER_4_PULSES_PER_CYCLE
increment counter by 2 with every A-B cycle
RotaryEncoderRestoreMode
All possible restore modes for the rotary encoder.
@ ROTARY_ENCODER_ALWAYS_ZERO
try to restore counter, otherwise set to zero
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
static void gpio_intr(RotaryEncoderSensorStore *arg)
uint16_t x
Definition tt21100.cpp:5