I pin di un ESP32 non sono tutti uguali, e questa è la singola cosa che fa perdere più tempo a chi inizia. Colleghi un sensore, tutto funziona; sposti il filo su un altro pin perché stava più comodo, e il chip non si avvia più. Non è rotto: hai usato un pin di strapping, cioè uno di quelli che il chip legge all’accensione per decidere in che modalità partire.
Questo capitolo è il capitolo noioso che ti evita tre serate di bestemmie. In questo capitolo vediamo quali pin si possono usare e quali no, come funzionano i quattro bus (I²C, SPI, UART, 1-Wire) con cui si collega praticamente tutto, e le regole di alimentazione che separano un progetto stabile da uno che si riavvia a caso.
Pin che puoi usare, pin che devi evitare
Ogni GPIO di un ESP32 può in teoria fare quasi tutto: ingresso, uscita, PWM, parte di un bus. In pratica alcuni sono già impegnati o hanno comportamenti particolari.
I pin di strapping. All’accensione il chip legge il livello di due o tre pin per decidere se avviare il firmware o entrare in modalità programmazione. Se ci hai attaccato qualcosa che li tira a massa o a 3,3 V nel momento sbagliato, il chip non parte. Sulla C3 sono GPIO2, GPIO8 e GPIO9; sull’ESP32 classico GPIO0, GPIO2, GPIO12 e GPIO15. Si possono usare, ma solo per cose che al boot restano nello stato “giusto” (un sensore I²C va bene, un relè che parte chiuso no).
I pin della flash. Su ogni ESP32 alcuni GPIO sono cablati alla memoria flash e non escono nemmeno sui connettori. Sull’ESP32 classico sono GPIO6-GPIO11: se li vedi elencati in un pinout, ignorali. Sulle board con PSRAM, altri due o quattro pin sono occupati dalla PSRAM.
I pin solo-ingresso. Sull’ESP32 classico, GPIO34-GPIO39 sono input only e non hanno resistenze di pull-up interne. Perfetti per leggere un sensore analogico, inutili per accendere un relè, e per un pulsante richiedono una resistenza esterna.
I pin dell’ADC2. L’ESP32 classico ha due convertitori analogico-digitali, e il secondo (ADC2) smette di funzionare quando il Wi-Fi è attivo. Siccome in ESPHome il Wi-Fi è sempre attivo, i pin dell’ADC2 sono di fatto inutilizzabili per letture analogiche. Sulle C3/S3/C6 il problema non esiste.
La regola operativa è semplice: guarda il pinout della tua board specifica (non “dell’ESP32” in generale) prima di saldare, e in caso di dubbio usa i pin centrali che nessun pinout segnala in rosso. Il Device Builder di cui parliamo in 7 Device Builder in profondita ha una mappa GPIO integrata che marca proprio questi casi, ed è il motivo per cui vale la pena usarlo invece di scrivere il YAML a memoria.
IL SENSORE FUNZIONA MA IL CHIP NON SI AVVIA PIÙ: DA DOVE COMINCIO?
Stacca tutto quello che hai collegato e riprova ad accendere il chip da solo. Se riparte, il colpevole è uno dei collegamenti: ricollegali uno alla volta. Nove volte su dieci è un pin di strapping tenuto basso da un sensore che al boot tira a massa, oppure è un consumo eccessivo che manda il regolatore in brownout (ne parliamo più giù). Se invece non riparte nemmeno nudo, il problema è nel firmware ed è il momento di aprire i log: vedi 14 Troubleshooting e pratiche di buon uso.
3,3 V e 5 V: la regola che non si viola
Gli ESP32 lavorano a 3,3 V. I loro pin non tollerano i 5 V: applicarli significa danneggiare il chip, a volte subito e a volte lentamente nell’arco di settimane (che è il caso peggiore, perché il guasto sembra casuale).
Questo conta perché mezzo mercato dei moduli sensore è nato per Arduino, che lavora a 5 V. Prima di collegare qualcosa, verifica su che tensione lavora:
- Sensori a 3,3 V (BME280, SHT31, LD2410, la maggior parte dell’I²C moderno): collegamento diretto, nessun problema.
- Sensori 3,3-5 V (DHT22, DS18B20, molti moduli con regolatore a bordo): alimentali a 3,3 V e i segnali saranno a 3,3 V. Funziona.
- Sensori e moduli solo a 5 V (alcuni display, certi moduli relè, gli strip WS2812): alimentali a 5 V ma non collegare direttamente i segnali. Serve un level shifter bidirezionale (costa 1 €) o, per i segnali in uscita dal chip, spesso basta un partitore resistivo.
Il caso subdolo è il modulo relè a 5 V: l’ingresso di comando spesso funziona anche pilotato a 3,3 V, quindi sembra tutto a posto, ma il relè scatta in modo inaffidabile e a volte non si diseccita. Compra moduli relè dichiarati a 3,3 V, oppure usa un optoaccoppiatore. Ne riparliamo in 10 Attuatori e uscite.
I quattro bus con cui si collega tutto
Non serve conoscerli a fondo, serve sapere quale ti aspetta ogni sensore e quanti pin ti costa.
I²C è il più usato. Due fili in tutto (SDA per i dati, SCL per il clock) e su quella coppia puoi appendere decine di dispositivi in parallelo, ognuno con un indirizzo diverso. È il motivo per cui la maggior parte dei sensori ambientali è I²C: due fili per il clima, la luce e il CO₂ insieme. In ESPHome si dichiara una volta sola:
i2c:
sda: GPIO8
scl: GPIO9
scan: trueQuel scan: true è prezioso: all’avvio il chip elenca nei log tutti gli indirizzi che risponde. Se il tuo sensore non compare, il problema è nel cablaggio o nell’alimentazione, non nella configurazione. I conflitti nascono quando due dispositivi hanno lo stesso indirizzo: quasi tutti i moduli hanno un ponticello per spostarsi (tipicamente 0x76 ↔ 0x77).
SPI è più veloce e serve per i display grandi, le schede SD e certi moduli radio. Costa quattro pin (CLK, MOSI, MISO, più un CS per ogni dispositivo). Lo incontri soprattutto nel capitolo sui display.
UART è la seriale: due fili (TX e RX) e un collegamento punto a punto, un solo dispositivo per coppia di pin. Ci parlano i sensori mmWave (LD2410, LD2450), i lettori di CO₂ NDIR, i moduli GPS. L’incrocio è obbligatorio: il TX del sensore va sul RX del chip e viceversa, ed è l’errore numero uno.
uart:
tx_pin: GPIO21
rx_pin: GPIO20
baud_rate: 1152001-Wire è il bus della sonda di temperatura DS18B20: un solo filo dati, più massa e alimentazione, e ci puoi appendere più sonde in serie perché ognuna ha un indirizzo di fabbrica unico. Richiede una resistenza di pull-up da 4,7 kΩ fra il filo dati e i 3,3 V; molti moduli venduti già assemblati ce l’hanno a bordo, le sonde impermeabili nude no.
| Bus | Pin richiesti | Dispositivi per bus | Cosa ci trovi |
|---|---|---|---|
| I²C | 2 | Molti (indirizzi diversi) | Sensori clima, luce, CO₂, OLED piccoli |
| SPI | 4 + 1 per device | Molti (un CS ciascuno) | Display grandi, schede SD, moduli radio |
| UART | 2 | Uno | mmWave, CO₂ NDIR, GPS, contatori |
| 1-Wire | 1 | Molti (ID di fabbrica) | Sonde DS18B20 |
Alimentazione: dove nascono i riavvii misteriosi
Un ESP32 in trasmissione Wi-Fi assorbe picchi di 300-500 mA che durano pochi millisecondi. Se l’alimentazione non riesce a seguirli, la tensione crolla per un attimo, il chip rileva il brownout e si riavvia. Il sintomo tipico è “funziona sul banco, si riavvia una volta al giorno una volta montato”, ed è quasi sempre alimentazione.
Le tre strade per dare corrente a una board:
Dalla USB. La più semplice: la board ha un regolatore che dai 5 V della USB ricava i 3,3 V. Serve un alimentatore vero (non la porta USB di un hub scarso) da almeno 1 A, e un cavo decente. I cavi lunghi e sottili fanno cadere la tensione: è una causa di brownout più frequente di quanto si pensi.
Dal pin 5V/VIN. Uguale alla USB ma con l’alimentatore cablato direttamente. Attenzione a non alimentare contemporaneamente da USB e da VIN.
Dal pin 3V3. Bypassa il regolatore della board e gli dai direttamente 3,3 V puliti. Va bene se hai già un’alimentazione a 3,3 V nel progetto, ma non hai più protezioni: 3,4 V sono tollerati, 5 V bruciano tutto.
Due accorgimenti che risolvono la maggior parte dei problemi di stabilità:
- Un condensatore elettrolitico da 470-1000 µF fra 3,3 V e massa, il più vicino possibile al chip. Costa 20 centesimi e assorbe i picchi di corrente della radio.
- Alimentare i sensori dal pin 3V3 della board va bene per l’I²C, che consuma pochi milliampere. Non va bene per servo, strisce LED o relè: quelli vogliono un’alimentazione propria, perché il regolatore della board eroga tipicamente 500-800 mA in tutto e i picchi di un motore se lo mangiano.
SE NEL PROGETTO CI SONO 230 V, CAMBIA APPROCCIO
Alimentare un ESP32 dalla rete elettrica con un modulino AC-DC cinese da 2 € dentro una scatola di derivazione è la cosa più pericolosa che si fa in questo hobby. Se il progetto tocca il 230 V, usa alimentatori certificati, contenitori chiusi con separazione fra la parte a bassa e alta tensione, e se non hai le competenze fatti aiutare da un elettricista. La differenza fra un progetto DIY e un incendio è di tre millimetri di distanza fra due piste. Ne riparliamo in 10 Attuatori e uscite.
Un cablaggio di riferimento
Per fissare le idee, ecco come sta insieme il device che costruiamo in 6 Il primo device: una ESP32-C3 con un BME280.
| Filo | Dal sensore | Alla board |
|---|---|---|
| VIN / VCC | Alimentazione sensore | Pin 3V3 |
| GND | Massa | Pin GND |
| SDA | Dati I²C | GPIO8 |
| SCL | Clock I²C | GPIO9 |
Quattro fili, nessun componente aggiuntivo, il sensore assorbe meno di 1 mA. Su una breadboard sono due minuti. La cosa importante è che quei GPIO8 e GPIO9 non sono magici: sono solo quelli che ho scelto io e che sulla C3 sono liberi e comodi. Su una board diversa saranno altri, e il YAML va cambiato di conseguenza. In ESPHome nessun pin è predefinito: lo dichiari sempre tu, ed è il motivo per cui vale la pena aver letto questo capitolo prima di copiare la configurazione di qualcun altro trovata su un forum.
Ricapitolando
- I pin non sono tutti uguali: strapping, flash, input-only e ADC2 hanno vincoli che vanno rispettati.
- Guarda sempre il pinout della tua board specifica, non un pinout generico dell’ESP32.
- Gli ESP32 lavorano a 3,3 V e i pin non tollerano i 5 V: verifica ogni sensore prima di collegarlo.
- I²C (2 fili, molti device) copre la maggior parte dei sensori; usa
scan: trueper vedere chi risponde. - UART vuole
TXeRXincrociati ed è punto a punto; 1-Wire vuole il pull-up da 4,7 kΩ. - I riavvii misteriosi sono quasi sempre alimentazione: alimentatore da 1 A, cavo decente, condensatore da 470-1000 µF.
- Motori, strisce LED e relè vogliono alimentazione propria, non il pin 3V3 della board.
- Col 230 V non si improvvisa: alimentatori certificati, separazione fisica, o un elettricista.