Как подключить I²C-дисплей к ESP32?
Обновлено Редакция GAW
В Arduino-ESP32 библиотека Wire по умолчанию использует GPIO21 как SDA и GPIO22 как SCL — на ESP32-DevKitC это контакты IO21 и IO22 на одной стороне с TX и RX. Подключение: GND — GND, SDA — GPIO21, SCL — GPIO22, VCC модуля — к 3V3 или 5V в зависимости от уровней на шине. Другие выводы задаёт Wire.begin(sda, scl).
#include <Wire.h>
#define SDA_PIN 21 // Arduino-ESP32 default for the generic ESP32 board
#define SCL_PIN 22
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN, 100000); // sda, scl, SCL frequency in Hz
for (uint8_t addr = 8; addr < 120; addr++) {
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0) { // ACK: a device answered
Serial.printf("Found device at 0x%02X\n", addr);
}
}
}
void loop() {}
Уровни: 3,3 В у ESP32 против 5 В у модуля
Главное отличие от Arduino Uno — напряжение. ESP32 питается от 3,3 В, и по даташиту на его входы нельзя подавать больше VDD + 0,3 В, то есть 3,6 В. У модуля-переходника LCD на PCF8574 подтягивающие резисторы обычно припаяны к его питанию: если подать на VCC 5 В, линии SDA и SCL в покое окажутся под 5 В. Это выше предела ESP32.
| Параметр | Значение | Источник |
|---|---|---|
| Питание и логика ESP32 | 3,3 В | даташит ESP32, табл. 5-2 |
| Максимум на входе ESP32 | VDD + 0,3 В = 3,6 В | даташит ESP32, табл. 5-3 |
| Внутренняя подтяжка ESP32 | 45 кОм | даташит ESP32, табл. 5-3 |
| Внешние подтяжки | 2–5 кОм (допустимо 1–10 кОм) | ESP-IDF, I2C |
| Частота SCL | до 100 кГц (Sm) и 400 кГц (Fm) | ESP-IDF, I2C |
| Питание PCF8574 | 2,5–6 В | TI SCPS068K, разд. 5.3 |
| Высокий уровень на входе PCF8574 | не ниже 0,7 VCC | TI SCPS068K, разд. 5.3 |
Варианта два. Первый — питать модуль от 3V3: PCF8574 работает от 2,5 В, подтяжки тогда тянут к 3,3 В, и обе стороны видят правильные уровни. У символьного LCD 1602 при 3,3 В снижается контраст, его подбирают заново, — см. статью про HD44780. Второй — оставить модулю 5 В и поставить преобразователь уровней на SDA и SCL с открытым стоком. Подать 3,3 В на вход 5-вольтового модуля не выйдет: по даташиту TI единица для PCF8574 начинается с 0,7 VCC, при 5 В это 3,5 В (наш расчёт).
Подтяжки и скорость
Внутренние подтяжки ESP32 — около 45 кОм; ESP-IDF предупреждает, что на высокой частоте их недостаточно, и рекомендует внешние резисторы 2–5 кОм. Если на модуле их нет, поставьте пару резисторов между линиями и 3,3 В; номинал посчитает калькулятор подтяжек. Ведущий I2C ESP32 работает до 400 кГц, но начинайте со 100 кГц.
Что проверить, если дисплей молчит
- Сканер из примера выше нашёл адрес? Нет — проверьте провода, питание и подтяжки.
- Адрес найден, экран пуст — подстройте контраст и передайте библиотеке тот же адрес.
- Используете не GPIO21 и 22 — передайте выводы в
Wire.begin()и обойдите выводы обвязки загрузки: GPIO0, 2, 5, 12 и 15 влияют на старт платы. - Входы GPIO34–39 для I2C не годятся: по таблице разъёмов ESP32-DevKitC это входы без выходного каскада.
Адреса модулей, перемычки A0–A2 и подключение к 5-вольтовым платам — в ответе про I²C-дисплей и Arduino.
Похожие вопросы
Можно ли использовать для I2C другие выводы ESP32?
Да: по даташиту сигналы I2C подключаются к любым GPIO через матрицу GPIO, в Arduino-ESP32 их задают вызовом Wire.begin(sda, scl) или setPins() до begin(). Не подходят только входы GPIO34–39 — у них нет выходного каскада, а SDA и SCL двунаправленные, — и лучше обходить выводы обвязки загрузки GPIO0, 2, 5, 12 и 15.
Почему дисплей работает от Arduino, а от ESP32 нет?
Скорее всего, из-за уровней. По даташиту TI вход PCF8574 считает единицей напряжение от 0,7 VCC: при питании модуля 5 В это 3,5 В (наш расчёт), а ESP32 выдаёт 3,3 В. Запитайте модуль от 3V3 — PCF8574 работает от 2,5 В — или поставьте преобразователь уровней; у LCD 1602 при 3,3 В придётся заново подобрать контраст.
Нужны ли внешние подтягивающие резисторы, если у ESP32 есть встроенные?
Встроенные подтяжки ESP32 — около 45 кОм, и ESP-IDF прямо указывает, что на высокой частоте их недостаточно и нужны внешние. Если на модуле резисторов нет, поставьте 2–5 кОм к 3,3 В; при одном модуле на коротких проводах можно начать с 4,7 кОм.
Источники
- Espressif. Arduino-ESP32 Documentation (latest): I2C — на SDA и SCL нужны подтягивающие резисторы; выводы по умолчанию у Generic ESP32 — SDA GPIO21, SCL GPIO22; setPins(sda, scl) вызывают до begin(); в режиме ведущего begin(sdaPin, sclPin, frequency); setClock(); тайм-аут по умолчанию 50 мс; endTransmission() возвращает код ошибки, requestFrom() — число принятых байт
- Espressif. ESP-IDF Programming Guide v6.1, ESP32: Inter-Integrated Circuit (I2C) — ESP32 поддерживает Standard-mode до 100 кГц и Fast-mode до 400 кГц, в режиме ведущего SCL не выше 400 кГц; подтяжки обычно 1–10 кОм, рекомендуемый диапазон 2–5 кОм, не меньше 1 кОм; встроенные подтяжки недостаточны для высокой частоты, рекомендуются внешние; i2c_master_probe() — опрос адреса, ESP_ERR_TIMEOUT обычно означает отсутствие подтяжек; ведомый режим ESP32 не поддерживает растягивание такта
- Espressif. ESP32 Series Datasheet v5.3 — табл. 5-3 — VIH 0,75 VDD…VDD + 0,3 В, VIL до 0,25 VDD, внутренняя подтяжка RPU 45 кОм; табл. 5-1 — допустимое напряжение питания не выше 3,6 В; разд. 4.8.4 — выводы I2C выбираются из любых GPIO через матрицу GPIO; табл. 3-1 — выводы обвязки загрузки GPIO0, GPIO2, MTDI (GPIO12), MTDO (GPIO15), GPIO5; прил. «ESP32 Pin Lists» — GPIO34–39 только входы, без выходного каскада
Нашли ошибку? ·
Смотрите также
- ESP32-DevKitC V438 контактов, АЦП, сенсоры, обвязка загрузки, питание, прошивка
- Преобразователь уровнейМикросхема, согласующая логические сигналы разных напряжений
- Подтягивающие резисторы I²CДиапазон Rp по напряжению, скорости и ёмкости шины
- Как подключить I²C-дисплей к Arduino?GND, 5V, SDA на A4, SCL на A5; адрес 0x27 или 0x3F, сканер шины
- HD44780 и LCD 1602Распиновка 1602, команды, инициализация, I²C, кириллица, CGRAM
- Strapping-выводы ESP32Какие GPIO читаются при сбросе: загрузка, напряжение флеш-памяти, JTAG — для ESP32, S2, S3, C2, C3, C5, C6, H2, P4