Гайд · Железо · Уровни
3.3V ↔ 5V: как не сжечь ESP32
Половина датчиков и модулей из мира Arduino работает на 5 В. ESP32, ESP8266 и большинство современных чипов — на 3,3 В. Подашь 5-вольтовый выход прямо на 3,3-вольтовый пин — и можешь убить его на месте. Разбираем, почему они не дружат, когда преобразователь можно не ставить, и три чистых способа их подружить.
Это тот самый вопрос «как считывается уровень?» из основ шин, доведённый до практики — и самый частый способ, которым новички убивают пин ESP32.
Почему 3.3 В и 5 В не работают вместе просто так
Две отдельные проблемы, по одной в каждую сторону:
- 5 В → вход 3,3 В (опасная). Пин ESP32 рассчитан примерно на 3,6 В максимум. Подашь 5 В — превысишь защитные диоды входа: иногда переживёт, часто деградирует или умирает. Именно это сжигает пины.
- 3,3 В → вход 5 В (тихая). «Единица» в 3,3 В может оказаться ниже того, что 5-вольтовый чип считает за логическую единицу (часто ~3,5 В), — устройство ничего не читает или глючит. Ничего не горит, но не работает.
Сначала — а нужен ли вообще преобразователь?
Проверь, прежде чем городить детали:
- Многие 5-вольтовые модули отлично читаются 3,3-вольтовой логикой и управляются от неё — ищи в даташите «3.3 V compatible I/O».
- На I²C, если запитать подтяжки от 3,3 В и датчик это терпит, шина часто просто работает — линии с открытым стоком всё равно подтягиваются только к 3,3 В.
- Опасна только сторона 5 В → 3,3 В. Сигнал 3,3 В на вход 5 В никогда не вредит, лишь иногда его не хватает.
Способ 1 — делитель напряжения (в одну сторону)
Для одного 5-вольтового выхода на 3,3-вольтовый вход — TX датчика на RX ESP32 — хватит двух резисторов:
5V TX ──[ R1 = 1кОм ]──┬──> 3V3 RX (безопасно)
│
[ R2 = 2кОм ]
│
GND
Vout = 5В × R2 / (R1 + R2) = 5 × 2 / 3 ≈ 3.3 В
// Только в одну сторону (5В -> 3В3). НЕ ставить на линию I²C SDA.
Дёшево и надёжно, но только в одну сторону и чуть медленно (сопротивление плюс ёмкость провода заваливают быстрые фронты). Никогда не ставь на двунаправленную линию вроде I²C SDA.
Способ 2 — MOSFET BSS138 (двунаправленный, рабочая лошадка)
Классическая 4-канальная платка «logic level converter» — это несколько MOSFET BSS138. Каждый канал сдвигает сразу в обе стороны автоматически, что и нужно для I²C (и SDA, и SCL двунаправленные). Высокую сторону на 5 В, низкую на 3,3 В, общая земля, сигналы через неё. Пара долларов — и закрыто 90% случаев.
Способ 3 — специальные микросхемы (много/быстрых линий)
Для 8-битной параллельной шины или быстрого SPI — специализированная микросхема:
TXS0108E (авто-направление, дружит с открытым стоком) или TXB0104 (push-pull,
быстрее, не для I²C). Они тянут выше скорости и больше каналов чище, чем делитель или одиночный MOSFET.
Грабли
- Делитель — односторонний. На I²C SDA он ломает шину — датчик не может тянуть линию обратно. Там нужен BSS138.
- Обе опоры напряжения. Модулю-преобразователю нужны оба питания — HV (5 В) и LV (3,3 В) — плюс общая земля; забыл одно — не работает.
- Push-pull vs открытый сток. Микросхемы класса TXB не работают на шинах с открытым стоком вроде I²C; там TXS или BSS138.
- Общая земля обязательна — обе стороны должны делить GND, иначе уровни ничего не значат.
Правило: один 5-вольтовый сигнал внутрь → делитель. Двунаправленная шина (I²C) → платка на BSS138. Много или быстрые линии → нормальная микросхема-преобразователь. Сделай правильно один раз — и пины ESP32 проживут долго.
Борешься с молчащей I²C? Несовпадение уровней — один из типовых виновников.