Basi · 11 min di lettura

Convertitore di livello logico: unire 3,3 V e 5 V in sicurezza

Cos'è un convertitore di livello logico? Perché ESP32 e Pico non reggono 5 V, soglie VIH/VIL, partitore, BSS138 per I2C, chip 74HCT e tabella dei moduli.

Un convertitore di livello logico è un piccolo circuito che permette a una scheda a 3,3 V (ESP32, Raspberry Pi Pico, ESP8266) di comunicare in sicurezza con una scheda o un modulo a 5 V (Arduino Uno, LCD I2C, HC-SR04, WS2812B). Collegare un'uscita a 5 V direttamente a un pin a 3,3 V può danneggiarlo lentamente o all'istante; nell'altra direzione, a volte un ingresso a 5 V non vede nemmeno un segnale a 3,3 V come un "1". Sapere quando serve un convertitore, e quale basta, elimina i guasti misteriosi di metà dei progetti a tensioni miste.

In questo articolo vedrai prima cosa significano le soglie VIH e VIL e perché i pin di ESP32 e Pico non reggono 5 V. Poi esamineremo tre soluzioni con esempi: la conversione in un solo senso con un partitore di tensione a due resistenze, il convertitore bidirezionale a MOSFET BSS138 per l'I2C e i chip 74HCT per segnali veloci come WS2812B o SPI. Alla fine trovi una tabella dei moduli che funzionano direttamente a 3,3 V e un elenco di errori comuni.

Scheda di sviluppo ESP32
Tutti i GPIO dell'ESP32 funzionano con logica a 3,3 V; un segnale a 5 V non è sicuro per loro.

Cosa sono i livelli logici a 3,3 V e 5 V?

Un pin digitale conosce solo 0 e 1, ma nel mondo reale la tensione può assumere qualsiasi valore tra 0 e l'alimentazione. Per questo il datasheet di ogni chip indica quattro soglie. VIH (ingresso HIGH) è la tensione più bassa che l'ingresso legge con certezza come 1. VIL (ingresso LOW) è la tensione più alta letta con certezza come 0. La zona intermedia è indefinita: lì il chip può leggere sia 0 sia 1. In uscita, VOH è la tensione minima garantita dal pin quando è HIGH e VOL quella massima garantita quando è LOW. Perché due chip comunichino senza errori, il VOH del trasmettitore deve stare con margine sopra il VIH del ricevitore e il suo VOL con margine sotto il VIL del ricevitore. Come le porte decidono con queste soglie lo spiega l'articolo sulle porte logiche, e puoi provarlo nello strumento porte logiche.

Chip (alimentazione)VIL (max)VIH (min)VOL (max)VOH (min)Massimo sul pin
ATmega328P, Arduino Uno (5 V)1,5 V (0,3 × VCC)3,0 V (0,6 × VCC)0,9 V4,2 V5,5 V
ESP32 (3,3 V)0,83 V (0,25 × VDD)2,48 V (0,75 × VDD)0,33 V2,64 V3,6 V
RP2040, Raspberry Pi Pico (3,3 V)0,8 V2,0 V0,5 VCirca 2,6 V3,8 V
Serie 74HC (5 V)1,5 V3,5 V0,1 V4,4 V5,5 V
Serie 74HCT (5 V)0,8 V2,0 V0,1 V4,4 V5,5 V

Dalla tabella emergono tre conclusioni importanti. Primo, l'uscita HIGH di un Uno a 5 V (4,2–5 V) supera chiaramente il limite di 3,6 V dell'ESP32 e di 3,8 V del Pico: in quella direzione la conversione è obbligatoria. Secondo, l'uscita HIGH a 3,3 V dell'ESP32 di solito supera la soglia VIH di 3,0 V dell'Uno, ma il VOH minimo garantito dal datasheet è 2,64 V; il collegamento quindi spesso funziona, ma diventa al limite con cavi più lunghi o pin caricati. Terzo, un chip 74HC alimentato a 5 V, un espansore I2C con soglia 0,7 × VCC come il PCF8574 o un LED WS2812B non considerano HIGH in modo affidabile nulla sotto 3,5 V; per loro un segnale a 3,3 V davvero non basta. La serie 74HCT ha invece un VIH di 2,0 V, ed è per questo uno dei modi più puliti per passare da 3,3 V a 5 V.

Perché i pin di ESP32 e Pico non reggono 5 V?

Ogni pin d'ingresso di un chip a 3,3 V ha piccoli diodi di protezione che lo collegano alla linea dei 3,3 V e a GND. Sono pensati per assorbire impulsi brevissimi come una scarica elettrostatica, non una corrente continua. Se applichi 5 V al pin, il diodo superiore conduce e scorre corrente dalla sorgente a 5 V verso la linea dei 3,3 V. Se la resistenza interna della sorgente è bassa, la corrente arriva a decine di milliampere e distrugge il diodo e i circuiti del pin scaldandoli. Se è più piccola, il pin non muore subito, ma il chip si degrada nel tempo, e la linea dei 3,3 V può persino salire al punto che la scheda inizia ad alimentarsi dal pin: stacchi il cavo di alimentazione e il LED dell'ESP32 resta acceso debolmente. Il datasheet dell'ESP32 indica per i pin un limite di alimentazione + 0,3 V (circa 3,6 V), quello dell'RP2040 di alimentazione + 0,5 V (circa 3,8 V). "Ho provato una volta e non si è rotto" non significa che il pin sia tollerante ai 5 V.

I pin digitali del chip RP2350 del Raspberry Pi Pico 2 sono progettati per tollerare 5 V mentre la scheda è alimentata; gli ingressi analogici (GP26–GP29) sono esclusi, e i pin continuano a fornire in uscita solo 3,3 V. Applicare 5 V ai pin a scheda spenta è comunque rischioso. Sul primo Pico (RP2040), sull'ESP32 e sull'ESP8266 nessun pin tollera i 5 V.

Cosa serve in ciascun caso?

CasoEsempioSoluzione
Uscita a 5 V → ingresso a 3,3 VTX dell'Uno → RX dell'ESP32, ECHO dell'HC-SR04 → PicoPartitore di tensione (segnali lenti) o buffer 74LVC (segnali veloci)
Uscita a 3,3 V → ingresso a 5 V (VIH circa 3 V)TX dell'ESP32 → RX dell'UnoSpesso funziona direttamente; un 74HCT per un margine garantito
Uscita a 3,3 V → ingresso a 5 V (VIH 3,5 V)ESP32 → WS2812B, chip 74HC a 5 VUn buffer come il 74HCT125 / 74AHCT125
Linea bidirezionale open-drainI2C (SDA, SCL), 1-WireConvertitore a MOSFET BSS138
Linea bidirezionale veloce push-pullBus dati parallelo74LVC245 con pin di direzione, oppure TXS0108E

Conversione in un solo senso con partitore di tensione (5 V → 3,3 V)

Il modo più semplice per portare un'uscita a 5 V su un ingresso a 3,3 V sono due resistenze. Il segnale entra dalla resistenza superiore R1, il punto centrale va al pin a 3,3 V e la resistenza inferiore R2 va a GND. L'uscita è Vout = 5 V × R2 / (R1 + R2); con R2 doppia di R1, i 5 V scendono a 3,33 V. Il partitore funziona in un solo senso, dalla tensione più alta a quella più bassa, quindi non si può usare su linee bidirezionali in cui il lato a 3,3 V deve rispondere. Anche la velocità è limitata, perché la resistenza d'uscita del partitore forma con la capacità del pin un piccolo filtro RC che arrotonda i fronti. Per scegliere i valori usa il calcolatore del partitore di tensione, e per la spiegazione completa l'articolo sul partitore di tensione.

R1 (lato segnale)R2 (lato GND)Uscita con 5 VResistenza d'uscitaUso adatto
1 kΩ2 kΩ (due da 1 kΩ in serie)3,33 V667 ΩQuasi tutti gli usi, anche segnali veloci; assorbe 1,7 mA in HIGH
2,2 kΩ3,3 kΩ3,00 V1,3 kΩIl margine più sicuro; UART, ECHO dell'HC-SR04
10 kΩ20 kΩ3,33 V6,7 kΩBasso consumo; UART fino a 115200 baud e segnali lenti
4,7 kΩ10 kΩ3,40 V3,2 kΩAl limite; se la linea dei 5 V sale a 5,25 V si hanno 3,57 V, sconsigliato

Esempio: UART tra un Arduino Uno e un ESP32

Nei progetti in cui l'Uno legge i sensori e l'ESP32 porta i dati su internet via Wi-Fi, le due schede comunicano via UART. Dato che la linea TX dell'Uno fornisce 5 V, arriva al pin RX dell'ESP32 tramite un partitore da 1 kΩ + 2 kΩ. La linea TX a 3,3 V dell'ESP32 può andare direttamente al pin RX dell'Uno, perché l'Uno considera HIGH tutto ciò che supera 3,0 V. Per lasciare libera la porta seriale USB dell'Uno (D0, D1) per il computer, sull'Uno si usa SoftwareSerial su D10 e D11; sull'ESP32 la seconda porta seriale hardware, Serial2, lavora su GPIO 16 (RX) e 17 (TX). I GND delle due schede devono essere collegati tra loro.

C++ (Arduino IDE)
1// Arduino Uno: SoftwareSerial ile ESP32'ye veri gönder / send data to the ESP32 with SoftwareSerial
2// Uno D11 (TX, 5 V) -> 1k -> ESP32 GPIO 16 ; GPIO 16 -> 2k -> GND
3// ESP32 GPIO 17 (TX, 3,3 V) -> Uno D10 (RX) doğrudan / directly ; GND <-> GND
4#include <SoftwareSerial.h>
5
6SoftwareSerial link(10, 11);   // RX, TX
7
8void setup() {
9  Serial.begin(9600);          // bilgisayar / computer
10  link.begin(9600);            // ESP32 hattı / ESP32 line
11}
12
13void loop() {
14  int raw = analogRead(A0);
15  link.print(F("A0="));
16  link.println(raw);           // ör. / e.g. "A0=512"
17
18  unsigned long start = millis();
19  while (millis() - start < 1000) {          // 1 sn cevap bekle / wait 1 s for a reply
20    if (link.available()) {
21      String reply = link.readStringUntil('\n');
22      Serial.print(F("ESP32: "));
23      Serial.println(reply);
24    }
25  }
26}
C++ (Arduino IDE)
1// ESP32: Serial2 ile Uno'dan gelen satırları oku ve cevap ver / read lines from the Uno on Serial2 and reply
2const int RX2_PIN = 16;        // bölücünün orta noktası / divider midpoint
3const int TX2_PIN = 17;        // Uno D10'a doğrudan / straight to Uno D10
4
5void setup() {
6  Serial.begin(115200);
7  Serial2.begin(9600, SERIAL_8N1, RX2_PIN, TX2_PIN);
8}
9
10void loop() {
11  if (Serial2.available()) {
12    String line = Serial2.readStringUntil('\n');
13    line.trim();
14    Serial.print("Uno: ");
15    Serial.println(line);
16    Serial2.print("OK ");      // 3,3 V çıkış Uno için yeterli / 3.3 V output is enough for the Uno
17    Serial2.println(line.length());
18  }
19}

Prima di caricare, misura il punto centrale del partitore con il multimetro: con l'Uno acceso e senza trasmissioni dovresti leggere circa 3,3 V, perché una linea UART a riposo è HIGH. Se nel Monitor seriale dell'Uno compare ogni secondo una riga come "ESP32: OK 6", la comunicazione funziona in entrambi i sensi. A 9600 baud un bit dura 104 µs, mentre il ritardo introdotto dal partitore da 1 kΩ + 2 kΩ è nell'ordine dei nanosecondi, quindi la velocità non è un problema.

Esempio: collegare un HC-SR04 a un Raspberry Pi Pico

Sensore di distanza a ultrasuoni HC-SR04
L'HC-SR04 funziona a 5 V e il suo pin ECHO emette un impulso a 5 V; va collegato alle schede a 3,3 V tramite un partitore.

L'HC-SR04 funziona in modo affidabile solo a 5 V. Se alimenti il Pico dalla USB, collega il VCC del sensore al pin VBUS del Pico (pin 40). L'ingresso TRIG riconosce senza problemi l'impulso a 3,3 V del Pico, quindi va direttamente a GP15. ECHO invece restituisce un impulso a 5 V; una resistenza da 1 kΩ va tra ECHO e GP14 e una da 2 kΩ tra GP14 e GND. Il codice misura la durata dell'impulso ECHO in microsecondi con time_pulse_us e la converte in distanza con la velocità del suono nell'aria (circa 343 m/s).

MicroPython
1# Raspberry Pi Pico + HC-SR04 (ECHO bölücüyle) / Raspberry Pi Pico + HC-SR04 (ECHO through a divider)
2# VCC -> VBUS (pin 40), GND -> GND, TRIG -> GP15, ECHO -> 1k -> GP14 -> 2k -> GND
3from machine import Pin, time_pulse_us
4import time
5
6trig = Pin(15, Pin.OUT)
7echo = Pin(14, Pin.IN)
8
9
10def distance_cm():
11    trig.value(0)
12    time.sleep_us(2)
13    trig.value(1)                      # 10 µs tetik darbesi / 10 µs trigger pulse
14    time.sleep_us(10)
15    trig.value(0)
16    t = time_pulse_us(echo, 1, 30000)  # en fazla 30 ms bekle / wait at most 30 ms
17    if t < 0:
18        return None                    # yankı yok / no echo
19    return t * 0.0343 / 2              # gidiş-dönüş / round trip
20
21
22while True:
23    d = distance_cm()
24    if d is None:
25        print("Olcum yok / No echo")
26    else:
27        print("Mesafe / Distance: {:.1f} cm".format(d))
28    time.sleep(0.5)

Il convertitore di livello bidirezionale BSS138

La maggior parte delle schedine vendute come "convertitore di livello logico a 4 canali" ha per ogni canale un MOSFET a canale N BSS138 e due resistenze di pull-up da 10 kΩ. Il circuito è semplicissimo: il gate del MOSFET è collegato a 3,3 V (LV), il source va al lato a bassa tensione e il drain al lato ad alta tensione. Ogni lato ha la propria pull-up che porta la linea alla sua alimentazione. Questa struttura è pensata per linee open-drain come l'I2C, che portano la linea solo a 0 e lasciano il livello 1 alle pull-up, e funziona da sola in entrambi i sensi; non c'è un pin di direzione che indichi quale lato sta parlando.

  1. Entrambi i lati a riposo: gate e source del MOSFET sono entrambi a 3,3 V, la tensione tra loro è zero e il MOSFET è spento. Ogni lato è portato a HIGH dalla propria resistenza: il lato LV a 3,3 V, il lato HV a 5 V.
  2. Il lato a 3,3 V porta la linea a LOW: il source scende a 0 V; dato che il gate resta a 3,3 V, la tensione gate-source diventa 3,3 V e il MOSFET conduce. Anche il lato HV viene portato a LOW attraverso il MOSFET.
  3. Il lato a 5 V porta la linea a LOW: il diodo interno (body diode) del MOSFET conduce e porta il source a circa 0,7 V. Quando la tensione gate-source arriva a circa 2,6 V il MOSFET si accende completamente e anche il lato LV va del tutto a LOW.
Pin del moduloDa collegare aNota
LVPin 3V3 della scheda a 3,3 VAlimentazione del lato basso e tensione di gate dei MOSFET
HVSorgente a 5 V (5V dell'Uno o VIN dell'ESP32)Alimentazione delle pull-up del lato alto
GND (due)GND di entrambe le schedeLa massa comune è obbligatoria
LV1–LV4Pin dell'ESP32 o del PicoSegnali del lato a 3,3 V
HV1–HV4Pin del modulo a 5 VCiascuno corrisponde al pin LV con lo stesso numero
La velocità di una scheda BSS138 dipende dalle sue pull-up da 10 kΩ: gestisce senza problemi l'I2C a 100 e 400 kHz e l'UART a 115200 baud, ma i suoi fronti sono troppo lenti per i dati WS2812B a 800 kHz o per un SPI a diversi MHz. Le schede a 8 canali con direzione automatica come il TXS0108E sono più veloci con i segnali push-pull; funzionano anche con l'I2C, ma possono diventare instabili con pull-up forti sulla linea e cavi lunghi. Il TXB0108 della stessa famiglia non è adatto all'I2C.

Esempio: collegare un ESP32 a un LCD I2C a 5 V

Gli LCD a caratteri 16x2 non danno abbastanza contrasto se non sono alimentati a 5 V, e il modulo I2C PCF8574 sul retro porta SDA e SCL a 5 V con resistenze da 4,7 kΩ. In più la soglia VIH del PCF8574 è 0,7 × VCC, cioè 3,5 V a 5 V; i 3,3 V dell'ESP32 restano sotto. Per questo un convertitore BSS138 tra l'LCD I2C e l'ESP32 protegge i pin e rende affidabile la comunicazione. Il collegamento è questo: 3V3 dell'ESP32 a LV, VIN (5 V dalla USB) a HV e al VCC dell'LCD, tutti i GND uniti; GPIO 21 a LV1 e HV1 all'SDA dell'LCD; GPIO 22 a LV2 e HV2 all'SCL dell'LCD. Se il codice di scansione qui sotto trova l'LCD (di solito a 0x27 o 0x3F), il convertitore funziona.

C++ (Arduino IDE)
1// ESP32 I2C tarayıcı: BSS138 dönüştürücü üzerinden 5 V'luk cihazları bul
2// ESP32 I2C scanner: find 5 V devices through a BSS138 converter
3// GPIO 21 -> LV1 / HV1 -> SDA ; GPIO 22 -> LV2 / HV2 -> SCL ; 3V3 -> LV ; VIN (5 V) -> HV
4#include <Wire.h>
5
6const int SDA_PIN = 21;
7const int SCL_PIN = 22;
8
9void setup() {
10  Serial.begin(115200);
11  Wire.begin(SDA_PIN, SCL_PIN);
12  Wire.setClock(100000);       // 100 kHz, BSS138 için rahat hız / comfortable speed for the BSS138
13}
14
15void loop() {
16  int found = 0;
17  for (byte addr = 1; addr < 127; addr++) {
18    Wire.beginTransmission(addr);
19    if (Wire.endTransmission() == 0) {      // 0 = ACK, cihaz var / device present
20      Serial.printf("Cihaz / Device: 0x%02X\n", addr);
21      found++;
22    }
23  }
24  if (found == 0) Serial.println("Cihaz yok / No device found");
25  Serial.println("---");
26  delay(3000);
27}

Chip 74HCT: segnali veloci in un solo senso

Quando partitore e BSS138 sono troppo lenti, la soluzione professionale è un chip buffer. La serie 74HCT si alimenta a 5 V, ma i suoi ingressi hanno soglie compatibili TTL (VIH = 2,0 V): riconosce quindi senza problemi come HIGH il segnale a 3,3 V di ESP32 o Pico e restituisce un segnale a 5 V pieno con fronti netti. L'uso più comune è la linea dati delle strisce WS2812B: il pin dell'ESP32 va all'ingresso di un 74AHCT125, la cui uscita arriva al DIN della striscia tramite una resistenza da 330 Ω; il pin OE (abilitazione) del 74AHCT125 va a GND. Per la direzione opposta, cioè portare un segnale veloce a 5 V a 3,3 V, si usa un 74LVC125 o 74LVC245 alimentato a 3,3 V; i loro ingressi reggono fino a 5,5 V indipendentemente dall'alimentazione.

SoluzioneAlimentazioneDirezioneCanaliUso tipico
74AHCT125 / 74HCT1255 V3,3 V → 5 V4Dati WS2812B, SPI, MAX7219
74HCT2455 V3,3 V → 5 V8Bus dati parallelo, molte uscite
74LVC125 / 74LVC2453,3 V5 V → 3,3 V4 / 8Uscite veloci di sensori a 5 V, moduli scheda SD
Modulo BSS1383,3 V e 5 VBidirezionale4I2C, 1-Wire, UART lento
Partitore di tensioneNessuna5 V → 3,3 V1RX UART, ECHO dell'HC-SR04, pulsanti

Quali moduli funzionano direttamente a 3,3 V?

La tabella seguente riassume se i moduli più usati nei progetti con ESP32 e Pico si possono collegare a una scheda a 3,3 V senza convertitore. I moduli con "Sì" li puoi alimentare dal pin 3V3 e collegarne direttamente i pin di segnale. Tuttavia moduli venduti con lo stesso nome possono avere versioni diverse; controlla se sulla scheda c'è un regolatore o un convertitore di livello e, se hai dubbi, misura con il multimetro la tensione sul pin di segnale con VCC acceso.

ModuloDiretto a 3,3 VNota
Modulo BME280 / BMP280SìIl chip stesso accetta al massimo 3,6 V; alimentalo da 3V3
DHT11 / DHT22Sì3,3–5,5 V; a 3,3 V tieni il cavo corto
DS18B20Sì3,0–5,5 V; pull-up da 4,7 kΩ verso 3,3 V
OLED da 0,96" (SSD1306)SìIl modulo ha un regolatore; alimentarlo da 3V3 tiene anche l'I2C a 3,3 V
MPU6050 (GY-521)SìLe pull-up del modulo vanno a VCC; alimentalo da 3V3
RFID RC522Sì, solo 3,3 VAlimentarlo a 5 V distrugge il modulo
nRF24L01Sì, solo 3,3 VAggiungi un condensatore da 10–100 µF sull'alimentazione
HC-SR04NoAlimentalo a 5 V e dividi ECHO; la versione a 3,3 V è l'HC-SR04P
LCD 16x2 I2C (PCF8574)In parteL'LCD vuole 5 V; usa un BSS138 per SDA e SCL
Striscia LED WS2812BIn parteAlimentata a 5 V; i dati a 3,3 V sono al limite, è consigliato un 74AHCT125
Modulo relè a 5 VIn parteNei moduli attivi bassi un HIGH a 3,3 V può non rilasciare del tutto il relè; scegli un modulo con comando a 3,3 V
Servo SG90Segnale sìAlimenta il motore a 5 V; un segnale PWM a 3,3 V di solito basta

Errori comuni e come risolverli

SintomoCausa probabileSoluzione
Il convertitore BSS138 non funziona per nienteLV e HV non alimentati o invertitiPorta 3,3 V a LV e 5 V a HV; unisci i GND
Il LED dell'ESP32 resta acceso debolmente senza USBUn segnale a 5 V alimenta la scheda tramite un pinAggiungi un partitore o un convertitore su quella linea
Segnale distorto o arrotondato dopo il partitoreResistenze troppo grandi per una linea veloceScendi a 1 kΩ + 2 kΩ o usa un buffer 74LVC
Il primo LED di una striscia WS2812B tremolaI dati a 3,3 V sono sotto la soglia VIH di 3,5 VConverti a 5 V con un 74AHCT125 e aggiungi 330 Ω sulla linea dati
L'I2C a volte funziona e a volte si bloccaPull-up a 5 V e soglia VIH alta sul dispositivoUsa un BSS138 e scendi a 100 kHz
Il relè non si rilascia maiIl modulo relè attivo basso non vede 3,3 V come HIGHUsa un modulo con comando a 3,3 V o un driver a transistor
Caratteri UART corrotti attraverso il convertitoreManca la massa comuneCollega i GND delle due schede
Prima di accendere per la prima volta un circuito a tensioni miste, misura con il multimetro ogni linea di segnale diretta alla scheda a 3,3 V tenendo la scheda ancora scollegata. Se nessuna linea supera 3,6 V, puoi collegarla in sicurezza. Questa semplice abitudine è il modo più economico per salvare un ESP32.

La conversione di livello logico sembra tecnica, ma si riduce a tre regole: proteggi sempre una linea che va da 5 V a 3,3 V, controlla la soglia VIH del ricevitore su una linea che va da 3,3 V a 5 V e usa un BSS138 sulle linee bidirezionali come l'I2C. Con queste regole puoi combinare senza problemi Arduino, ESP32 e Pico nello stesso progetto. Nell'app BlueGrays ogni collegamento dei progetti con ESP32 e Raspberry Pi Pico è spiegato con pin adatti al livello logico della scheda e uno schema passo passo.

Domande frequenti

L'ESP32 tollera i 5 V?

No. Il datasheet dell'ESP32 fissa per i GPIO un massimo di alimentazione + 0,3 V, cioè circa 3,6 V. Con 5 V i diodi di protezione del pin conducono, la corrente va sulla linea dei 3,3 V e il pin può guastarsi col tempo o all'istante. Il fatto che sembri funzionare per un po' non lo rende sicuro.

Posso collegare Arduino ed ESP32 senza convertitore di livello?

In parte. I segnali a 3,3 V che vanno dall'ESP32 ad Arduino di solito superano la soglia di 3,0 V dell'Uno e si possono collegare direttamente. I segnali a 5 V che vanno da Arduino all'ESP32 devono invece sempre passare da un partitore di tensione o da un convertitore. In ogni caso i GND delle due schede vanno uniti.

Quale convertitore di livello logico usare per l'I2C?

Dato che le linee I2C sono open-drain, la scelta migliore è un convertitore bidirezionale a MOSFET BSS138, che funziona senza problemi a 100 e 400 kHz. Anche chip pensati per l'I2C come il PCA9306 fanno lo stesso lavoro. Un partitore di tensione non si può usare sull'I2C, perché la linea trasporta dati in entrambi i sensi.

Un WS2812B funziona con i dati a 3,3 V dell'ESP32?

Spesso sì, ma non è garantito. Un WS2812B alimentato a 5 V si aspetta almeno 3,5 V sull'ingresso dati, e 3,3 V è sotto questa soglia; il primo LED può tremolare, soprattutto con cavi lunghi o se l'alimentazione supera i 5 V. La soluzione affidabile è un buffer come il 74AHCT125 o il 74HCT125 sulla linea dati.

Meglio un partitore di tensione o un modulo convertitore di livello?

Se devi abbassare da 5 V a 3,3 V un segnale lento e in un solo senso, come l'RX di una UART o l'ECHO dell'HC-SR04, bastano due resistenze ed è la soluzione più economica. Se la linea è bidirezionale (I2C) o devi alzare 3,3 V a 5 V, il partitore non serve; usa un modulo BSS138 o un buffer 74HCT. Per segnali molto veloci, i chip buffer sono la scelta giusta.

Cosa significano HV e LV su un convertitore di livello logico?

HV (high voltage) è il lato ad alta tensione e di solito va a 5 V, mentre LV (low voltage) è il lato a bassa tensione e va a 3,3 V. I pin HV1–HV4 vanno ai segnali del dispositivo a 5 V e gli LV1–LV4 con lo stesso numero ai pin della scheda a 3,3 V. I GND dei due lati si uniscono sui pin GND del modulo.

Vedi tutti i progetti
LED Lampeggiante con ESP32
#103Principiante

LED Lampeggiante con ESP32

Insegna l'uso di base delle uscite GPIO con l'ESP32. Otteniamo un effetto lampeggiante accendendo e spegnendo un LED dal pin digitale. Versione ESP32 del classico progetto blink su Arduino UNO; i comandi di base di blink nell'ambiente Arduino sono gli stessi, ma la disposizione dei pin e i livelli GPIO a 3,3 V dell'ESP32 sono diversi da quelli di Arduino UNO.

4.7(37)
100
Controllo LED ESP32 con pulsante (Push)
#104Principiante

Controllo LED ESP32 con pulsante (Push)

Il LED si accende quando il pulsante viene premuto e si spegne quando viene rilasciato. Mostra come vengono utilizzati il pin di ingresso digitale dell'ESP32 e la resistenza di pull-up interna. Grazie alla modalità INPUT_PULLUP, non è necessaria alcuna resistenza esterna.

4.6(36)
55
Lettura dell'intensità luminosa con il modulo LDR ESP32
#113Principiante

Lettura dell'intensità luminosa con il modulo LDR ESP32

Monitoraggio in tempo reale sul Serial Monitor del valore grezzo dell'ADC del modulo LDR e della percentuale relativa di luce calcolata dai valori di riferimento al buio e alla luce. Questa percentuale non è una misurazione in lux. Spiega il principio di calibrazione del modulo. È consigliabile eseguirlo prima del Progetto 10, poiché serve a determinare il valore di soglia.

4.6(36)
55
Lampeggio LED Integrato Raspberry Pi Pico (Pico e Pico W)
#147Principiante

Lampeggio LED Integrato Raspberry Pi Pico (Pico e Pico W)

Il progetto di apertura della serie Raspberry Pi Pico! Facciamo lampeggiare il LED verde integrato per verificare che la scheda funzioni — un classico primo esperimento "Hello World". NESSUN componente esterno, solo Pico e cavo USB. Il codice è scritto in MicroPython (il linguaggio ufficialmente supportato dalla Raspberry Pi Foundation). Impara la classe machine.Pin, la modalità Pin.OUT, i metodi led.on()/off() e time.sleep() in Thonny IDE. Segui ogni commutazi

5.0(1)
10
Schermo LCD I2C per ESP32 (16x2)
#119Intermedio
Premium

Schermo LCD I2C per ESP32 (16x2)

In questo progetto visualizziamo del testo collegando un display LCD a 16x2 caratteri all'ESP32 tramite il protocollo I2C. Grazie all'I2C possiamo controllare il display utilizzando solo 2 pin di dati (SDA e SCL); si elimina così lo spreco dei 6+ pin tipici del collegamento parallelo classico. Il codice stampa un messaggio fisso sulla prima riga e un contatore che aumenta ogni secondo sulla seconda riga. Inoltre, all'inizio, eseguendo lo scanner I2C, stampiamo l'indirizzo del display sul Serial

4.9(23)
40
ESP32 HC-SR04 Misuratore di distanza a ultrasuoni
#116Intermedio

ESP32 HC-SR04 Misuratore di distanza a ultrasuoni

Il sensore a ultrasuoni HC-SR04 calcola la distanza misurando il tempo di volo (Time of Flight) dell'onda sonora che emette dopo aver colpito un oggetto e essere rimbalzata indietro. In questo progetto invieremo un impulso di 10 microsecondi dall'ESP32 al pin TRIG del sensore e leggeremo il tempo di eco proveniente dal pin ECHO con pulseIn(). Visualizziamo la distanza calcolata in cm su un display LCD I2C 16x2. Poiché l'HC-SR04 funziona a 5V, è necessario un divisore di tensione sul pin EC

4.9(28)
46
Controllo della striscia LED NeoPixel WS2812B con ESP32
#126Intermedio
Premium

Controllo della striscia LED NeoPixel WS2812B con ESP32

I LED indirizzabili WS2812B (NeoPixel) sono LED RGB intelligenti che possono essere controllati in cascata tramite un unico pin dati. In questo progetto controlleremo una striscia WS2812B da 8 LED utilizzando la libreria Adafruit_NeoPixel per creare un'animazione fluida dell'arcobaleno. Sebbene il livello logico a 3,3 V dell'ESP32 funzioni senza problemi con la maggior parte dei componenti WS2812B, in caso di instabilità mostreremo la soluzione con una resistenza in serie da 470 Ω e un condensat

4.9(19)
30
Accensione di un LED esterno con Raspberry Pi Pico (breadboard)
#148Principiante

Accensione di un LED esterno con Raspberry Pi Pico (breadboard)

Il passo successivo dopo il LED integrato di Pico: collegare un LED esterno alla breadboard e controllarlo tramite il pin GP14. Con questo progetto imparerai come utilizzare qualsiasi pin GPIO generico del Pico come uscita, la polarità del LED (stelo lungo = anodo/+, stelo corto = catodo/–) e perché è indispensabile un resistore di limitazione della corrente (220 Ω). Se non inserisci il resistore, l’LED riceverà una corrente eccessiva e potrebbe bruciarsi. Il circuito è molto semplice: Pico GP14

4.5(2)
7