Programmiamo un Encoder Rotativo con ESPHome, integrandolo in Home Assistant per creare progetti e automazioni
L’encoder rotativo è uno dei dispositivi di input più versatili e affidabili nel mondo dell’elettronica embedded. In ambito domotico e IoT, permette di realizzare interfacce fisiche intuitive per il controllo di luci, volume audio, menu su display, termostati e scene personalizzate. Utilizzando ESPHome, il firmware open‑source che semplifica enormemente lo sviluppo su microcontrollori ESP32, l’integrazione di un encoder rotativo diventa rapida, robusta e completamente gestibile da Home Assistant. In questo articolo vedremo come sfruttare un encoder rotativo con ESP32 per creare un controller fisico professionale, affidabile e perfettamente integrato nel tuo sistema domotico.
- Acquistalo su Amazon: https://amzn.to/4pLXwEn
- Acquistalo su Aliexpress: https://s.click.aliexpress.com/e/_c3bWYkh1
Specifiche tecniche
Utilizziamo un encoder rotativo meccanico comune, come quelli inclusi nei classici kit (ad esempio KY‑040), facilmente reperibili e ideali per applicazioni domotiche e di controllo. Questo tipo di encoder è composto da due contatti digitali sfasati di 90° (canali A e B) che permettono al microcontrollore di determinare sia il numero di scatti sia il verso di rotazione. Non fornisce un valore assoluto, ma genera una sequenza di impulsi che devono essere interpretati via software: ogni “click” meccanico produce una serie di transizioni sui canali A e B che, opportunamente decodificate, diventano un incremento o decremento logico.

Dal punto di vista elettrico, questi encoder funzionano correttamente sia a 3,3 V sia a 5 V. Con ESP32 è consigliabile alimentarli a 3,3 V per mantenere la piena compatibilità con i livelli logici dei GPIO ed evitare l’uso di adattatori di livello. Alimentarli a 5 V non è necessario e non porta vantaggi funzionali, perché i contatti dell’encoder sono semplici interruttori che chiudono verso massa: ciò che conta è il livello di pull‑up impostato sul microcontrollore. ESPHome consente di abilitare le resistenze di pull‑up interne, garantendo segnali stabili e immuni ai disturbi senza componenti esterni.

ESPHome gestisce nativamente la decodifica tramite il componente rotary_encoder che interpreta le transizioni dei canali A e B, filtra i rimbalzi meccanici (debounce) e restituisce un valore numerico coerente e stabile. Grazie agli interrupt hardware e alla velocità dei GPIO dell’ESP32, la lettura rimane precisa anche con rotazioni rapide. La risoluzione configurabile permette di adattare il firmware alle caratteristiche dell’encoder (tipicamente 4 impulsi per click nei modelli KY), assicurando che ogni scatto fisico corrisponda a un singolo incremento o decremento logico. L’integrazione con ESPHome rende inoltre immediata l’associazione con automazioni, script e servizi di Home Assistant, trasformando l’encoder in un controller fisico multifunzione professionale.

Collegamenti
Per il collegamento utilizzeremo un ESP32 e un encoder rotativo classico a tre uscite principali più pulsante integrato. Il pin CLK (o A) dell’encoder va collegato al GPIO32 dell’ESP32, il pin DT (o B) al GPIO33, mentre il pulsante integrato SW può essere collegato al GPIO25, configurato con resistenza di pull‑up interna. Il pin VCC dell’encoder va alimentato a 3.3 V dall’ESP32, mentre il GND va collegato alla massa comune. Questa configurazione garantisce compatibilità elettrica, stabilità del segnale e sicurezza per il microcontrollore.

Codice
Andiamo a creare un nuovo device su ESPHome e chiamiamolo ENCODER. Saltiamo per il momento la connessione e selezioniamo la scheda che dobbiamo programmare (ESP32).

Una volta creato, clicchiamo su EDIT per modificare il codice.

Questo è il codice per configurare una ESP32 per leggere i dati dall’ENCODER e inviarli a Home Assistant tramite ESPHome. Il dispositivo sarà accessibile in rete tramite Wi-Fi e potrà essere aggiornato via OTA (Over-The-Air) senza bisogno di connessione fisica. Potete scaricarlo a questo LINK.
All’inizio, il codice definisce il nome del dispositivo, sia quello tecnico (“encoder”) che quello più leggibile per Home Assistant (“ENCODER”).
esphome:
name: encoder
friendly_name: ENCODER
Poi si specifica che il microcontrollore utilizzato è un ESP32 e che il firmware verrà compilato usando il framework Arduino, che è più semplice e supportato rispetto ad altre alternative come ESP-IDF.
esp32:
board: esp32dev
framework:
type: arduino
Il codice attiva il logger, che serve a registrare gli eventi e inviare messaggi di debug. Inoltre, viene attivata l’API di ESPHome, che permette a Home Assistant di comunicare con il dispositivo in modo sicuro grazie a una chiave di crittografia.
logger:
api:
encryption:
key: "7MghfBS/Gj3nKORGIh2wzDaBuYr1TCludHejlAyNBMI="
Per evitare di dover collegare il dispositivo fisicamente ogni volta che si vuole aggiornare il firmware, viene attivata la modalità OTA (Over-The-Air), con una password di sicurezza.
ota:
- platform: esphome
password: "8882f57f471d2f100e26f9c47fee2576"
Per collegarsi alla rete, il codice usa le credenziali Wi-Fi salvate nei secrets di ESPHome (file separato non visibile nel codice). Se la connessione fallisce, il dispositivo crea un hotspot Wi-Fi di emergenza (“Encoder Fallback Hotspot”) con una password predefinita, in modo che sia possibile riconfigurarlo. Inoltre, è presente la funzione captive portal, che permette di riconfigurare il Wi-Fi direttamente da un browser in caso di problemi di connessione.
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Encoder Fallback Hotspot"
password: "ojrmeBRvkWHV"
captive_portal:
Dichiariamo il sensore digitale logico ed attiviamo il driver nativo in ESPHome rotary_encoder che si occuperà di leggere i canali A e B, decodificare il senso di rotazione, contare gli impulsi e filtrare i rimbalzi. Forniamo un nome che poi apparirà su Home Assistant, indicando i pin a cui è connesso il canale A e B. Sarà importantissimo impostare la risoluzione a 4, in quanto indica quanti impulsi elettrici servono per 1 “scatto” reale dell’encoder di tipo meccanico come il nostro. Settiamo anche un valore minimo e massimo, così da poter visualizzare sul logger i valori dell’Encoder rotativo, ricordandoci di impostare tale valore su numeri interi.
sensor:
- platform: rotary_encoder
name: "Encoder Rotativo"
id: encoder_rotativo
pin_a: 32
pin_b: 33
resolution: 4
min_value: 0
max_value: 100
on_value:
then:
- logger.log:
format: "Valore encoder: %.0f"
args: [ 'x' ]
Avendo anche un pulsante integrato, dichiariamo un sensore binario, collegato al pin 25, attivando la resistenza interna di PULLUP. Attiviamo la funzione on_press, cosicché quando premuto, il valore dell’Encoder torni a 0.
binary_sensor:
- platform: gpio
pin:
number: 25
mode: INPUT_PULLUP
inverted: true
name: "Pulsante Encoder"
on_press:
then:
- sensor.rotary_encoder.set_value:
id: encoder_rotativo
value: 0
Salvate e verificate con Validate se il codice è stato scritto correttamente.

Collegate la ESP32 al computer tramite cavo USB, e cliccate su Install.

Conclusa l’installazione, integriamo il device su Home Assistant. Dovrebbe essere arrivata una notifica sulla plancia. In ogni caso, per integrarlo andate su Impostazioni -> Dispositivi e servizi e apparirà il dispositivo ENCODER da integrare.

Autorizziamo la configurazione e potremo così adoperare il nostro encoder rotativo meccanico su Home Assistant, generando automazioni o adoperandoli in progetti DIY.
