Integriamo in Home Assistant il modulo PN532 con il firmware ESPHome per il controllo NFC e RFID
Il modulo NFC Module V3 con PN532 è uno dei componenti più utilizzati nel mondo maker per realizzare sistemi NFC e RFID avanzati, grazie alla sua versatilità, affidabilità e semplicità di integrazione. In ambito domotico, il PN532 permette di creare sistemi di autenticazione tramite badge, tessere o smartphone NFC, rendendo possibile il controllo di porte, cancelli, allarmi e automazioni direttamente da Home Assistant tramite ESPHome. In questo articolo vedremo come funziona il PN532, quali sono le sue caratteristiche tecniche principali e come collegarlo correttamente a un ESP32 per sfruttarlo al meglio in un progetto reale.
Acquista il modulo RFID PN532:
- Amazon: https://amzn.to/4bKlWL1
- Aliexpress: https://s.click.aliexpress.com/e/_c4MgVADv
Specifiche tecniche
Il PN532 è un controller NFC prodotto da NXP Semiconductors, progettato per gestire comunicazioni a 13,56 MHz secondo gli standard ISO/IEC 14443 A/B, ISO/IEC 15693 e FeliCa. Questo lo rende compatibile con la maggior parte dei tag e delle card presenti sul mercato, come MIFARE Classic, MIFARE Ultralight, NTAG, DESFire e molti altri. Il cuore del dispositivo è un front‑end RF integrato che gestisce sia la generazione del campo elettromagnetico sia la modulazione e demodulazione dei segnali, permettendo la comunicazione bidirezionale con i transponder RFID/NFC.

Il modulo può operare in diverse modalità: lettore/scrittore, emulazione di card e peer‑to‑peer. In modalità lettore, il PN532 genera il campo RF e interroga il tag, leggendo l’UID e i dati memorizzati nella memoria interna del chip. In modalità emulazione, invece, il dispositivo si comporta come una vera e propria card NFC, consentendo di simulare un badge virtuale. Questa flessibilità è particolarmente utile per applicazioni avanzate di sicurezza e autenticazione.

Dal punto di vista delle interfacce di comunicazione, il PN532 supporta SPI, I²C e UART. Questo permette di adattarlo facilmente a qualsiasi microcontrollore, dagli Arduino agli ESP32. In ESPHome l’interfaccia più utilizzata è I²C, perché è semplice, stabile e permette di collegare più dispositivi sullo stesso bus. SPI è preferibile quando si richiedono velocità di trasferimento più elevate, mentre UART viene spesso usata in applicazioni standalone o embedded. Il modulo dispone di uno switch a jumper che consente di selezionare fisicamente l’interfaccia desiderata, rendendo il dispositivo estremamente versatile.
L’alimentazione del PN532 avviene generalmente a 3,3 V, valore perfettamente compatibile con l’ESP32. Alcuni moduli includono un regolatore di tensione che permette anche l’alimentazione a 5 V, ma è sempre consigliato verificare il datasheet del proprio modulo per evitare danni. Il consumo tipico è contenuto, nell’ordine di poche decine di milliampere, e aumenta durante la fase di lettura quando il campo RF è attivo.

Il pinout varia leggermente in base al produttore del modulo, ma in genere comprende i pin VCC e GND per l’alimentazione, SDA e SCL per I²C, MOSI, MISO, SCK e SS per SPI, TX e RX per UART, oltre al pin RST per il reset hardware e al pin IRQ per la gestione degli interrupt. Questa ricchezza di segnali consente un controllo completo del dispositivo e l’integrazione in sistemi complessi, mantenendo comunque una configurazione semplice per i progetti base.

Collegamenti
Per collegare il PN532 a un ESP32 utilizzando l’interfaccia I²C, è sufficiente alimentare il modulo a 3,3 V, collegare il GND in comune e connettere SDA e SCL rispettivamente ai pin GPIO21 e GPIO22 dell’ESP32, che sono quelli più comunemente usati per il bus I²C. È importante impostare correttamente lo switch del modulo in modalità I²C, altrimenti il dispositivo non verrà rilevato dal microcontrollore. Una volta effettuati i collegamenti, ESPHome potrà comunicare con il PN532 e leggere automaticamente i tag NFC, rendendoli disponibili in Home Assistant per creare automazioni, come l’armamento e il disarmo di un sistema di allarme tramite badge.

Codice
Andiamo a creare un nuovo device su ESPHome e chiamiamolo PN532. 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 affinché legga gli NFC tramite modulo PN532 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 (“pn532”) che quello più leggibile per Home Assistant (“PN532”).
esphome:
name: pn532
friendly_name: PN532
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: "IDbVOziTGFFrzuLGBOL2EE38QRvf2CIoMtWdWW2FJsc="
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: "cdb75a18e409658b09de164ede237690"
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 (“Pn532Fallback 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: "Pn532 Fallback Hotspot"
password: "9g90t6HcymP7"
captive_portal:
Trattandosi di un dispositivo che lavora su interfaccia I2C, questa sezione configura la comunicazione I2C tra l’ESP32 ed il modulo, impostando il pin GPIO21 dell’ESP32 come linea SDA ed il pin GPIO22 come linea SCL. La funziona scan abilita la scansione automatica dei dispositivi connessi al bus I2C, verificando quali dispositivi I2C sono collegati e il loro indirizzo. Andiamo anche a indicare la velocità di comunicazione del bus I²C a 400 kHz.
i2c:
sda: GPIO21
scl: GPIO22
scan: true
frequency: 400kHz
Configuriamo il modulo RFID per la comunicazione in I2C, assegniamo un id interno al dispositivo, che permette di richiamarlo in altre parti del codice, indicando che bisogna aggiornare il dispositivo ogni secondo.
pn532_i2c:
id: nfc_module
update_interval: 1s
Ogni volta che il modulo rileva un NFC, viene letto il suo UID e reso disponibile a Home Assistant tramite stringa, per poi scrivere un messaggio nei log.
on_tag:
then:
- lambda: |-
id(nfc_uid_string).publish_state(x);
- logger.log:
format: "Tag NFC rilevato: %s"
args: ["x.c_str()"]
Quando il modulo, invece, non rileva nessun NFC, stamperà sulla stringa che non è presente nessun NFC.
on_tag_removed:
then:
- lambda: |-
id(nfc_uid_string).publish_state("Nessun NFC");
- logger.log:
format: "Nessun NFC presente"
Tale stringa, che venga letto o meno l’NFC, è gestita dal sensore di testo, che stamperà su Home Assistant l’UID dell’NFC.
text_sensor:
- platform: template
name: "NFC UID String"
id: nfc_uid_string
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 PN532 da integrare.

Autorizziamo la configurazione e avvicinando un NFC, verrà stampato il suo UID, mentre se non presente verremo avvisati che non è stato rilevato alcun NFC.

Abbiamo creato anche un’automazione [LINK] che accende e spegne una luce, quando l’NFC letto ha un UID specifico. Tale automazione renderà possibile non solo commutare lo stato di un interruttore, ma amplia le possibilità anche alle applicazioni di sicurezza, come l’attivazione/disattivazione dell’allarme.
alias: NFC spegne luce studio
description: ""
triggers:
- entity_id:
- sensor.pn532_nfc_uid_string
trigger: state
conditions:
- condition: template
value_template: "{{ trigger.to_state.state == 'DD-B1-6A-06' }}"
actions:
- action: light.toggle
target:
entity_id:
- light.luce_studio_2
data: {}
mode: single




