Перейти к содержанию

Как подключить 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.

ПараметрЗначениеИсточник
Питание и логика ESP323,3 Вдаташит ESP32, табл. 5-2
Максимум на входе ESP32VDD + 0,3 В = 3,6 Вдаташит ESP32, табл. 5-3
Внутренняя подтяжка ESP3245 кОмдаташит ESP32, табл. 5-3
Внешние подтяжки2–5 кОм (допустимо 1–10 кОм)ESP-IDF, I2C
Частота SCLдо 100 кГц (Sm) и 400 кГц (Fm)ESP-IDF, I2C
Питание PCF85742,5–6 ВTI SCPS068K, разд. 5.3
Высокий уровень на входе PCF8574не ниже 0,7 VCCTI 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 кГц.

Что проверить, если дисплей молчит

  1. Сканер из примера выше нашёл адрес? Нет — проверьте провода, питание и подтяжки.
  2. Адрес найден, экран пуст — подстройте контраст и передайте библиотеке тот же адрес.
  3. Используете не GPIO21 и 22 — передайте выводы в Wire.begin() и обойдите выводы обвязки загрузки: GPIO0, 2, 5, 12 и 15 влияют на старт платы.
  4. Входы 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 кОм.

Источники

  1. 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() — число принятых байт
  2. 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 не поддерживает растягивание такта
  3. 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 только входы, без выходного каскада
Страница помогла?

Нашли ошибку? ·