I MODULI AXIOMETA AX22

Fino a questo punto del corso abbiamo collegato i componenti su breadboard, con i cavetti Dupont. È il modo giusto per imparare, perché ti costringe a capire dove va l’alimentazione, dove va la massa e cosa fa ogni piedino. È anche il modo più fragile: un cavetto che si sfila a metà registrazione o un contatto ossidato producono un guasto che sembra software ma è meccanico.

I moduli Axiometa AX22 risolvono il problema meccanico senza toglierti il controllo: sono schedine quadrate da 22 × 22 mm che si innestano direttamente in una porta della board, senza saldature e senza cavi. Il resto (il microcontrollore, le librerie, il codice) resta identico a quello che hai imparato finora.

PERCHÉ NON SEI VINCOLATO

Il Genesis Mini è una normale dev board ESP32-S3, e i moduli AX22 si possono infilare anche in una breadboard. In questo corso la programmiamo con ESPHome, perché l’obiettivo è portare i dati in Home Assistant, ma la board accetta anche Arduino o MicroPython. Se domani vuoi passare a un’altra scheda, i moduli restano utilizzabili: non è un ecosistema chiuso, è un connettore standardizzato sopra hardware ordinario.


COSA C’È NEI DUE KIT

Genesis Mini Starter Kit

ModuloCosa faInterfaccia
Genesis MiniBoard ESP32-S3 con porte AX22-
DHT11Temperatura e umiditàDigitale, bus a singolo filo
IPS LCD 0.96”Display a colori per valori e graficiSPI
Tactile LED ButtonPulsante con LED integratoDigitale
Rotary EncoderManopola rotativa con conteggio incrementaleDigitale
Matrice NeoPixel 5×525 LED RGB indirizzabiliDigitale, 1 filo dati
Buzzer passivoEmissione di toni via PWMPWM
Light Sensor (LDR)Luminosità ambientale relativaAnalogico (ADC)
IR TransceiverRicezione e trasmissione infrarossiDigitale

Sense Module Kit

ModuloSiglaCosa faInterfaccia
BME280AX22-0026Temperatura, umidità, pressione barometricaI²C (0x76 / 0x77) o SPI
Distance SensorAX22-0015Distanza a tempo di volo (Time-of-Flight) con laser VL53L0CXI²C
Analog MicrophoneAX22-0009Livello sonoro, guadagno regolabileAnalogico (ADC)
AccelerometerAX22-0054IMU a 6 assi: accelerometro e giroscopio LSM6DS3TRI²C

A COSA SERVONO, IN PRATICA

Elencare le specifiche serve a poco se non sai quando usare cosa. Ecco la lettura in chiave domotica, che è il taglio di questo corso.

BME280. È il sensore ambientale serio. Umidità dichiarata a ±3 % RH, temperatura da −40 a +85 °C con ±0,5 °C, pressione a ±1 hPa. La scheda ha una fresatura attorno al sensore per far circolare l’aria e ridurre l’autoriscaldamento, che è il difetto tipico di questi moduli quando il chip sta appiccicato al rame. Usalo per ogni automazione che dipende da temperatura o umidità reali: ventilazione del bagno, deumidificatore, riscaldamento.

DHT11. È il sensore didattico. Umidità a ±5 % RH, temperatura a ±2 °C, range 0-50 °C, aggiornamento una volta al secondo. Serve benissimo per imparare la lettura di un bus digitale, ma sotto zero non misura e ±5 % di umidità è troppo per far scattare un’automazione affidabile. Avere entrambi nello stesso kit è l’occasione per mostrare, dati alla mano, cosa significa “accuratezza” su un grafico.

Light Sensor (LDR). Questo è il punto dove quasi tutte le guide online sbagliano.

UNA FOTORESISTENZA NON MISURA I LUX

Una LDR è una resistenza che varia con la luce. L’ADC ti restituisce un numero relativo, non una grandezza calibrata: la risposta spettrale non corrisponde a quella dell’occhio umano, la curva non è lineare e il valore deriva con la temperatura. Puoi usarla benissimo per dire “è buio” o “c’è sole”, non per dire “ci sono 340 lux”. Se ti serve un dato in lux, ti serve un sensore calibrato (VEML7700, BH1750).

Microfono analogico. Livello sonoro, non riconoscimento vocale. In domotica va usato con prudenza: registrare l’ambiente solleva questioni di privacy, mentre rilevare una soglia di rumore (allarme che suona, lavatrice in funzione) è legittimo e utile.

Sensore di distanza ToF. Misura il tempo di volo di un impulso laser. È molto più preciso di un sensore a ultrasuoni e non risente dell’eco, ma ha un cono di lettura stretto e le superfici nere o riflettenti lo confondono. Ottimo per il livello di un serbatoio o per rilevare un’auto in garage, inadatto come sensore di presenza in una stanza.

Accelerometro 6 assi. Accelerometro più giroscopio. In casa il caso d’uso migliore è la rilevazione di vibrazione: sapere quando la lavatrice ha finito il ciclo, o se una porta è stata urtata.

IR Transceiver. Il ricevitore lavora sui 38 kHz con uscita già demodulata, il LED trasmette a 940 nm, portata dichiarata fino a 30 m. Ti permette di imparare i codici di un telecomando e riemetterli.

PRIMA DI IMPEGNARTI SUL CONDIZIONATORE

I telecomandi di TV e decoder usano quasi tutti i 38 kHz e si catturano al primo tentativo. I climatizzatori no: usano protocolli proprietari con payload lunghi che trasmettono l’intero stato del dispositivo a ogni pressione, e non sempre vengono decodificati. Prova sul tuo apparecchio prima di costruirci sopra un’automazione.


ESEMPIO PRATICO: IL BME280 IN TRE PASSI

Prendiamo il modulo che userai più spesso e vediamo il ciclo completo, dall’innesto fino all’entità in Home Assistant.

1. Innesto

Il BME280 parla I²C. Infilalo in una porta AX22 che esponga il bus I²C: sul Genesis Mini l’I²C è su GPIO47 (SDA) e GPIO48 (SCL). Il modulo integra un LDO a 3 V e i traslatori di livello bidirezionali, quindi non devi preoccuparti della tensione logica.

LA MAPPA DELLE PORTE

Non tutte le porte AX22 espongono le stesse funzioni: alcune portano l’I²C, altre pin analogici o digitali generici. Prima di dare per scontato che un modulo funzioni in una porta qualsiasi, controlla lo schema elettrico ufficiale della board.

2. Dal modulo all’entità di Home Assistant

Il modulo diventa tre entità senza scrivere una riga di C++:

esphome:
  name: sensore-ambientale
 
esp32:
  board: esp32-s3-devkitc-1
 
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
 
api:
  encryption:
    key: !secret api_key
 
ota:
  - platform: esphome
 
i2c:
  sda: GPIO47
  scl: GPIO48
 
sensor:
  - platform: bme280_i2c
    address: 0x76
    update_interval: 60s
    temperature:
      name: "Temperatura soggiorno"
    humidity:
      name: "Umidità soggiorno"
    pressure:
      name: "Pressione soggiorno"

Tre dettagli meritano attenzione. L’indirizzo I²C può essere 0x76 oppure 0x77: se il sensore non viene trovato, prima di sospettare un guasto prova l’altro valore. Il blocco ota non è opzionale in pratica, perché è quello che ti permette di ricompilare e aggiornare la scheda via rete invece di scollegarla ogni volta dal muro. L’update_interval di 60 secondi è adeguato a temperatura e umidità ambientali, che cambiano lentamente: leggere ogni secondo non ti darebbe più informazione, ti darebbe solo più traffico e più rumore nel database di Home Assistant.

3. Verifica

Dopo il flash, il sensore compare automaticamente in Home Assistant tramite l’integrazione ESPHome, che rileva il dispositivo sulla rete. Se non appare, i log seriali della prima connessione sono il posto dove guardare: un errore di indirizzo I²C o una porta AX22 sbagliata si manifestano lì come “component not found”, non come assenza di entità.


UN ERRORE CHE FANNO TUTTI: LA SOGLIA SENZA ISTERESI

Vale per il sensore di luce, ma anche per temperatura, umidità e rumore.

Se scrivi “accendi la luce quando la luminosità scende sotto 300”, al crepuscolo il valore oscilla intorno a quella soglia e l’automazione si accende e spegne decine di volte. La soluzione è usare due soglie diverse per l’accensione e per lo spegnimento (isteresi), oppure imporre una durata minima alla condizione:

binary_sensor:
  - platform: template
    name: "È buio"
    lambda: |-
      if (id(luminosita).state < 300) return true;
      if (id(luminosita).state > 400) return false;
      return {};          // zona morta: mantiene lo stato precedente
    filters:
      - delayed_on: 30s
      - delayed_off: 30s

Il return {} restituisce uno stato indefinito, che in ESPHome significa “lascia le cose come stanno”. È quella riga a creare la zona morta fra 300 e 400 dove nulla cambia.


PROGETTO COMPOSITO: SENSORE DI PRESENZA AMBIENTALE

Finora abbiamo usato un modulo alla volta. Adesso ne combiniamo quattro: un radar mmWave per la presenza, il microfono per l’attività sonora, il display per mostrare cosa sta succedendo e un LED come indicatore immediato.

Il ragionamento prima del codice

La tentazione è scrivere “c’è presenza se il radar rileva movimento oppure il microfono sente un rumore”. È sbagliato, ed è utile capire perché.

IL MICROFONO NON RILEVA LE PERSONE

Un microfono rileva pressione sonora, non esseri umani. La televisione accesa, il frigorifero che parte, la lavatrice e il traffico dalla finestra producono rumore in una stanza vuota. Se metti il microfono in OR con il radar, riempi Home Assistant di falsi positivi. Se lo metti in AND, una persona seduta ferma e in silenzio sparisce, e butti via proprio il vantaggio che il radar ha sul PIR.

La scelta corretta è tenerli separati:

  • il radar risponde alla domanda “c’è qualcuno”;
  • il microfono risponde alla domanda “sta succedendo qualcosa”;
  • l’automazione le combina, se serve, ed è una decisione tua e non del firmware.

In Home Assistant ottieni due entità invece di una, e sul display mostri entrambe. È una riga di codice in più e un’informazione in più.

Moduli impiegati

RuoloModuloInterfaccia
PresenzaRadar mmWave Seeed via AX22 to Grove AdapterUART
Attività sonoraAnalog Microphone AX22-0009Analogico (ADC)
InterfacciaIPS LCD 0.96”SPI
IndicatoreLED su modulo prototipoDigitale

IL LED SUL MODULO PROTOTIPO

Il modulo vuoto è l’unico pezzo del progetto che richiede il saldatore, e questo va detto invece che aggirato. Servono anche due informazioni: se il LED fornito è un WS2812 indirizzabile ti serve il modulo adattatore dedicato e non una resistenza, mentre se è un LED tradizionale devi calcolare la resistenza di limitazione. Con alimentazione a 3,3 V, caduta diretta di circa 2 V e corrente di 5 mA, il valore è (3,3 − 2) / 0,005, cioè 260 Ω: si usa il valore commerciale immediatamente superiore, 270 Ω.

Configurazione

esphome:
  name: presenza-soggiorno
 
esp32:
  board: esp32-s3-devkitc-1
 
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
 
api:
  encryption:
    key: !secret api_key
 
# --- Canale 1: presenza (radar) ---------------------------------
uart:
  id: uart_radar
  tx_pin: GPIO_TX      # dipende dalla porta AX22 usata
  rx_pin: GPIO_RX
  baud_rate: 115200
 
# La piattaforma esatta dipende dal modello di radar.
# ESPHome include componenti dedicati per la serie Seeed MR:
# verifica il nome corretto per il tuo modulo prima di compilare.
binary_sensor:
  - platform: seeed_mr24hpc1
    has_target:
      name: "Presenza soggiorno"
      id: presenza_radar
 
# --- Canale 2: attività sonora (microfono) ----------------------
sensor:
  - platform: adc
    pin: GPIO_MIC
    name: "Livello sonoro"
    id: livello_sonoro
    update_interval: 20ms
    attenuation: 12db
    filters:
      - max:
          window_size: 50      # 50 campioni x 20 ms = finestra di 1 s
          send_every: 50
          send_first_at: 50

Il blocco del microfono è il punto in cui quasi tutti sbagliano. Un update_interval di un secondo non ti darebbe il livello sonoro: ti darebbe un singolo campione della forma d’onda, preso in un istante casuale, che può cadere sullo zero anche durante un rumore fortissimo. Campionando ogni 20 ms e prendendo il massimo su cinquanta campioni ottieni invece il picco reale del secondo appena trascorso.

La logica di stato

binary_sensor:
  - platform: template
    name: "Attività sonora"
    id: attivita_sonora
    lambda: |-
      if (id(livello_sonoro).state > 0.6) return true;
      if (id(livello_sonoro).state < 0.4) return false;
      return {};                 // zona morta: mantiene lo stato
    filters:
      - delayed_off: 5s          # valore da demo, vedi nota
 
  - platform: template
    name: "Stanza occupata"
    id: stanza_occupata
    lambda: |-
      return id(presenza_radar).state || id(attivita_sonora).state;

Ritroviamo l’isteresi vista prima: due soglie diverse per accendere e spegnere, con una zona morta in mezzo dove lo stato non cambia. Senza di essa il livello sonoro oscillante attorno al valore critico farebbe lampeggiare l’entità decine di volte al minuto.

CINQUE SECONDI SONO UN VALORE DA DIMOSTRAZIONE

Cinque secondi servono a farti vedere il timer scadere durante la registrazione. In un impianto vero i due canali hanno esigenze opposte: il radar rileva anche la presenza statica e quindi ha bisogno di poco o nessun ritardo, mentre il canale audio ne ha bisogno di molto di più, perché un rumore è istantaneo per definizione e cinque secondi di coda significano che ogni starnuto vale come “attività”. Per l’illuminazione di una stanza si parla di minuti, non di secondi.

Il LED e il display

output:
  - platform: gpio
    pin: GPIO_LED
    id: out_led
 
light:
  - platform: binary
    name: "LED presenza"
    output: out_led
    id: led_presenza
 
interval:
  - interval: 1s
    then:
      - if:
          condition:
            binary_sensor.is_on: stanza_occupata
          then:
            - light.turn_on: led_presenza
          else:
            - light.turn_off: led_presenza

Per il display serve prima identificare il controller montato sul modulo (i pannelli IPS da 0,96 pollici usano di norma un ST7735, ma va verificato sulla documentazione della scheda). Una volta noto, il testo da mostrare è questo:

display:
  - platform: st7735          # da confermare sul modulo in uso
    # ... configurazione bus SPI e pin ...
    lambda: |-
      it.printf(4, 4, id(font_grande), "%s",
                id(presenza_radar).state ? "PERSONA" : "VUOTA");
      it.printf(4, 30, id(font_piccolo), "Audio: %s",
                id(attivita_sonora).state ? "attivo" : "silenzio");
      it.printf(4, 48, id(font_piccolo), "Livello: %.2f",
                id(livello_sonoro).state);

Mostrare anche il valore numerico grezzo accanto allo stato non è un dettaglio estetico: è quello che ti permette di tarare le due soglie guardando lo schermo mentre parli, cammini o accendi la televisione, invece di indovinarle.

MICROFONO E PRIVACY

Questo progetto misura un livello sonoro e non registra nulla, ed è una distinzione che vale la pena dichiarare a chi vive in casa. Un microfono sempre alimentato in soggiorno è comunque un dispositivo di cui è corretto informare gli altri abitanti, anche quando il firmware è tuo e sai esattamente cosa fa.

Occupazione delle porte

Il progetto impegna quattro porte AX22: adattatore Grove per il radar, microfono, display e modulo prototipo con il LED. Verifica quante porte ha la tua board prima di aggiungere altro, perché su una board a quattro porte questo progetto la riempie completamente.


CHANGELOG

DataVersioneModificaNote
2026-09-031.0Prima stesura della paginaDa completare con la mappa porte AX22 → GPIO
2026-09-031.1Aggiunto il progetto composito sensore di presenzaDa confermare: modello radar, controller del display, tipo di LED fornito
2026-09-031.2Rimosso lo sketch Arduino: tutti gli esempi ora sono in ESPHomeCoerenza con l’impostazione del corso