У цій статті розповім, як використовувати інтерфейсний модуль I2C для керування LCD дисплеєм (2×16/20х4) за допомогою Arduino. Даний модуль дозволяє зменшити кількість використовуваних висновків контролера, замість 8 або 4-бітного з'єднання, потрібно лише 2 виводи (SDA та SCL).

Технічні характеристики

Підтримка дисплеїв: LCD 16×02/20×04
Додатково: регулювання контрастності
Напруга живлення. 5В
Інтерфейс: I2C
Габарити: 54мм x 19мм x 15мм

Загальні відомості інтерфейсного модуля I2C

Оскільки кількість контактів на контролерах Arduino обмежена і часто при використанні різних датчиків і модулів вони закінчуються, виникає потреба в їх економії, для цих випадків розроблений цей модуль, за його допомогою можна реалізувати передачу по двох контактах (SDA і SCL).

Тепер трохи про сам модуль, побудований він на мікросхемі PCF8574T. Резистори R8 (4.7ком) і R9 (4.7ком) необхідні для підтяжки ліній SDA і SCL, в ідеалі при підключенні двох і більше пристроїв по шині I2C необхідно використовувати підтяжку тільки на одному пристрої, пізніше напишу чому. На платі передбачені три перемички (за схемою видно, що лінії A0, A1, A2 підтягнуті до живлення через резистори R4, R5, R6), необхідні вони для зміни адресації пристрою, всього їх 8 варіантів. Зміна адресації дає можливість підключення до восьми пристроїв по шині IC2 з мікросхемою PCF8574T, варіанти адрес показані малюнку (за замовчуванням адресу пристрою 0x27). Також модуль оснащений потенціометром R11 з його допомогою можна змінити контрастність LCD дисплея.

Для з'єднання на модулі розташовано три групи контактів:

Перша група:
SCL: лінія тактування (Serial CLock)
SDA: лінія даних (Serial Dфta)
VCC: "+" харчування
GND: "-" харчування

Друга група:
VSS: "-" харчування
VDD: "+" харчування
VO: Виведення керування контрастом
RS: Вибір регістру
RW: Читання/запис (режим запису при з'єднанні із землею)
E: Еnable (строб зі спаду)
DB0-DB3: Молодші біти інтерфейсу
DB4-DB7: Старші біти інтерфейсу
A: «+» живлення підсвічування
K: «-» живлення підсвічування

Третя група: (за замовчуванням встановлено перемичку)
VCC:
A від LCD:

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

Необхідні деталі:
Arduino UNO R3 х 1 шт.
LCD-дисплей 1602A (2×16, 5V, Синій) x 1 шт.
Інтерфейсний модуль I2C, IIC, TWI для LCD x 1 шт.
Провід DuPont, 2,54 мм, 20 см, F-M (Female - Male) x 1 шт.
Кабель USB 2.0 A-B х 1 шт.

Підключення:
Насамперед припаюємо модуль I2C до LCD дисплея, потім необхідно підключити дисплей до Arduino UNO. Для цього скористаємося проводками DuPont, підключення здійснюємо за таблицею нижче.

Для наочності наведу ще одну схему.

Для цього експерименту необхідно завантажити та встановити бібліотеку «LiquidCrystal_I2C». Потім скопіюйте та вставте цей приклад коду у вікно програми IDE Arduino та завантажте у контролер.

/* Тестувалося на Arduino IDE 1.6.11 Дата тестування 15.09.2016р. */ #include #include LiquidCrystal_I2C lcd(0x27,16,2); // Задаємо адресу та розмір дисплея void setup() ( lcd.init(); // Ініціалізація lcd lcd.backlight(); // Включаємо підсвічування lcd.setCursor(0,0); // Встановлюємо курсор на початок 1 рядка lcd .print("Hello, world"); // Виводимо текст lcd.setCursor(0,1); // Встановлюємо курсор на початок 2 рядка lcd.print("www.сайт"); // Виводимо текст) void loop( ) ( )

Якщо Ви правильно все зробили, але на дисплеї немає жодних символів, спробуйте збільшити контрастність потенціометром.


Посилання
Завантажити бібліотеку
Документація на мікросхему
Документація до

Купити на Aliexpress

Мабуть один із найпопулярніших екранів на ринку. Зібраний на популярному контролері 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 () ( )

Придбав я тут від гарного магазину Чіп Резістор черговий девайс для вивчення та застосування у корисних пристроях. Цей девайс виявився заточений для керування ЖК-дисплеєм під керуванням контролера HD44780, в 4-бітному режимі. Для цієї мети на платі встановлена ​​мікросхема , яка є перетворювачем шини 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 | = 0x04; // Е в одиницю pcf8574_byte_out(com, ADD); // Виведення даних com &= 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 = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Передача старших 4 біт data_h |= 0x04; pcf8574_byte_out(data_h, ADD)); // Передача старших 4 біт // Передача старших 4 біт // Передача молодших 4 біт // Передача молодших 4 біт // Передача молодших 4 біт) void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) int main(void) ( init(); str_out("ЁPҐBET MҐP!" );while(1) ( ) )Власне, що тут відбувається. Спочатку підключаємо бібліотеки для I2C та PCF8574. Про I2C я писав вже, тому розпинатися ще раз на буду, а ось що в PCF8574.h я розповім. До складу бібліотеки увійшли лише три функції.
BYTE pcf8574_test(BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); i2c_stop(); return ask; )Першу функцію було написано для перевірки наявності пристрою на шині. В принципі її можна застосовувати для пошуку будь-якого пристрою, що знаходиться на шині. Функція приймає адресу пристрою і якщо він відповідає, то повертає нуль. Якщо пристрій з такою адресою немає на шині, поверне одиницю.
BYTE pcf8574_byte_out(BYTE data, BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); if(!ask) ask = i2c_send_byte(data); )Ця функція вже заточена виключно під цю мікросхему. Як аргументи їй передаються байт для передачі в шину та адресу мікросхеми. Функція спочатку запросить мікросхему за адресою, а потім надішле байт. Якщо мікросхема отримала байт і відповіла ACK, то функція закінчить роботу з мікросхемою і поверне нуль, як вдала посилка байта. А мікросхема тим часом виведе цей байт у свій паралельний порт. Інакше отримаємо NACK та повернемо одиницю, передача провалилася.
BYTE pcf8574_str_out(BYTE *data, BYTE col, BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); for(BYTE i=0; i Ця функція призначена для експерименту. Приймає покажчик на масив однобайтових даних, кількість цих байт та адресу мікросхеми. Власне, спроба передати всі дані однією сесією, а не одним байтом за сесію. Функція працює, але так для РК-дисплея і не підійшла. А тепер повернімося до основної програми. Після підключення бібліотек прописуємо адресу мікросхеми. Далі створюємо три функції за аналогією з lcd.h. Відмінність лише у принципі передачі.
void com (BYTE com) (com | = 0x08; // Р3 на одиницю, щоб горіло підсвічування pcf8574_byte_out(com, ADD); // Виведення даних com | = 0x04; // Е в одиницю pcf8574_byte_out(com, ADD); // Виведення даних com &= 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 = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Передача старших 4 біт data_h |= 0x04; pcf8574_byte_out(data_h, ADD)); // Передача старших 4 біт data_h &= 0xF9; pcf8574_byte_out(data_h, ADD); // Передача старших 4 біт pcf8574_byte_out(data_l, ADD); // Передача молодших 4 біт data_l | = 0x04; pcf8574_byte_out(data_l, ADD); // Передача молодших 4 біт data_l &= 0xF9; pcf8574_byte_out(data_l, ADD); // Передача молодших 4 біт } Ця функція передає дані РК дисплею. Виконується так само, як і команди за винятком того, що передача байта йде спочатку старшим напівбайтом, а потім молодшим. А решта теж саме. void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) )Ну а ця функція чисто для передачі рядка дисплею. Власне до нашої теми вона жодного стосунку не має.

Проект для AtmelStudio 6.2 

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

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

Олексій 02.08.15 19:11

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

Олексій 06.08.15 09: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 04:55

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

Олексій 21.05.18 09:22

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

Андрій 03.09.18 08: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 09: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 = ACK;
addr | = 0b01; //READ
uint8_t data=0;
i2c_start();
ask = i2c_send_byte(addr);
if(!ask) data = i2c_read_byte(NACK);
i2c_stop();

Return data;
}

Павло 07.06.19 20:37

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

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 1602 по шині 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 аналогові піни. У багатьох ситуаціях це може бути дуже важливим. Плата за зручність – необхідність використання додаткового модуля – конвертера та бібліотеки. На наш погляд, зовсім не висока ціна за зручність і ми рекомендуємо використовувати цю можливість у проектах.

У цій статті розповім, як використовувати інтерфейсний модуль I2C для керування LCD дисплеєм (2×16/20х4) за допомогою Arduino. Даний модуль дозволяє зменшити кількість використовуваних висновків контролера, замість 8 або 4-бітного з'єднання, потрібно лише 2 виводи (SDA та SCL).

Технічні характеристики

Підтримка дисплеїв: LCD 16×02/20×04
Додатково: регулювання контрастності
Напруга живлення. 5В
Інтерфейс: I2C
Габарити: 54мм x 19мм x 15мм

Загальні відомості інтерфейсного модуля I2C

Оскільки кількість контактів на контролерах Arduino обмежена і часто при використанні різних датчиків і модулів вони закінчуються, виникає потреба в їх економії, для цих випадків розроблений цей модуль, за його допомогою можна реалізувати передачу по двох контактах (SDA і SCL).

Тепер трохи про сам модуль, побудований він на мікросхемі PCF8574T. Резистори R8 (4.7ком) і R9 (4.7ком) необхідні для підтяжки ліній SDA і SCL, в ідеалі при підключенні двох і більше пристроїв по шині I2C необхідно використовувати підтяжку тільки на одному пристрої, пізніше напишу чому. На платі передбачені три перемички (за схемою видно, що лінії A0, A1, A2 підтягнуті до живлення через резистори R4, R5, R6), необхідні вони для зміни адресації пристрою, всього їх 8 варіантів. Зміна адресації дає можливість підключення до восьми пристроїв по шині IC2 з мікросхемою PCF8574T, варіанти адрес показані малюнку (за замовчуванням адресу пристрою 0x27). Також модуль оснащений потенціометром R11 з його допомогою можна змінити контрастність LCD дисплея.

Для з'єднання на модулі розташовано три групи контактів:

Перша група:
SCL: лінія тактування (Serial CLock)
SDA: лінія даних (Serial Dфta)
VCC: "+" харчування
GND: "-" харчування

Друга група:
VSS: "-" харчування
VDD: "+" харчування
VO: Виведення керування контрастом
RS: Вибір регістру
RW: Читання/запис (режим запису при з'єднанні із землею)
E: Еnable (строб зі спаду)
DB0-DB3: Молодші біти інтерфейсу
DB4-DB7: Старші біти інтерфейсу
A: «+» живлення підсвічування
K: «-» живлення підсвічування

Третя група: (за замовчуванням встановлено перемичку)
VCC:
A від LCD:

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

Необхідні деталі:
Arduino UNO R3 х 1 шт.
LCD-дисплей 1602A (2×16, 5V, Синій) x 1 шт.
Інтерфейсний модуль I2C, IIC, TWI для LCD x 1 шт.
Провід DuPont, 2,54 мм, 20 см, F-M (Female - Male) x 1 шт.
Кабель USB 2.0 A-B х 1 шт.

Підключення:
Насамперед припаюємо модуль I2C до LCD дисплея, потім необхідно підключити дисплей до Arduino UNO. Для цього скористаємося проводками DuPont, підключення здійснюємо за таблицею нижче.

Для наочності наведу ще одну схему.

Для цього експерименту необхідно завантажити та встановити бібліотеку «LiquidCrystal_I2C». Потім скопіюйте та вставте цей приклад коду у вікно програми IDE Arduino та завантажте у контролер.

/* Тестувалося на Arduino IDE 1.6.11 Дата тестування 15.09.2016р. */ #include #include LiquidCrystal_I2C lcd(0x27,16,2); // Задаємо адресу та розмір дисплея void setup() ( lcd.init(); // Ініціалізація lcd lcd.backlight(); // Включаємо підсвічування lcd.setCursor(0,0); // Встановлюємо курсор на початок 1 рядка lcd .print("Hello, world"); // Виводимо текст lcd.setCursor(0,1); // Встановлюємо курсор на початок 2 рядка lcd.print("www.robotchip.ru"); // Виводимо текст) void loop() ( )

Завантажити програму

Якщо Ви правильно все зробили, але на дисплеї немає жодних символів, спробуйте збільшити контрастність потенціометром.


Посилання
Завантажити бібліотеку LiquidCrystal_I2C
Документація на мікросхему PCF8574T
Документація до LCD1602A

Купити на Aliexpress