Інтернет Windows Android

Програмування ки індикаторів i2c для Ардуіно. Підключення LCD екрана LCM1602 з I2C до Arduino

Мабуть один з найпопулярніших екранів на ринку. Зібраний на популярному контролері HD44780U. З назви моделі слід, що екран складається з двох рядків по 16 символів. Підтримки російської мови в цій конкретної моделі немає.

Шина даних ш2с дозволяє по двох проводах підключати до 127 пристроїв, при чому одночасно. Даний I2C реалізований на чіпі PCF8574T.

Схема підключення:

Синя штука - змінний опір, дозволяє налаштувати контрастність екрану.

Перемичка зліва - відповідає за підсвічування екрану.

Блок з 4х контактів підключається до arduino так:

GND - GND
VCC - 5V
SDA - A4 (якщо Arduino MEGA, то до D20)
SCL - A5 (якщо Arduino MEGA, то до D21)

бібліотека

скетч

У дисплея може бути інший IIC адреса, замість 0x27 може виявитися 0x3F. Щоб точно визначити адресу можете скористатися сканером i2c пристроїв.

#include #include // задаємо адресу LCD екрана 0x27, 16 символів, 2 рядка LiquidCrystal_I2C lcd (0x27, 16, 2); void setup () (lcd.init (); // ініціалізувавши екран // включаємо підсвічування lcd.backlight (); // Встановлюємо позицію починаючи з якої виводиться текст. lcd.setCursor (2, 0); // виводимо рядок 1 lcd.print ( "Hello, World!"); // аналогічно виводимо другий рядок lcd.setCursor (1, 1); lcd.print ( "www.сайт"); ) Void loop () ()

LCD I2C модуль дозволити підключити символьний дисплей до плати Arduino всього по двом сигнальним проводам.

Використовувані компоненти (купити в Китаї):

. керуюча плата

. з'єднувальні дроти

Основні технічні характеристики:

Дисплей: символьний 16х02 або 20x04
. Підсвічування: Синя c білими символами
. Контраст: Настроюється потенціометром
. Напруга живлення: 5В
. Інтерфейс: I2C
. I2C адреса: 0x27
. Розміри: 82мм x 35мм x 18мм

Підключення до Arduino

Модуль обладнаний чотирьох-піновим роз'ємом стандарту 2.54мм

SCL: Послідовна лінія тактирования (Serial CLock)

SDA: Послідовна лінія даних (Serial DAta)

VCC: "+" Харчування

GND: "-" харчування

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

Для роботи з даним модулем необхідно встановити бібліотеку LiquidCrystal_I2C1602V1

Викачуємо, розпаковуємо і закидаємо в папку libraries в папці Arduino. У разі, якщо на момент додавання бібліотеки, Arduino IDE була відкритою, перезавантажуємо середу.

Переходимо безпосередньо до скетчу. В даному прикладі виведемо стандартний "Hello, world!" і для адреса нашого співтовариства.

приклад програмного коду:

#include #include LiquidCrystal_I2C lcd (0x27,16,2); / * Задаємо адресу і розмірність дисплея. При використанні LCD I2C модуля з дисплеєм 20х04 нічого в коді змінювати не потрібно, cледует тільки задати правильну розмірність * / void setup () (Lcd.init (); // Ініціалізація lcd lcd.backlight (); // Включаємо підсвічування // Курсор знаходиться на початку 1 рядка lcd.print ( "Hello, world!"); // Виводимо текст lcd.setCursor (0, 1); // Встановлюємо курсор в початок 2 рядки lcd.print ( "сайт"); // Виводимо текст) void loop () { }

Створення власних символів

З висновком тексту розібралися, букви англійського алфавіту зашиті в пам'ять контролера всередині дисплея і з ними проблем немає. А ось що робити якщо потрібного символу в пам'яті контролера немає?

Не біда, необхідний символ можна зробити вручну. даний спосіб частково, обмеження в 7 символів, допоможе вирішити проблему виведення.

Осередок, в розглянутих нами дисплеях, має дозвіл 5х8 точок. Все, до чого зводиться задача створення символу, це написати бітову маску і розставити в ній одинички в місцях де повинні горіти точки і нулики де немає.

У нижче наведеному прикладі намалюємо смайлик.

приклад програмного коду:

// Тестувалося на Arduino IDE 1.0.5 // Додаємо необхідні бібліотеки #include #include // Бітова маска символу посмішки byte smile \u003d (B00010, B00001, B11001, B00001, B11001, B00001, B00010,); LiquidCrystal_I2C lcd (0x27,20,4); // Задаємо адресу і розмірність дисплея. void setup () (Lcd.init (); // Ініціалізація lcd lcd.backlight (); // Включаємо підсвічування // Створюємо символ під номером 0 lcd.createChar (1, smile); lcd.setCursor (0, 0); // Встановлюємо курсор в початок 1 рядка lcd.print ( "\\ 1"); // Виводимо смайлик (символ під номером 1) - "\\ 1" ) void loop () { }

Програма для легкого створення символів

У коментарях учасник спільноти скинув посилання на генератор символів

Придбав я тут від хорошого магазину Чіп Резистор черговий девайс для вивчення і застосування в корисних пристроях. Цей девайс виявився заточений для управління ЖК дисплеєм під управлінням контролера HD44780, в 4-х біт. Для цієї мети на платі встановлена \u200b\u200bмікросхема, яка є перетворювачем шини I2C в паралельний 8 бітний порт.

Плата розлучена таким чином, щоб її можна було відразу схрестити з РК дисплеєм. На вхід підключений до джерела живлення і лінії I2C. На платі одразу встановлені підтягує резистори на лініях SCL і SDA, потенціометр для регулювання контрастності і харчування самого дисплея.

Джампер справа включає / відключає підсвічування. Далі озброївшись тестером була складена наступна табличка. Після вивчення модуля було виявлено що P3 управляє підсвічуванням. Якщо джампер встановлений, то 1 включає підсвічування, а 0 вимикає. При знятому джампер підсвічування завжди вимкнена. Далі було прийнято рішення доповнити бібліотеку axlib функціями для роботи з шиною I2C (програмна реалізація) і функціями для керування мікросхемою PCF8574. У двох словах як працює модуль. Для того щоб вивести паралельно байт, для цього потрібно надіслати в шину I2C адреса мікросхеми (за замовчуванням він дорівнює 0x4E. Так само можна міняти адресу методом впаювання перемичок на платі і змінюючи значення трьох молодших розрядів адреси), потім після отримання ACK надсилається байт даних. Після того як мікросхема відповідає ACK, байт з'являється на паралельному порту мікросхеми. Для управління ЖК дисплеєм я взяв функції з бібліотеки axlib і трохи переробив їх для роботи з шиною I2C. #include #include #include #include #define ADD 0x4E // Адреса мікросхеми / * LCD Мікросхема RS P0 RW P1 EN P2 D4 P4 D5 P5 D6 P6 D7 P7 На ніжці P3 подключени підсвічування. 1 вкл, 0 викл. * / // Висновок даних com | \u003d 0x04; // Е в одиницю pcf8574_byte_out (com, ADD); // Висновок даних com & \u003d 0xFB; // Е в нуль pcf8574_byte_out (com, ADD); // Висновок даних ) Void init (void) (_delay_ms (30); com (0x30); _delay_us (40); com (0x30); // Перехід в 4-х бітний режим _delay_us (40); // Затримка для виконання команди com (0x30); // Перехід в 4-х бітний режим _delay_us (40); // Затримка для виконання команди com (0x20); // Перехід в 4-х бітний режим _delay_us (40); // Затримка для виконання команди com (0x20); // Установка параметрів com (0x80); // Установка параметрів com (0x00); // Вимикаємо дисплей com (0x80); // Вимикаємо дисплей com (0x00); // Очищаємо дисплей com (0x10); // Очищаємо дисплей com (0x00); com (0x60); // Встановлюємо режим введення даних com (0x00); com (0xC0); // Включаємо дисплей з обраним курсором ) Void char_out (BYTE data) (BYTE data_h \u003d ((data & 0xF0) + 0x09); BYTE data_l \u003d ((data // Передача старших 4 біт data_h | \u003d 0x04; pcf8574_byte_out (data_h, ADD); // Передача старших 4 біт // Передача старших 4 біт // Передача молодших 4 біт // Передача молодших 4 біт // Передача молодших 4 біт ) Void str_out (BYTE * str) (while ((* str)! \u003d "\\ 0") (char_out (* str); str ++;)) int main (void) (init (); str_out ( "YOPҐBET MҐP!" ); while (1) ()) Власне що тут відбувається. Спочатку підключаємо бібліотеки для I2C і для PCF8574. Про I2C я писав уже, тому розпинатися ще раз на буду, а от що в PCF8574.h я розповім. До складу бібліотеки увійшли всього три функції.
BYTE pcf8574_test (BYTE add) (BYTE ask \u003d ACK; add & \u003d 0xFE; i2c_start (); ask \u003d i2c_send_byte (add); i2c_stop (); return ask;) Перша функція була написана для перевірки наявності пристрою на шині. В принципі її можна застосовувати для пошуку будь-якого пристрою знаходиться на шині. Функція приймає адресу шуканого пристрою і якщо воно відповідає, то повертає нуль. Якщо пристрій з такою адресою немає на шині, то поверне одиницю.
BYTE pcf8574_byte_out (BYTE data, BYTE add) (BYTE ask \u003d ACK; add & \u003d 0xFE; i2c_start (); ask \u003d i2c_send_byte (add); if (! Ask) ask \u003d i2c_send_byte (data); i2c_stop (); return ask; ) Ця функція вже заточена чисто під дану мікросхему. В якості аргументів їй передаються байт для передачі в шину і адреса мікросхеми. Функція спочатку запросить мікросхему за адресою, а потім пошле байт. Якщо мікросхема отримала байт і відповіла ACK, то функція закінчить роботу з мікросхемою і поверне нуль як вдала посилка байта. А мікросхема в цей час виведе цей байт в свій паралельний порт. Інакше отримаємо NACK і повернемо одиницю, передача провалилася.
BYTE pcf8574_str_out (BYTE * data, BYTE col, BYTE add) (BYTE ask \u003d ACK; add & \u003d 0xFE; i2c_start (); ask \u003d i2c_send_byte (add); for (BYTE i \u003d 0; i Ця функція створена для експерименту. Приймає покажчик на масив однобайтових даних, кількість цих байт і адреса мікросхеми. Власне спроба передати все дані однією сесією, а не одним байтом за сесію. Функція працює, але так для ЖК дисплея і не підійшла. А тепер давайте повернемося до основної програми. Після підключення бібліотек, прописуємо адресу мікросхеми. Далі створюємо три функції по аналогії з lcd.h. Відмінність лише в принципі передачі даних.
void com (BYTE com) (com | \u003d 0x08; // Р3 в одиницю, щоб горіла підсвічування pcf8574_byte_out (com, ADD); // Висновок даних com | \u003d 0x04; // Е в одиницю pcf8574_byte_out (com, ADD); // Висновок даних com & \u003d 0xFB; // Е в нуль pcf8574_byte_out (com, ADD); // Висновок даних } Ця функція передає тільки команди дисплею. Звідси з'явилася перша рядок з логічним складанням команди з 0х08. Ця бяка потрібна через те що ми передаємо байт не пряма в порт РК дисплея, а через наш ретранслятор. Тобто якщо ми подали байт, а потім нам потрібно вивести тільки один біт, то звольте до попереднього байту присвоїть потрібний біт і вже його знову відправити в порт. Ось така заморочка. Додавання з 0х08 необхідно для постійного утримання одиниці на третьому розряді. Пам'ятайте про підсвічування? Ось саме це складання і включає підсвічування. Після викликаємо функцію передачі байта в шину. Про неї написано вище. Потім передаємо байт по шині в мікросхему. Далі слід виставити в одиницю Е, ніж власне займається роз'єднання байта з 0х04. Після обнулення Е. Таким чином можна послати будь-яку команду дисплею лише передавши в якості аргументу саму команду. void init (void) (_delay_ms (30); // Пауза після подачі живлення com (0x30); // Перехід в 4-х бітний режим _delay_us (40); // Затримка для виконання команди com (0x30); // Перехід в 4-х бітний режим _delay_us (40); // Затримка для виконання команди com (0x30); // Перехід в 4-х бітний режим _delay_us (40); // Затримка для виконання команди com (0x20); // Перехід в 4-х бітний режим _delay_us (40); // Затримка для виконання команди com (0x20); // Установка параметрів com (0x80); // Установка параметрів com (0x00); // Вимикаємо дисплей com (0x80); // Вимикаємо дисплей com (0x00); // Очищаємо дисплей com (0x10); // Очищаємо дисплей com (0x00); // Встановлюємо режим введення даних com (0x60); // Встановлюємо режим введення даних com (0x00); // Включаємо дисплей з обраним курсором com (0xC0); // Включаємо дисплей з обраним курсором } Ця функція займається лише инициализацией дисплея. Послідовність команд взята з даташіта на ЖК дисплей. void char_out (BYTE data) (BYTE data_h \u003d ((data & 0xF0) + 0x09); BYTE data_l \u003d ((data // Передача старших 4 біт data_h | \u003d 0x04; pcf8574_byte_out (data_h, ADD); // Передача старших 4 біт data_h & \u003d 0xF9; pcf8574_byte_out (data_h, ADD); // Передача старших 4 біт pcf8574_byte_out (data_l, ADD); // Передача молодших 4 біт data_l | \u003d 0x04; pcf8574_byte_out (data_l, ADD); // Передача молодших 4 біт data_l & \u003d 0xF9; pcf8574_byte_out (data_l, ADD); // Передача молодших 4 біт } Ця функція передає дані РК дисплею. Виконується так само як і команди за винятком того, що передача байта йде спочатку старшим напівбайтів, а потім молодшим. А решта теж саме. void str_out (BYTE * str) (while ((* str)! \u003d "\\ 0") (char_out (* str); str ++;)) Ну, а ця функція чисто для передачі рядка дисплею. Власне до нашої теми вона ніякого відношення не має.

Проект для AtmelStudio 6.2

Грамотний 01.08.15 17:11

Кома пропущена. Правильно: "ПРИВІТ, МИР!" І цей девайс заточений не тільки для HD44780. Підтягує резистори ставляться з боку майстра. Згідно зі специфікацією, запис даних в контролер LCD йде по спаду Е. Звідси перша ж функція спрощується: void com (BYTE com) (com | \u003d 0x08; // підсвічування pcf8574_byte_out (com | 0x04, ADD); // Вивід даних pcf8574_byte_out (com , ADD); // Е в нуль) та й інші теж істотно менше можуть бути. Наприклад, void char_out (BYTE data) буде всього з двох викликів, і вже тим більше без додаткових змінних. Ініціалізація LCD виконана з порушеннями специфікації таймингов.

Олексій 02.08.15 19:11

Через відсутність коми, дисплей не постраждає. Цей девайc якраз заточений саме під дисплеї з таким, іншу подібну контролером. А ось саме мікросхема дійсно простий розширювач порту. З приводу Е я згоден. Додаткові змінні потрібні. Якщо передати функції аргумент з виконанням деяких дій з логікою, можуть виникнути глюки. Уже з таким стикався. Ініціалізація виконується без порушень тайменгі. У документації сказано, що між командами ставиться пауза 40 мкс. Через те що передача йде по шині i2c, а та в свою чергу програмна і повільна, то періоди виконуються з лишком. Якщо все ж Вам не лінь, то напишіть свій варіант і надішліть мені. Я його опублікую. Зрештою даний сайт призначений на любительську аудиторію і кожен хто хоче може висловити свою думку і бачення на життя МК.

Олексій 06.08.15 9:14

Додані тайменгі при ініціалізації дисплея за зауваженням шановного "Грамотного"

Дмитро 14.06.16 21:57

Привіт Алексей.Можно в генератор коду додати бібліотеку для роботи з PCF8574.

Олексій 14.06.16 22:32

Я подумаю.))

ruslan 21.12.16 19:54
Олексій 21.12.16 21:53

О так. Особливо код на Асмі. Ардуінщікі оцінять по повній)))

Пи.си.
Навіть якщо не дивитися на АСМ, то там прога написана під PIC контролер. Для AVRщіков це "дуже" корисна інформація? особливо початківцям))) Я нічого не маю проти PIC, але навіть АСМ у PIC і AVR різний. А з приводу подробиць роботи ЖК дисплея, то можна глянути))) Правда я її ще писав під CVAVR але все команди розібрані і розкладені по поличках. Але в будь-якому випадку вирішуйте самі де зрозуміліше написано))) Автор пише, читач вибирає.

GeK 04.01.17 12:52

"I2C адреса мікросхеми (за замовчуванням він дорівнює 0x4E"

Старші 4 біта адреси фіксовані,
префікс У PCF8574 дорівнює 0100, а у PCF8574A - 0111
Молодші 3 біта залежать від стану входів мікросхеми A2-A0. За замовчуванням всі 3 перемички розімкнені, відповідно адресу мікросхеми приймає значення 0111111.
// A2 A1 A0 PCF8574 PCF8574A
// 1 1 + 1 0x20 0x38
// 1 1 0 0x21 0x39
// 1 0 1 0x22 0x3A
// 1 0 0 0x23 0x3B
// 0 1 + 1 0x24 0x3C
// 0 1 0 0x25 0x3D
// 0 0 1 0x26 0x3E
// 0 0 0 0x27 0x3F

Олексій 04.01.17 14:27

Щось ви переплутали.
Виписка з документації на мікросхему

0b01001110 це 0x4E
Так що тут все вірно. А якщо потрібно змінити адресу, то всього лише потрібно його поміняти в дефайне.

Юрій 14.12.17 21:26

Доброго вам дня! А можна ще код функції lcdgotoxy і lcdclear для роботи з перехідником на PCF8574.

Олександр 20.05.18 18:14

Доброго вам дня! як ви виводите російський текст.

Олексій 20.05.18 23:04

Це вітчизняний дисплей від фірми МЕЛТ. У нього в пам'яті зашита кирилиця.

Олександр 21.05.18 4:55

Доброго вам дня! Я пиши як у вас в Проект для AtmelStudio 6.2 "YOPҐBET MҐP!" то виводить нормально
а якщо пиши "ПРИВІТ СВІТ!" виводить нісенітницю всяку. у мене два
варіанти дисплеїв у одного зашита кирилиця. другий китайський.

Олексій 21.05.18 9:22

Я б для початку написав би тестових програм. Перебір всієї пам'яті з виведенням на дисплей символів і їх адрес. А потім вже виеснять в чому проблема. Швидше за все таблиця символів не збігається з таблицею ascii.

Андрій 03.09.18 8:32

Доброго дня!

А схемку під Proteus не можете підкинути?

Андрій 03.09.18 10:22

Або в Proteuse ніхто не перевіряв?

Андрій 03.09.18 10:56

розібрався main_init

Павло 30.05.19 23:35

Цікава річ, адреса дисплея 0х4Е, а якщо той же дисплей підключити до ардуінке то адреса 0х27

Павло 31.05.19 11:04

Спасибі величезне за Вашу роботу! Перерив весь інтернет, жоден з наведених прикладів крім Вашого не запрацював. Єдине, в архіві проекту в функції ініціалізації дисплея не прописані затримки _delay_, і він відповідно не працює

Олексій 01.06.19 9:52

Ну це більше демонстраційний проект. По хорошому треба бібліотеку axlib переписувати, але з урахуванням того що STM32 і STM8 рухається семимильними кроками, сенсу в AVR вже немає взагалі.

Павло 05.06.19 12:57

У STM немає DIP корпусів, складніше робити друковані плати. Для моїх проектів можливостей AVR вистачає із запасом, на одній Atmega 8 дуже багато можна умістити

Олексій 05.06.19 15:20

Так, але скільки коштує Atmega8 і stm8s003)))

Дмитро 07.06.19 00:41

Здрастуй, Олексій.
Підкажи, будь ласка, як потрібно читати з pcf8574 стан порту?
Хочу зробити зовнішній блок, 8 GPIO по шині i2c - самє воно.

Дмитро 07.06.19 17:56

Сам собі відповім
Функція повертає байт - стан портів мікросхеми
uint8_t pcf8574_byte_rcv (uint8_t addr)
{
uint8_t ask \u003d ACK;
addr | \u003d 0b01; // READ
uint8_t data \u003d 0;
i2c_start ();
ask \u003d i2c_send_byte (addr);
if (! ask) data \u003d i2c_read_byte (NACK);
i2c_stop ();

Return data;
}

Павло 07.06.19 20:37

Скільки коштує, 150 рублів, за ціною релюшки в загальному), а як ви розводите плати під STM? Лут ненадійний, ЧПУ фрезер не впевнений що візьме (не пробував)

  • Модуль FC-113 зроблений на базі мікросхеми PCF8574T, яка представляє собою 8-бітний зсувний регістр - «розширювач» входів-виходів для послідовної шини I2C. На малюнку мікросхема позначена DD1.
  • R1 - підлаштування резистор для регулювання контрастності РК дисплея.
  • Джампер J1 використовується для включення підсвічування дисплея.
  • Висновки 1 ... 16 служать для підключення модуля до висновків LCD дисплея.
  • Контактні майданчики А1 ... А3 потрібні для зміни адреси I2C пристрою. Запаюючи відповідні перемички, можна змінювати адресу пристрою. У таблиці наведено відповідність адрес і перемичок: "0" відповідає розриву ланцюга, "1" - встановленої перемичці. За замовчуванням всі 3 перемички розімкнені і адреса пристрою 0x27.

2 Схема підключення ЖК дисплея до Arduinoпо протоколу I2C

Підключення модуля до Arduino здійснюється стандартно для шини I2C: висновок SDA модуля підключається до аналогового порту A4, висновок SCL - до аналогового порту A5 Ардуіно. Харчування модуля здійснюється напругою +5 В від Arduino. Сам модуль з'єднується висновками 1 ... 16 з відповідними висновками 1 ... 16 на ЖК дисплеї.


3 Бібліотека для роботипо протоколу I2C

Тепер потрібна бібліотека для роботи з LCD по інтерфейсу I2C. Можна скористатися, наприклад, ось цієї (посилання в рядку "Download Sample code and library").

скачаний архів LiquidCrystal_I2Cv1-1.rar разархивируем в папку \\ Libraries \\, Яка знаходиться в директорії Arduino IDE.

Бібліотека підтримує набір стандартних функцій для LCD екранів:

функціяпризначення
LiquidCrystal () створює змінну типу LiquidCrystal і приймає параметри підключення дисплея (номера висновків);
begin () ініціалізація LCD дисплея, завдання параметрів (кількість рядків і символів);
clear () очистка екрану і повернення курсору в початкову позицію;
home () повернення курсору в початкову позицію;
setCursor () установка курсору на задану позицію;
write () виводить символ на РК екран;
print () виводить текст на ЖК екран;
cursor () показує курсор, тобто підкреслення під місцем наступного символу;
noCursor () ховає курсор;
blink () миготіння курсору;
noBlink () скасування миготіння;
noDisplay () вимикання дисплея зі збереженням всієї інформації, що відображається;
display () включення дисплея зі збереженням всієї інформації, що відображається;
scrollDisplayLeft () прокрутка вмісту дисплея на 1 позицію вліво;
scrollDisplayRight () прокрутка вмісту дисплея на 1 позицію вправо;
autoscroll () включення автопрокрутки;
noAutoscroll () вимикання автопрокрутки;
leftToRight () задає напрямок тексту зліва направо;
rightToLeft () напрямок тексту справа наліво;
createChar () створює для користувача символ для LCD-екрану.

4 Скетч для виведення текстуна LCD екран по шині I2C

Відкриємо зразок: Файл Зразки LiquidCrystal_I2C CustomChars і трохи його переробимо. Виведемо повідомлення, в кінці якого буде знаходитися миготливий символ. У коментарях до коду прокоментовані всі нюанси скетчу.

#include // підключаємо бібліотеку Wire #include // підключаємо бібліотеку РКІ #define printByte (args) write (args); // uint8_t heart \u003d (0x0,0xa, 0x1f, 0x1f, 0xe, 0x4,0x0); // бітова маска символу «серце» LiquidCrystal_I2C lcd (0x27, 16, 2); // Задаємо адресу 0x27 для LCD дисплея 16x2 void setup () ( lcd.init (); // ініціалізація ЖК дисплея lcd.backlight (); // включення підсвічування дисплея lcd.createChar (3, heart); // створюємо символ «серце» в 3 осередку пам'яті lcd.home (); // ставимо курсор в лівий верхній кут, в позицію (0,0) lcd.! "); // друкуємо рядок тексту lcd.setCursor (0, 1); // переклад курсору на рядок 2, символ 1 lcd.print ( "i"); // друкуємо повідомлення на рядку 2 lcd.printByte (3); // друкуємо символ «серце», що знаходиться в 3-ій осередку lcd.print ( "Arduino"); } void loop () ( // миготіння останнього символу lcd.setCursor (13, 1); // переклад курсору на рядок 2, символ 1 lcd.print ( "\\ t"); delay (500); lcd.setCursor (13, 1); // переклад курсору на рядок 2, символ 1 lcd.print ( ""); delay (500); }

До речі, символи, записані командою lcd.createChar ();, Залишаються в пам'яті дисплея навіть після вимкнення живлення, тому що записуються в ПЗУ дисплея +1602.

5 Створення власних символівдля ЖК дисплея

Трохи докладніше розглянемо питання створення власних символів для ЖК екранів. Кожен символ на екрані складається з 35-ти точок: 5 в ширину і 7 у висоту (+1 резервна рядок для підкреслення). У рядку 6 наведеного скетчу ми задаємо масив з 7-ми чисел: (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0). Перетворимо 16-ковий числа в бінарні: {00000, 01010, 11111, 11111, 01110, 00100, 00000} . Ці числа - не що інше, як бітові маски для кожної з 7-ми рядків символу, де "0" позначають світлу точку, а "1" - темну. Наприклад, символ серця, заданий у вигляді бітової маски, буде виглядати на екрані так, як показано на малюнку.

6 Управління ЖК екраномпо шині I2C

Завантажимо скетч в Arduino. На екрані з'явиться задана нами напис з миготливим курсором в кінці.


7 Що знаходиться «за»шиною I2C

Як бонус розглянемо тимчасову діаграму виведення латинських символів "A", "B" і "С" на РК дисплей. Ці символи є в ПЗУ дисплея і виводяться на екран просто передачею дисплею їх адреси. Діаграма знята з висновків RS, RW, E, D4, D5, D6 і D7 дисплея, тобто вже після перетворювача FC-113 «I2C паралельна шина». Можна сказати, що ми занурюємося трохи «глибше» в «залізо».


Тимчасова діаграма виведення латинських символів "A", "B" і "С" на LCD дисплей 1 602

На діаграмі видно, що символи, які є в ПЗУ дисплея (див. Стор.11 даташіта, посилання нижче), передаються двома напівбайтами, перший з яких визначає номер стовпця таблиці, а другий - номер рядка. При цьому дані «замикаються» по фронту сигналу на лінії E (Enable), а лінія RS (Register select, вибір регістру) знаходиться в стані логічної одиниці, що означає передачу даних. Низький стан лінії RS означає передачу інструкцій, що ми і бачимо перед передачею кожного символу. В даному випадку передається код інструкції повернення каретки на позицію (0, 0) ЖК дисплея, про що також можна дізнатися, вивчивши технічний опис дисплея.

І ще один приклад. На цій тимчасовій діаграмі показаний висновок символу «Серце» на РК дисплей.


Знову, перші два імпульсу Enable відповідають інструкції Home () (0000 0010 2) - повернення каретки на позицію (0; 0), а другі два - висновок на ЖК дисплей зберігається в комірці пам'яті 3 10 (0000 0011 2) символ «Серце» (інструкція lcd.createChar (3, heart); скетчу).

LCD дисплей - частий гість в проектах Ардуіно. Але в складних схемах у нас може виникнути проблема нестачі портів Arduino через необхідність підключити екран, у якого дуже дуже багато контактів. Виходом у цій ситуації може стати I2C / IIC перехідник, який підключає практично стандартний для Arduino екран 1602 до платам Uno, Nano або Mega всього лише за допомогою 4 пинов. У цій статті ми подивимося, як можна підключити LCD екран з інтерфейсом I2C, які можна використовувати бібліотеки, напишемо короткий скетч-приклад і розберемо типові помилки.

Рідкокристалічний дисплей (Liquid Crystal Display) LCD 1602 є хорошим вибором для виведення рядків символів в різних проектах. Він коштує недорого, є різні модифікації з різними кольорами підсвічування, ви можете легко завантажити готові бібліотеки для скетчів Ардуіно. Але найголовнішим недоліком цього екрану є той факт, що дисплей має 16 цифрових висновків, з яких обов'язковими є мінімум 6. Тому використання цього LCD екрана без i2c додає серйозні обмеження для плат Arduino Uno або Nano. Якщо контактів не вистачає, то вам доведеться купувати плату Arduino Mega або ж заощадити контакти, в тому числі за рахунок підключення дисплея через i2c.

Короткий опис пинов LCD 1602

Давайте подивимося на висновки LCD1602 уважніше:

Кожен з висновків має своє призначення:

  1. Земля GND;
  2. Харчування 5 В;
  3. Установка контрастності монітора;
  4. Команда, дані;
  5. Записування та читання даних;
  6. Enable;

7-14. Лінії даних;

  1. Плюс підсвічування;
  2. Мінус підсвічування.

Технічні характеристики дисплея:

  • Символьний тип відображення, є можливість завантаження символів;
  • Світлодіодна підсвітка;
  • Контролер HD44780;
  • Напруга живлення 5В;
  • Формат 16х2 символів;
  • Діапазон робочих температур від -20С до + 70С, діапазон температур зберігання від-30С до +80 С;
  • Кут огляду 180 градусів.

Схема підключення LCD до плати Ардуіно без i2C

Стандартна схема приєднання монітора безпосередньо до мікроконтролера Ардуіно без I2C виглядає наступним чином.

Через велику кількість підключаються контактів може не вистачити місця для приєднання потрібних елементів. Використання I2C зменшує кількість проводів до 4, а зайнятих пинов до 2.

Де купити LCD екрани і Шілд для Ардуіно

LCD екран 1602 (і варіант 2004) досить популярний, тому ви без проблем зможете знайти його як в вітчизняних інтернет-магазинах, так і на зарубіжних майданчиках. Наведемо кілька посилань на найбільш доступні варіанти:

Модуль LCD1602 + I2C з синім екраном, сумісний з Arduino Простий дисплей LCD1602 (зелене підсвічування) дешевше 80 рублів Великий екран LCD2004 з I2C HD44780 для Ардуіно (синя і зелена підсвітка)
Дисплей 1602 з IIC адаптером і синім підсвічуванням Ще один варіант LCD1602 зі впаяним I2C модулем Модуль адаптера Port IIC / I2C / TWI / SPI для екрану 1602, сумісний з Ардуіно
Дисплей з RGB-підсвічуванням! LCD 16 × 2 + keypad + Buzzer Shield for Arduino Шілд для Ардуіно з кнопками і екраном LCD1602 LCD 1602 LCD дисплей для 3D принтера (Smart Controller for RAMPS 1.4, Text LCD 20 × 4), модулем кардридера SD і MicroSD-

Опис протоколу I2C

Перш ніж обговорювати підключення дисплея до Ардуіно через i2c-перехідник, давайте коротко поговоримо про самому протоколі i2C.

I2C / IIC(Inter-Integrated Circuit) - це протокол, що спочатку створювався для зв'язку інтегральних мікросхем всередині електронного пристрою. Розробка належить фірмі Philips. В основі i2c протоколу є використання 8-бітної шини, яка потрібна для зв'язку блоків в керуючої електроніці, і системі адресації, завдяки якій можна спілкуватися по одним і тим же дротах з декількома пристроями. Ми просто передаємо дані то одного, то іншого пристрою, додаючи до пакетів даних ідентифікатор потрібного елемента.

Найпростіша схема I2C може містити одне провідне пристрій (найчастіше це мікроконтролер Ардуіно) і кілька ведених (наприклад, дисплей LCD). Кожен пристрій має адресу в діапазоні від 7 до 127. Двох пристроїв з однаковою адресою в одній схемі бути не повинно.

Плата Arduino підтримує i2c на апаратному рівні. Ви можете використовувати Піни A4 і A5 для підключення пристроїв з даного протоколу.

В роботі I2C можна виділити кілька переваг:

  • Для роботи потрібно всього 2 лінії - SDA (лінія даних) і SCL (лінія синхронізації).
  • Підключення великої кількості провідних приладів.
  • Зменшення часу розробки.
  • Для управління всім набором пристроїв потрібно тільки один мікроконтролер.
  • Можливе число підключаються мікросхем до однієї шині обмежується тільки граничної ємністю.
  • Високий ступінь збереження даних через спеціального фільтра переважної сплески, вбудованого в схеми.
  • Проста процедура діагностики виникають збоїв, швидка налагодження несправностей.
  • Шина вже інтегрована в саму Arduino, тому не потрібно розробляти додатково шинний інтерфейс.

недоліки:

  • Існує ємнісне обмеження на лінії - 400 пФ.
  • Важке програмування контролера I2C, якщо на шині є кілька різних пристроїв.
  • При великій кількості пристроїв виникає труднощі локалізації збою, якщо одне з них помилково встановлює стан низького рівня.

Модуль i2c для LCD 1602 Arduino

Найшвидший і зручний спосіб використання i2c дисплея в Ардуіно - це покупка готового екрану з вбудованою підтримкою протоколу. Але таких екранів не дуже багато істо вони не дешево. А ось різноманітних стандартних екранів випущено вже величезна кількість. Тому найдоступнішим і популярним сьогодні варіантом є покупка і використання окремого I2C модуля - перехідника, який виглядає ось так:

З одного боку модуля ми бачимо висновки i2c - земля, харчування і 2 для передачі даних. З іншого перехідника бачимо роз'єми зовнішнього живлення. І, природно, на платі є безліч ніжок, за допомогою яких модуль припаивается до стандартних висновків екрану.


Для підключення до плати Ардуіно використовуються i2c виходи. Якщо потрібно, підключаємо до зовнішнього джерела живлення для підсвітки. За допомогою вбудованого підлаштування резистора ми можемо налаштувати установлювані значення контрастності J

На ринку можна зустріти LCD 1602 модулі з уже припаяними перехідниками, їх використання максимально упощено. Якщо ви купили окремий перехідник, потрібно буде попередньо припаяти його до модуля.

Підключення ЖК екрану до Ардуіно по I2C

Для підключення необхідні сама плата Ардуіно, дисплей, макетна плата, з'єднувальні дроти і потенціометр.

Якщо ви використовуєте спеціальний окремий i2c перехідник, то потрібно спочатку припаяти його до модуля екрану. Помилитися там важко, можете керуватися такою схемою.


Рідкокристалічний монітор з підтримкою i2c підключається до плати за допомогою чотирьох проводів - два дроти для даних, два дроти для живлення.

  • Висновок GND підключається до GND на платі.
  • Висновок VCC - на 5V.
  • SCL підключається до піну A5.
  • SDA підключається до піну A.

І це все! Ніяких павутини проводів, в яких дуже легко заплутатися. При цьому всю складність реалізації i2C протоколу ми можемо просто довірити бібліотекам.

Бібліотеки для роботи з i2c LCD дисплеєм

Для взаємодія Arduino c LCD 1 602 по шині I2C вам будуть потрібні як мінімум дві бібліотеки:

  • Бібліотека Wire.h для роботи з I2C вже є в стандартній програмі Arduino IDE.
  • Бібліотека LiquidCrystal_I2C.h, яка включає в себе велику різноманітність команд для управління монітором по шині I2C і дозволяє зробити скетч простіше і коротше. Потрібно додатково встановити бібліотеку Після підключення дисплея потрібно додатково встановити бібліотеку LiquidCrystal_I2C.h

Після підключення до скетчу всіх необхідних бібліотек ми створюємо об'єкт і можемо використовувати всі його функції. Для тестування давайте завантажимо наступний стандартний скетч з прикладу.

#include #include // Підключення бібліотеки // # include // Підключення альтернативної бібліотеки LiquidCrystal_I2C lcd (0x27,16,2); // Вказуємо I2C адреса (найбільш поширене значення), а також параметри екрану (в разі LCD 1602 - 2 рядки по 16 символів в кожній // LiquidCrystal_PCF8574 lcd (0x27); // Варіант для бібліотеки PCF8574 void setup () (lcd.init (); // Ініціалізація дисплея lcd.backlight (); // Підключення підсвічування lcd.setCursor (0,0); // Установка курсора в початок першого рядка lcd.print ( "Hello"); // Набір тексту на першому рядку lcd.setCursor (0,1); // Установка курсора в початок другого рядка lcd.print ( "ArduinoMaster"); // Набір тексту на другому рядку) void loop () ()

Опис функцій і методів бібліотеки LiquidCrystal_I2C:

  • home () і clear () - перша функція дозволяє повернути курсор в початок екрана, друга теж, але при цьому видаляє все, що було на моніторі до цього.
  • write (ch) - дозволяє вивести одиночний символ ch на екран.
  • cursor () і noCursor () - показує / приховує курсор на екрані.
  • blink () і noBlink () - курсор блимає / не блимає (якщо до цього було включено його відображення).
  • display () і noDisplay () - дозволяє підключити / відключити дисплей.
  • scrollDisplayLeft () і scrollDisplayRight () - прокручує екран на один знак вліво / вправо.
  • autoscroll () і noAutoscroll () - дозволяє включити / вимкнути режим автопрокручіванія. У цьому режимі кожен новий символ записується в одному і тому ж місці, витісняючи раніше написане на екрані.
  • leftToRight () і rightToLeft () - Установка напрямок виведеного тексту - зліва направо або справа наліво.
  • createChar (ch, bitmap) - створює символ з кодом ch (0 - 7), використовуючи масив бітових масок bitmap для створення чорних і білих точок.

Альтернативна бібліотека для роботи з i2c дисплеєм

У деяких випадках при використанні зазначеної бібліотеки з пристроями, оснащеними контролерами PCF8574 можуть виникати помилки. У цьому випадку в якості альтернативи можна запропонувати бібліотеку LiquidCrystal_PCF8574.h. Вона розширює LiquidCrystal_I2C, тому проблем з її використанням бути не повинно.

Проблеми зі з'єднанням i2c lcd дисплея

Якщо після завантаження скетчу у вас не з'явилося жодної написи на дисплеї, спробуйте виконати наступні дії.

По-перше, можна збільшити або зменшити контрастність монітора. Часто символи просто не видно через режим контрастності і підсвічування.

Якщо це не допомогло, то перевірте, чи правильно підключено контактів, чи підключено живлення підсвічування. Якщо ви використовували окремий i2c перехідник, то перевірте ще раз якість пайки контактів.

Інший часто зустрічається причиною відсутності тексту на екрані може стати неправильний i2c адресу. Спробуйте спершу поміняти в скетчі адресу пристрою з 0x27 0x20 або на 0x3F. У різних виробників можуть бути зашиті різні адреси за замовчуванням. Якщо і це не допомогло, можете запустити скетч i2c сканера, який переглядає всі підключені пристрої і визначає їхню адресу методом перебору. Приклад скетчу i2c сканера.

Якщо екран все ще залишиться неробочим, спробуйте отпаять перехідник і підключити LCD звичайним чином.

висновок

У цій статті ми розглянули основні питання використання LCD екрана в складних проектах Ардуіно, коли нам потрібно економити вільні Піни на платі. Простий і недорогий перехідник i2c дозволить підключити LCD екран 1602, займаючи всього 2 аналогових Піна. У багатьох ситуаціях це може бути дуже важливим. Плата за зручність - необхідність у використанні додаткового модуля - конвертера і бібліотеки. На наш погляд, зовсім не висока ціна за зручність і ми вкрай рекомендуємо використовувати цю можливість в проектах.