Підключення рідкокристалічного дисплея до arduino, електронні печеньки
При створенні власного пристрою не рідко виникає необхідність оперативного виводу різноманітної інформації. Наприклад, якщо ви створюєте контролер розумного будинку, то розумно оснастити прилад пристроєм виведення, що дозволяє швидко дізнатися поточний стан систем. Кращим рішенням є рідкокристалічний дисплей. Енергоспоживання при відключеною підсвічуванні мінімально а робота з дисплеєм гранично проста і не вимагає сильного втручання в код програми. Фактично, висновок інформації на РК дисплей мало чим відрізняється від виведення в серійний порт. У статті розглянуто підключення знакогенерірующего дисплея на базі популярного чіпа HD44780 до контролера Arduino.
Для розуміння деяких нюансів корисно знати як працює знакогенерірующій дисплей. Особливістю роботи цього типу дисплея є наявність свого контролера з власною пам'яттю. DDRAM - пам'ять дисплея. Для виведення символу на екран необхідно завантажити символ в комірку пам'яті, а потім передати команду на відображення осередки пам'яті. При передачі символи кодуються ASCII кодами. Наприклад, під час запису в пам'ять коду 0 × 31 на дисплей буде виведений символ «1». Відповідність коду символу його відображенню на екрані (тобто «картинці» символу) зберігається в пам'яті CGROM. CGROM не зраджує пам'ять. Тому, дисплей може відображати тільки ті символи, які «зашиті» в контролер. Саме тому не кожен дисплей здатний відображати, наприклад, українські символи. Дисплеї, що продаються в нашому магазині, на жаль, не русифіковані. Є ще CGRAM пам'ять. Вона змінна. Ми можемо створювати власні символи і відображати їх на дисплеї. Варто враховувати, що можна створити не більше восьми символів.
Вся ця «подкапотная» робота важлива тільки для розуміння деяких нюансів. Для Arduino існує проста і зрозуміла бібліотека, яка виконує за вас всю чорнову роботу, дозволяючи контролювати висновок на дисплей легко і просто.
Для підключення дисплея його, зрозуміло, потрібно встановити на макетну плату. Зверніть увагу: дисплеї, що продаються у нас в магазині продаються без припаяного Голковий роз'єму. Якщо ви хочете отримати дисплей відразу готовий до установки на макетке, відзначте галочку «припаяти роз'єм» на сторінці товару і ми припаяти роз'єм для вас. Передача даних на дисплей може бути організована двома способами: по 4 або по 8 біт за раз. Відповідно, потрібно або 4, або 8 висновків Arduino. На практиці, виграшу в швидкості при використанні восьмібітного інтерфейсу не буде. Тому, нам потрібно тільки 4 цифрових виведення для передачі даних. Ще 3 виведення потрібні для завдання режиму роботи дисплея. Разом для підключення дисплея знадобиться всього 7 цифрових виходів контролера. Контакти на дисплеї підписані, що дозволить не заплутатися при підключенні:
Контакти дисплея крупним планом
Висновки нумеруем зліва направо:
- 1- (VSS) Земля дисплея. Підключається до рейці землі.
- 2- (VDD) Харчування дисплея. Підключається до рейці харчування.
- 3- (VO) Вхід потенціометра (входить в комплект). За допомогою потенціометра регулюється контрастність дисплея. До висновку дисплея підключається середній вихід потенціометра.
- 4- (RS) Вхід «командного» сигналу. Підключається до будь-якого цифрового висновку Arduino. У прикладі підключений до висновку №12.
- 5- (RW) Встановлює режим «читання» або «записи». Ми збираємося записувати. Підключаємо контакт до землі.
- 6- (E) Enable. Ще один «командний» висновок. Коли на висновок подається одиниця, дисплей виконує передану раніше команду. Підключається до будь-якого цифрового висновку. У прикладі підключений до висновку №11.
- 7-10 (D0-D3) залишати не підключеними. Це контакти передачі даних, який використовуються в восьмібітного інтерфейсі. Нам не потрібні.
- 11-14 (D4-D7) Контакти для передачі даних в четирёхбітном режимі. Підключаються знову таки до будь-яких цифрових висновків. У прикладі підключені відповідно до 5,4,3 і 2 висновків (D4 до 5 висновку, D5 до 4 і т.д.).
- 15 (A) Анод світлодіода підсвічування. Токоогранічительний резистор вже встановлений в дисплеї, тому анод підключається просто до рейці харчування. Оскільки в підсвічуванні використовується самий звичайний світлодіод, ви можете підключити його до будь-якого висновку, що підтримує ШІМ і управляти яскравістю підсвічування програмно.
- 16 (K) Катод підсвічування. Підключається до рейці землі.
Візуальна схема підключення:
Схема підключення дисплея до Arduino
Разом з Arduino IDE поставляється прекрасна бібліотека для рідкокристалічних дисплеїв - LiquidCrystal. Бібліотека містить приклади, повністю розкривають можливості екрану. Для початку скористайтеся стандартним прикладом «HelloWorld» (Файл -> Приклади -> LiquidCrystal -> HelloWorld) або завантажте в плату наступний код:
Після завантаження цього коду в плату Arduino на екрані відобразиться напис «hello, world!» (Англ. «Привіт, Мир!») На першому рядку і таймер, що відраховує секунди на другому рядку.
Як завжди і буває, код простий і зрозумілий. Однак, ми все ж розберемо його детальніше:
- LiquidCrystal lcd (12, 11, 5, 4, 3, 2) - цей рядок створює об'єкт дисплея, з яким ми будемо працювати в майбутньому. У дужках в якості аргументів передаються номери пинов, до яких підключені контакти дисплея. Відповідно: RS, E, D4, D5, D6, D7. Як вже зазначалося вище, номери висновків при підключенні можна вибирати абсолютно довільно.
- lcd.begin (16, 2) - тут ми налаштували розміри дисплея. В даному прикладі 16 стовпців і 2 рядки. Для нашого дисплея 20х4 ця строчка виглядала б так: lcd.begin (20, 4).
- lcd.print ( «hello, world!») - виводить текст на дисплей. Після вказівки розміру дисплея (lcd.begin) курсор встановлюється в лівий верхній кут дисплея. Тому, цей текст буде виведений на першій (верхній) рядку зліва.
- lcd.setCursor (0, 1) - встановлює курсор на зазначену позицію. В даному випадку вказана крайня ліва позиція другого рядка. У дужках задається номер стовпчика, потім номер рядка. І рядки і стовпці нумеруються з нульовій позиції. Таким чином: lcd.setCursor (0, 0) - встановить курсор в лівий верхній кут, lcd.setCursor (15, 0) - правий нижній.
- lcd.print (millis () / 1000) - вже описано вище. Тут замість тексту в якості параметра передається формула для обчислення. Результат виводиться на екран.
Тепер, коли ми розібралися з найпростішим прикладом, можна перейти до прикладів складніше. А якщо ви вже все зрозуміли і готові купити ЖК дисплей, то я зібрав для вас посилання на перевірених мною китайських продавців дисплеїв:
Символьні ЖК дисплеї
Розмір дисплея (стовпці * рядки)
У стандартних прикладах, що поставляються разом з бібліотекою LiquidCrystal можна знайти такі скетчі:
- Autoscroll - демонструє можливість прокрутки тексту в автоматичному режимі. Щось схоже на біжучого рядка. При виведенні символу попередні символи зсуваються. Таким чином, новий символ виводиться на одному і тому ж місці.
- Blink - демонструє можливість включити відображення миготливого курсору у вигляді прямокутника.
- Cursor - демонструє можливість включити відображення курсора у вигляді миготливої горизонтальної риси.
- CustomCharacter - показана можливість створення власних символів для відображення їх на дисплеї. До речі, в цьому скетчі помилка. Подробиці нижче.
- Display - показує спосіб "вимикати" дисплей. Тобто показувати або приховувати виведений текст.
- Scroll - демонструє можливість прокрутки тексту в ручному режимі.
- SerialDisplay - відображає на екрані текст, надрукований у вікні монітора порту (тобто текст, що передається через серійний порт).
- setCursor - заповнює дисплей буквами, демонструючи можливість установки курсору в будь-яку позицію екрана.
- TextDirection - демонструє можливість змінювати напрямок виведення тексту (з права наліво або зліва направо).
Розглянемо більш докладно процедури, можливості яких демонструють ці приклади:
lcd.autoscroll ()
Після виклику цієї процедури, текст на екрані буде автоматично прокручуватися. Для зупинки прокрутки, слід викликати lcd.noAutoscroll ().
lcd.blink ()
Після виклику процедури курсор набуде вигляду миготливого прямокутника. Для відключення слід викликати lcd.noBlink (). Курсор знову стане невидимим.
lcd.cursor ()
Після виклику процедури курсор набуде вигляду миготливої горизонтальної риси. Для відключення слід викликати lcd.noСursor (). Курсор знову стане невидимим.
lcd.createChar ()
Процедура завантажує в змінну таблицю символів екрану (в пам'ять CGRAM) символ, описаний у вигляді байтового масиву. Як аргумент передається номер символу і масив байт, що описує символ. Зупинимося на цьому більш детально. Внести в пам'ять дисплея можна не більше восьми символів. Для додавання свого символу потрібно:
- Створити байтовий масив, що описує символ.
- Записати символ в пам'ять дисплея, присвоївши йому номер в таблиці символів. Символи нумеруються в діапазоні від нуля до семи.
- Вивести символ на екран за допомогою процедури lcd.write () (не плутати з lcd.print ()), в качесте аргументу якої передати номер символу.
Баг середовища розробки та особливості бібліотеки вилилися в неможливість вивести на екран символ під номером 0 (нуль). Компілятор зустрівши рядок lcd.write (0) видасть помилку: «call of overloaded 'write (int)' is ambiguous«. Саме такий рядок зустрічається в прикладі CustomCharacter бібліотеки. При спробі скомпілювати стандартний приклад, ви отримаєте помилку:
CustomCharacter. ino. In function 'void setup ()'.
CustomCharacter. 115. error. call of overloaded 'write (int)' is ambiguous
/ Home / nazarovd / arduino - 1.0.5 / libraries / LiquidCrystal / LiquidCrystal. h. 82. note. candidates are. virtual size_t LiquidCrystal. write (uint8_t)
/ Home / nazarovd / arduino - 1.0.5 / hardware / arduino / cores / arduino / Print. h. 49. note. size_t Print. write (const char *)
Для усунення помилки досить змінити рядок lcd.write (0) на lcd.write ((byte) 0).
Тепер невеличкий приклад зі створення свого символу. Давайте виведемо на дисплей символ рубля.
Символ рубля відображається на екрані
lcd.noDisplay ()
«Вимикає» дисплей. Насправді, просто приховує виведені на екран символи. Виклик процедури lcd.display () «включає» дисплей. Всі символи знову відображаються. Зверніть увагу: не відбувається очищення дисплея. Символи саме перестають відображатися.
lcd.scrollDisplayLeft (); lcd.scrollDisplayRight ();
Дозволяють прокручувати довгі рядки тексту в ручному (керованому) режимі. lcd.scrollDisplayLeft () прокручує рядок на один символ вліво, lcd.scrollDisplayRight () прокручує рядок на один символ вправо.
lcd.rightToLeft (); lcd.leftToRight ();
Встановлює напрямок відображення тексту. lcd.rightToLeft () встановлює режим відображення права на ліво, lcd.leftToRight () змушує текст відображатися зліва направо.