Не работает дисплей 1602 i2c

Обновлено: 06.07.2024

  • Если дисплей показывает чёрные прямоугольники или пустой экран – крутим контраст
  • Если кроме чёрных прямоугольников и пустого экрана ничего не видно – меняем адрес в программе.

Смена адреса на 0x3f, как и д.б., приводит к тому, что дисплей перестает мигать подсветкой, так как команд не получает.

Ардуинка питается от USB, дисплей - от ардуинки (5v), может ему такого напряжения мало?

++:
Подавал питание от 5 до 15 вольт (ЛБП) - ничего не изменилось, во всем диапазоне контрастностей дисплей выводит черные квадраты или пустоту.

ТехнарьКто

Скетч у Вас рабочий. Напряжения в 5V должно быть достаточно. Встречал один раз, что при питании через стабилизатор ардуины как в Вашем случае, питания дисплею не хватало. Нехватка напряжения питания была в том, что окисленные контакты проводов и макетной платы приводили к большому падению напряжения. Подсветка работала, а вместо информации были черные квадраты. Изменение напряжения питания на Vin до стабилизатора напряжения на ситуацию не влияет. Просто подал 5V на дисплей (массы объединить обязательно) и все заработало.

SarmatK

Спасибо, попробую питать их отдельно. А макетка действительно так себе - очень слабенько держатся в ней проводки из набора.

Запараллелил питание - ардуинка и дисплей питаются от БП из набора, напряжение на дисплее = 5.28V. но на дисплее по-прежнему либо пусто, либо черные знакоместа в первой строке.

++: Закомментировал строку "lcd.init();" и получил тот же самый моргающий экран с квадратами - то есть, ошибка может заключаться в программе, а не в схеме. Как узнать, какую именно библиотеку использует IDE? Может какой-то конфликт возникает. Функции не из той либы, например.

Старик Похабыч

Если @ТехнарьКто пишет, что скетч рабочий, то скорее всего он проверил его. Так что искать в проводах и настройках. Фото хоть сделайте того , что показывает. И фото дисплея с 2-х сторон

bort707

в конце компиляции ИДЕ выдает список всех использованных в скетче библиотек, если у вас стоит галочка "показывать вывод компилятора"

SarmatK

Если @ТехнарьКто пишет, что скетч рабочий, то скорее всего он проверил его. Так что искать в проводах и настройках.

Я не на скетч грешу, а на подключение библиотеки. После включения подробного вывода, я увидел предупреждения о задвоившихся определениях членов класса "LiquidCrystal_I2C" - вот тут, наверное, собака и порылась.

в конце компиляции ИДЕ выдает список всех использованных в скетче библиотек, если у вас стоит галочка "показывать вывод компилятора"

Спасибо, поставил галочку и увидел кучу варнингов. Буду разбираться.

Вот фото во время работы и дисплея с двух сторон.

ТехнарьКто

SarmatK

IamNikolay

@SarmatK, раз подсветка работает, то проблема с контрастностью, возможно потенциометр бракованный, мультиметром проверить не мешает что на пин дисплея приходит

SarmatK

@SarmatK, раз подсветка работает, то проблема с контрастностью, возможно потенциометр бракованный, мультиметром проверить не мешает что на пин дисплея приходит На пин приходит от 0 до 5 вольт, в зависимости от положения ротора. Так и должно быть?

IamNikolay

1626428137275.jpg

@SarmatK, да, возможно дело в контактах, отмойте флюс и прозвоните сами контакты, а не просто пины

Геннадий П

Вот это очень зря. Дисплей у тебя подключен к +5 ардуины, а он идет напрямую и поэтому он мог вполне не выдержать такого издевательства.

ТехнарьКто

Вы почему-то считаете, что мы тут экстрасенсы? Понял, что уровень ваш много ниже начального. В общем идите Вы в сад. В смысле детский, для ардуинщиков. Сначала прошиваете стандартный блинк "Blink" из примеров. Если светодиод мигает. Это подтвердит, что Вы смогли правильно настроить порт и научились прошивать простейшие скетчи. Затем прошиваете "Здравствуй мир" в примерах это "Hello World". Вот когда это у Вас получиться, тогда и поговорим.

@SarmatK, раз подсветка работает, то проблема с контрастностью, возможно потенциометр бракованный, мультиметром проверить не мешает что на пин дисплея приходит На фото отчетливо видно, с контрастностью все хорошо. Пусть научиться запускать стандартные примеры из стандартных библиотек, а не любит мозг сообществу самодельными скетчами.

IamNikolay

@ТехнарьКто, если выкрутить контрастность на максимум такие же прямоугольники и получатся, разве что под определенным углом символы видны будут, так что по 1 фото так не определить.
Видно что светодиод(13) горит, значит все же ардуино прошивается.

Старик Похабыч

@SarmatK,
Ниже 3 фото LCD , тоже, только графическое.
1) фото сделано при максимально выкрученном в одну сторону потенциометре.
2) Тоже положение, только под углом.
3) Нормально настроенный
4) не сделал, это выкручено в другую сторону, экран совсем пустой.

1626451972120.jpg

Как вариант попробовать поработать без модуля i2c , подключив по параллельному интерфейсу.

ТехнарьКто

Вижу, что мысль о важности первоначальных проверок, просто пролетела у всех мимо ушей.

Какие бывают Linux?

Бывают для аппаратной части процессоров
1) x86 операционные системы 32bit
2) x86 операционные системы 64bit
3) ARM операционные системы 32bit
4) ARM операционные системы 64bit.

Для x86 это всем привычные
1) настольные компьютеры
2) ноутбуки
Для процессоров ARM
3) смартфоны (телефоны)
4) планшеты
5) ноутбуки
6) всякие Raspberry.

Для телефонов соответственно IDE могут быть разные, например глюкавое ArduinoDroid.

IDE для Linux теоретически может быть любое для C, С++ но скетчи под это дело надо переделывать в нормальный код, это уже не ArduinoIDE для новичков.

Eclipse
Bluefish
NetBeans
Komodo IDE
Anjuta
MonoDevelop
CodeLite
Kdevelop
и еще много всякого. А вот что умудрился использовать вопрошающий, загадка.

Может быть использовано и ArduinoIDE но работать будет не на всех Linux.

Для ArduinoIDE разных версий, совместимость скетчей отсутствует, почему так происходит придумайте сами.
Например на совершенно рабочий скетч ArduinoIDE стала выдавать ошибку компиляции "'prog_char' does not name a type", оказывается просто изменили 'prog_char' и теперь надо просто 'char'. А формально оба скетча рабочие, просто прошиваться будут только на разных версиях ArduinoIDE. И это относиться не просто к скетчам, а и к библиотекам. Взяли скрестили новую версию библиотеки со старым ArduinoIDE или наоборот старую библиотеку с новой версией ArduinoIDE и работать скетч уже не будет. Поэтому. Установили в какой-то операционной системе какую то IDE. Написали по какому то примеру какой то скетч, а не работает. То ли с железом проблема. То ли программы сорятся. То ли ошибок в скетче понаделали. Если скетч старый и рабочий, а у Вас стоит ArduinoIDE с новыми правилами написания скетчей, все равно формально скетч рабочий - просто факт.
И какая ситуация конкретно у спрашивающего, форуму не ведомо. Для начинающих. Установили в чем-то какой-то IDE. Запускаете из примеров Blink. Меняете частоту вспышек. Убеждаетесь, что эти изменения вызваны Вашими действиями. Это Важный шаг. Не надо этот шаг пропускать, типа и так все понятно и просто. Если лампочки на ардуинке мигают то это говорит о том, что какой то процесс идет. Но не говорит о том, что все правильно сделано. При этом может и не работать. Шаг следующий. Устанавливаете или используете установленную библиотеку. Запускаете примеры из этой библиотеки. Разбираетесь почему не работает. И только после того, как убедитесь, что Ваше устройство (в данном случае дисплей) работает на примерах из библиотеки, начинаете с этим делать что то свое. И не раньше. А вопросы не работает стандартное, совсем другая тема.
Если хотите адекватный ответ, пишите операционную систему полностью. Версию IDE полностью. Версию использованной библиотеки полностью. Работала ли первоначальная проверка вспышкой и стандартные примеры на используемой библиотеке.

PS Когда захотел помочь. Получилось как обычно. Думаешь одно, а все совсем иначе. А вопрошающий считает, что вокруг одни экстрасенсы и всю дополнительную информацию про него обязаны знать.



Квадраты это не неисправность дисплея, а вполне адекватная его реакция на отсутствие инициализации. Своеобразный self-test. Отсутствовать инициализация может по нескольким причинам. Но для начала надо вспомнить, какие типы подключения бывают у дисплеев этого формфактора.

Вариант 1: подключение к микроконтроллеру по интерфейсу HD44780

В этом случае между дисплеем и МК идёт шина из, как минимум, шести проводов (не считая питания):

Код для Arduino в этом случае выглядит примерно так:

Причины отображения квадратов:

  1. Плохой контакт или неправильное подключение проводов (не те пины или перепутан порядок);
  2. Неправильно указаны номера пинов в коде
    LiquidCrystal lcd(12, 10, 5, 4, 3, 2);

Исправление ошибки сводится к проверке качества пайки контактов, а также соответствия пинов в коде.

Вариант 2: подключение к микроконтроллеру по интерфейсу I2C

Здесь используется всего два пина для подключения. И эти пины жёстко фиксированы:

На самом же дисплее уже впаян конвертор с I2C на HD44780, который по сути представляет из себя обычный I2C-расширитель на базе чипа PCF8574. Особенность шины в том, что по двум проводам можно параллельно подключить множество различных устройств. Каждое устройство имеет уникальный (в пределах одной шины) адрес, который либо жёстко установлен производителем, либо может менять в определённых пределах с помощью перемычек или джамперов:

Но есть ещё одна версия библиотеки, в которой указывается не только адрес дисплея, но и порядок подключения контактов дисплея к контактам чипа PCF8574. Тогда код выглядит так:

Обратите внимание на отличия в объявлении объекта дисплея и инициализации. И всё было бы хорошо, но разные дисплеи иногда имеют разный порядок подключения контактов между собственно самим дисплеем и чипом PCF8574. Я лично встречал два варианта. Первый указан в коде выше. Второй способ объявления выглядит так:

Соответственно возможны следующие причины появления квадратов:

  1. Плохой контакт или неправильное подключение проводов (перепутаны местами SDA и SCL);
  2. Неправильно указано соответствие пинов дисплея и I2C чипа в коде
    LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  3. Неправильно указан адрес дисплея.

Порядок поиска неисправности в данном случае такой:

Подключение LCD 1602


LCD 1602 является широко распространенным и популярным дисплеем среди радиолюбителей, кроме этого, аналогичные дисплеи встраиваются в различные устройства серийного производства. Дисплей построен на базе контроллера HD44780 и его аналогах, широкая известность связана с его давним появлением на рынке, во времена стремительного развития электроники. В этой статье я расскажу про сопряжение интерфейса I2C и LCD 1602, с помощью микросхемы расширителя портов PCF8574.

В продаже имеется два типа дисплея, с зеленым экраном и темными символами (заказать можно здесь ), а также с синим экраном и светлыми символами (заказать можно тут ), как по мне, то светлый зеленый экран смотрится лучше.

Описание и команды управления LCD 1602

Дисплей содержит две строки, в каждой умещается по 16 символов, напряжение питания может находиться в пределах 4,5-5,5 В, ток потребления составляет 1,2 мА без учета подсветки, которая может потреблять значительный ток. Дисплей имеет достаточно много выводов, назначение которых приведено в следующей таблице:

Ниже в таблице представлены команды для управления LCD 1602:

Назначение битов представлено в следующей таблице:

Каждая инструкция выполняется определенное время, которое указано в вышеприведенной таблице, завершение внутренней операции можно узнать с помощью чтения флага занятости BF (инструкция №9). Но обычно флаг не опрашивают, а просто выдерживают соответствующую паузу после передачи инструкции. Вообще чтение данных из дисплея применяется редко, и не представляет особого интереса.

Адреса ячеек
1-я строка000102030405060708090A0B0C0D0E0F
2-я строка404142434445464748494A4B4C4D4E4F

На каждой строке экрана умещается 16 символов, но это только видимая область, общий объем DDRAM памяти составляет 80 байт, то есть в каждую строку можно записать по 40 символов, и только 16 из них будут отображаться на экране, остальные символы останутся в невидимой области. С помощью команды сдвига экрана (инструкция №5) можно просмотреть все остальные символы, наподобие эффекта бегущей строки. Регистры с адресами 0x00-0x27 составляют первую строку, ячейки 0x40-0x67 вторую строку. Если задать только одну строку для вывода (бит N=0 в инструкции №6, при этом будет использована 1-я строка), то длина строки увеличиться, и будет вмещать 80 символов.

Для вывода символа необходимо записать адрес регистра DDRAM памяти в адресный указатель (инструкция №8), тем самым выбрав положение символа на экране, затем записать в выбранный регистр код ASCII символа (инструкция №10), исходя из полученного кода, контроллер дисплея извлекает данные из CGROM памяти для прорисовки символа в заданном положении на экране. После вывода символа, адресный указатель автоматически инкрементируется или декрементируется, в зависимости от того, какое значение было задано биту направления I/D. Таким образом, символы можно выводить последовательно, при этом корректировка адреса DDRAM памяти не требуется. Например, если первая строка полностью заполнится символами, то произойдет переход на вторую строку, и наоборот.

Инициализация LCD 1602

Если разрешить сдвиг экрана при выводе символов (бит SH=1), то с каждым новым символом экран будет сдвигаться в выбранном направлении, то есть новые символы будут появляться в заданном положении на экране, а остальные сдвигаться.

Дополнительно на экране можно включить отображение курсора (бит C=1), который выглядит в виде линии подчеркивания, и может мигать в зависимости от настроек. Положение курсора на экране соответствует текущему адресу DDRAM памяти в адресном указателе. Курсор можно сдвигать по экрану (инструкция №5), при этом адресный указатель будет инкрементироваться/декрементироваться в зависимости от направления сдвига.

Подключение LCD 1602 через I2C интерфейс

Модуль PCF8574 I2C

Специально для дисплея, в продаже имеется модуль-переходник на основе микросхемы PCF8574AT, которая предназначена для расширения количества линий ввода/вывода. Микросхема подключается по I2C интерфейсу и имеет порт из 8 линий ввода/вывода, принцип функционирования простой, при записи байта данных в микросхему, линии порта принимают уровни, соответствующие значениям битов полученного байта. Операция чтения возвращает байт данных, биты которого указывают состояние линий порта. Таким образом, микросхема позволяет расширить количество линий ввода/вывода, используя два управляющих провода. Фото модуля представлено ниже:

Заказать модуль можно тут . На модуле установлен подстроечный резистор для регулировки контрастности экрана, также имеется джампер (перемычка), разрешающий управление подсветкой дисплея, о котором будет сказано позже.

Подключение LCD 1602 по I2C интерфейсу

На следующей картинке приведена схема подключения LCD 1602 и I2C модуля:

Адрес микросхемы PCF8574AT на шине I2C можно настраивать, старшие 4 бита адреса фиксированы, и равны 0111, младшие 3 бита зависят от состояния входов микросхемы A2-A0. На модуле данные входы подтянуты к высокому уровню, соответственно адрес микросхемы принимает значение 0111111.

Передача данных LCD 1602 через PCF8574

Как видно из схемы, к микросхеме подключена только часть линий ввода/вывода дисплея DB7-DB4, это означает, что управление дисплеем возможно только через 4-битный интерфейс. Для ввода инструкции в дисплей требуется 2 тактовых импульса на линии E, то есть последовательность уровней 1010 (“защелкивание” данных происходит по спаду уровня), в итоге необходимо записать в микросхему 4 байта для одной инструкции. На картинке ниже приведен пример записи инструкции в дисплей по интерфейсу I2C:

Сначала передается старший полубайт инструкции с битом E=1, затем то же самое с битом E=0, при этом в дисплей передается первая половина инструкции. Далее таким же образом передается вторая половина (младший полубайт).

Для управления подсветкой дисплея, на плате модуля установлен транзистор, подключенный к линии P3 микросхемы. Таким образом, 3-й бит в байте данных управляет подсветкой, 0 – выключена, 1 – включена. При отсутствии джампера (о котором я писал выше) подсветка отключается, независимо от бита управления.

Схема подключения LCD 1602 по интерфейсу I2C

Я подключил дисплей с модулем к микроконтроллеру PIC16F628A, схема представлена ниже:

Кнопка SB1 управляет подсветкой дисплея, светодиод HL1 загорается в случае ошибки передачи данных. Неполный код программы приведен ниже (полную версию можно скачать в конце статьи):

Подключить LCD1602 к Arduino (или любой другой LCD на базе микросхем HD44780) не всегда удобно, потому что используются как минимум 6 цифровых выходов. LCD I2C модули на базе микросхем PCF8574 позволяют подключить символьный дисплей к плате Arduino всего по двум сигнальным проводам (SDA и SCL).

Микросхема PCF8574/PCF8574T обеспечивает расширение портов ввода/вывода для контроллеров через интерфейс I2C и позволит легко решить проблему нехватки цифровых портов. При использовании модуля как расширитель портов ввода/вывода следует учитывать то, что вывод Р3 имеет инверсный выход с открытым коллектором.

Микросхема может использоваться для управления ЖК дисплеем под управлением контроллера HD44780, в 4-х битном режиме. Для этой цели на плате установлена микросхема PCF8574, которая является преобразователем шины I2C в параллельный 8 битный порт.

Компоненты PCF8574 - I2C модуль для LCD на базе HD44780

Плата модуля разведена таким образом, чтобы ее можно было сразу подключить к ЖКИ. На вход подается питание и линии I2C. На плате сразу установлены подтягивающие резисторы на линиях SCL и SDA, потенциометр для регулировки контрастности и питание самого дисплея. Джампер справа включает/отключает подсветку.

Установка библиотеки LiquidCrystal I2C

Для работы с данным модулем необходимо установить библиотеку LiquidCrystal I2C. Скачиваем, распаковываем и закидываем в папку libraries в папке Arduino. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.

Библиотеку можно установить из самой среды следующим образом:

Описание методов библиотеки LiquidCrystal I2C

LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)

LiquidCrystal_I2C ( uint8 _ t lcd_Addr , uint8 _ t lcd_cols , uint8 _ t lcd_rows ) ;

init()

backlight()

Включение подсветки дисплея.

setCursor(uint8_t, uint8_t)

Установка позиции курсора.

clear()

Возвращает курсор в начало экрана.

home()

Возвращает курсор в начало экрана и удаляет все, что было на экране до этого.

write(uint8_t)

Позволяет вывести одиночный символ на экран.

cursor()

Показывает курсор на экране.

noCursor()

Скрывает курсор на экране.

blink()

Курсор мигает (если до этого было включено его отображение).

noBlink()

Курсор не мигает (если до этого было включено его отображение).

display()

Позволяет включить дисплей.

noDisplay()

Позволяет отключить дисплей.

scrollDisplayLeft()

Прокручивает экран на один знак влево.

scrollDisplayRight()

Прокручивает экран на один знак вправо.

autoscroll()

Позволяет включить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.

noAutoscroll()

Позволяет выключить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.

leftToRight()

rightToLeft()

createChar(uint8_t, uint8_t[])

Подключение LCD1602 к Arduino

Модуль оборудован четырех-пиновым разъемом стандарта 2.54мм

Выводы отвечающие за интерфейс I2C на платах Arduino на базе различных контроллеров разнятся

Arduino Mega Arduino Uno/Nano/Pro Mini LCD I2C модуль Цвет проводов на фото
GND GND GND Черный
5V 5V VCC Красный
20 (SDA) A4 SDA Зелёный
21 (SCL) A5 SCL Жёлтый

Схема подключения LCD1602 к Arduino по I2C

Схема подключения LCD1602 к Arduino по I2C(HD44780 - PCF8574)

Пример скетча

Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки Устанавливаем курсор на первую строку и нулевой символ. Выводим на экран количество секунд с момента запуска ардуины

Результат

Подключение LCD1602 к Arduino - Результат

Подключение LCD1602 к Arduino - Результат

Создание собственных символов

С выводом текста разобрались, буквы английского алфавита зашиты в память контроллера. А вот что делать если нужного символа в памяти контроллера нет? Требуемый символ можно сделать вручную. Данный способ частично, ограничение в 7 символов, поможет решить проблему вывода.

Ячейка, в рассматриваемых нами дисплеях, имеет разрешение 5х8 точек. Все, к чему сводится задача создания символа, это написать битовую маску и расставить в ней единички в местах где должны гореть точки и нолики где нет.

Пример скетча

Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки Устанавливаем курсор на первую строку и нулевой символ.

Результат

Подключение LCD1602 к Arduino - Создание собственных символов

Проблемы подключения LCD1602 к Arduino по I2C

Если после загрузки скетча у вас не появилось никакой надписи на дисплее, попробуйте выполнить следующие действия:

  1. Можно регулировать контрастность индикатора потенциометром. Часто символы просто не видны из-за режима контрастности и подсветки.
  2. Проверьте правильность подключения контактов, подключено ли питание подсветки. Если вы использовали отдельный I2C переходник, то проверьте еще раз качество пайки контактов.
  3. Проверьте правильность I2C адреса. Попробуйте сперва поменять в скетче адрес устройства с 0x20 до 0x27 для PCF8574 или с 0x38 до 0x3F для PCF8574A. Если и это не помогло, можете запустить скетч I2C сканера, который просматривает все подключенные устройства и определяет их адрес методом перебора. Для изменения адресации необходимо установить джамперы в нужное положение, тем самым притянуть выводы A0, A1, A2 к положительному либо отрицательному потенциалу. На плате положения промаркированы.

Если экран все еще останется нерабочим, попробуйте подключить LCD обычным образом.

Материалы

Купить LCD Adapter PCF8574 на AliExpress

Купить LCD Adapter PCF8574 на AliExpress

TENSTAR ROBOT LCD1602+I2C LCD 1602 module Blue/Green screen PCF8574 IIC/I2C LCD1602 Adapter plate

TENSTAR ROBOT LCD1602+I2C LCD 1602 module Blue/Green screen PCF8574 IIC/I2C LCD1602 Adapter plate

2PC IIC/I2C LCD1602/2004 Adapter Plate for arduino Interface lcd1602 I2C LCD Adapter PCF8574

New IIC/I2C / Interface LCD1602 1602A 2004 LCD Adapter Plate Wholesale Electronic

Похожие записи

Комментарии 1

Большой проект Color and Code версии 19. Определение элементов по цвету, коду, справочники, включая Arduino.

Читайте также: