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

Как подключить I²C-дисплей к Arduino?

Обновлено Редакция GAW

Дисплей с переходником I²C подключают четырьмя проводами: GND — к GND, VCC — к 5V, SDA — к A4, SCL — к A5. Это выводы аппаратного модуля TWI микроконтроллера ATmega328P (PC4 и PC5), и библиотека Wire использует именно их. У других плат выводы отличаются — таблица ниже собрана по справочнику Arduino.

Выводы I²C у разных плат Arduino

ПлатаSDASCLПримечание
UNO R3, UNO R4 Minima и WiFiA4A5те же линии выведены на контакты SDA и SCL цифровой гребёнки
Nano, Nano EveryA4A5
Mega 2560 Rev32021подтягивающие резисторы стоят на плате
Leonardo, Micro23

Шина I²C работает по двум линиям с открытым стоком, поэтому на них нужны подтягивающие резисторы. На модуле-переходнике с PCF8574 они обычно распаяны, а ядро Arduino при Wire.begin() ещё включает встроенные подтяжки ATmega328P на 20–50 кОм. Если на шине несколько устройств или длинные провода, номинал стоит проверить калькулятором подтяжек.

Адрес модуля

Переходник для символьных LCD 1602 и 2004 построен на расширителе портов PCF8574 или PCF8574A. По даташитам TI байт адреса у PCF8574 — 0100 A2 A1 A0 R/W, у PCF8574A — 0111 A2 A1 A0 R/W. Выводы A0–A2 на модуле подтянуты к питанию, перемычки не запаяны, поэтому чаще всего получается 0x27 или 0x3F. Если перемычки запаяны, адрес смещается вниз: PCF8574 отвечает в диапазоне 0x20–0x27, PCF8574A — 0x38–0x3F. Что такое 7-битный адрес и почему 0x27 и 0x4E — одно и то же, разобрано в словаре: адрес I²C.

Самый надёжный способ узнать адрес — сканер. Он перебирает адреса и ловит подтверждение: Wire.endTransmission() возвращает 0, если устройство ответило, и 2, если на адрес пришёл NACK.

#include <Wire.h>

void setup() {
  Wire.begin();                 // SDA = A4, SCL = A5 on UNO and Nano
  Serial.begin(9600);
  for (uint8_t addr = 8; addr < 120; addr++) {   // 0-7 are reserved
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {           // 0 = ACK received
      Serial.print("Found device at 0x");
      Serial.println(addr, HEX);
    }
  }
}

void loop() {}

Найденный адрес передают конструктору библиотеки дисплея. Если сканер ничего не нашёл, проверьте провода и питание по инструкции «Как проверить шину I²C»: в покое обе линии должны быть в высоком уровне.

Контраст и подсветка

Пустой экран при найденном адресе — почти всегда контраст: его крутят подстроечным резистором на переходнике, пока не появятся знакоместа. Подсветку включает перемычка LED на том же модуле. Команды контроллера, инициализация и вывод кириллицы — в статье про HD44780, протокол шины и адреса популярных датчиков — в обзоре I²C. Те же модули работают и с платами на 3,3 В, но там есть нюансы с уровнями — см. ответ про ESP32.

Похожие вопросы

Можно ли подключить I2C-дисплей к другим выводам Arduino?

У плат на ATmega328P аппаратный модуль TWI жёстко привязан к PC4 и PC5, то есть к A4 и A5, и библиотека Wire другие выводы не принимает. У UNO R3 и R4 те же сигналы продублированы на контакты SDA и SCL цифровой гребёнки — это не другой порт, а те же линии.

Почему сканер находит 0x27, а в даташите модуля написано 0x4E?

Это один адрес в двух записях: 0x4E — байт адреса с битом записи в младшем разряде, 0x27 — 7-битный адрес, который использует Wire. Таблица TI для PCF8574 так и даёт пары: запись 0x4E, чтение 0x4F при A2 A1 A0 = 1 1 1. Чтобы перевести 8-битный адрес в 7-битный, сдвиньте его на бит вправо.

Нужны ли внешние подтягивающие резисторы, если дисплей подключён коротким шлейфом?

На модулях-переходниках с PCF8574 резисторы обычно уже стоят, и ядро Arduino включает встроенные подтяжки ATmega328P на 20–50 кОм. Для одного модуля на 100 кГц этого хватает; если на шине несколько устройств или длинные провода, посчитайте номинал калькулятором подтяжек.

Источники

  1. Arduino. Language Reference: Wire (репозиторий arduino/reference-en); ArduinoCore-avr, libraries/Wire/src/utility/twi.c и twi.h — таблица выводов I²C: UNO R3, UNO R4 и Nano — A4 (SDA), A5 (SCL); Mega 2560 — D20 (SDA), D21 (SCL); Leonardo и Micro — D2, D3; библиотека работает с 7-битными адресами, 8-битный адрес из даташита сдвигают на бит вправо; адреса 0–7 зарезервированы; на SDA и SCL нужен подтягивающий резистор, у Mega 2560 подтяжки на выводах 20 и 21 стоят на плате; endTransmission() возвращает 0 — успех, 2 — NACK на адрес, 5 — тайм-аут; twi_init() включает внутренние подтяжки digitalWrite(SDA, 1) и digitalWrite(SCL, 1), TWI_FREQ по умолчанию 100 000 Гц
  2. Texas Instruments. PCF8574 Remote 8-Bit I/O Expander for I2C Bus (SCPS068K, September 2024); PCF8574A (SCPS069H, September 2024) — разд. 7.3.2–7.3.3 — байт адреса PCF8574: 0 1 0 0 A2 A1 A0 R/W, 8-битные адреса записи 0x40–0x4E (7-битные 0x20–0x27); PCF8574A: 0 1 1 1 A2 A1 A0 R/W, 0x70–0x7E (7-битные 0x38–0x3F); разд. 5.3 — питание 2,5–6 В, VIH не ниже 0,7 VCC
  3. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B, 2020) — разд. 1.1 и рис. 24-9 — выводы PC4 (ADC4/SDA) и PC5 (ADC5/SCL), то есть A4 и A5 платы; табл. 30-1 (общие DC-характеристики) — внутренний подтягивающий резистор I/O RPU 20–50 кОм
Страница помогла?

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