ESPHome 2026.6.0-dev
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
11
17
25
29
30 volatile int32_t counter{0};
32 int32_t min_value{INT32_MIN};
33 int32_t max_value{INT32_MAX};
34 int32_t last_read{0};
35 uint8_t state{0};
36 bool first_read{true};
37
38 std::array<int8_t, 8> rotation_events{};
40
41 static void gpio_intr(RotaryEncoderSensorStore *arg);
42};
43
45 public:
46 void set_pin_a(InternalGPIOPin *pin_a) { pin_a_ = pin_a; }
47 void set_pin_b(InternalGPIOPin *pin_b) { pin_b_ = pin_b; }
48
57
66
68 void set_value(int value) {
69 this->store_.counter = value;
70 this->loop();
71 }
72
73 void set_reset_pin(GPIOPin *pin_i) { this->pin_i_ = pin_i; }
74 void set_min_value(int32_t min_value);
75 void set_max_value(int32_t max_value);
76 void set_publish_initial_value(bool publish_initial_value) { publish_initial_value_ = publish_initial_value; }
77
78 // ========== INTERNAL METHODS ==========
79 // (In most use cases you won't need these)
80 void setup() override;
81 void dump_config() override;
82 void loop() override;
83
84 template<typename F> void add_on_clockwise_callback(F &&callback) {
85 this->on_clockwise_callback_.add(std::forward<F>(callback));
86 }
87
88 template<typename F> void add_on_anticlockwise_callback(F &&callback) {
89 this->on_anticlockwise_callback_.add(std::forward<F>(callback));
90 }
91
92 template<typename F> void register_listener(F &&listener) { this->listeners_.add(std::forward<F>(listener)); }
93
94 protected:
97 GPIOPin *pin_i_{nullptr};
101
103
106 CallbackManager<void(int32_t)> listeners_{};
107};
108
109template<typename... Ts> class RotaryEncoderSetValueAction : public Action<Ts...> {
110 public:
113
114 void play(const Ts &...x) override { this->encoder_->set_value(this->value_.value(x...)); }
115
116 protected:
118};
119
120} // namespace esphome::rotary_encoder
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 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_
bool publish_initial_value_
Index pin, if this is not nullptr, the counter will reset to 0 once this pin is HIGH.
void set_resolution(RotaryEncoderResolution mode)
Set the resolution of the rotary encoder.
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:47
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
static void gpio_intr(RotaryEncoderSensorStore *arg)
uint16_t x
Definition tt21100.cpp:5