Управлението на LCD 16×2 дисплеи в проекти с Arduino е често срещана задача, особено когато се налага визуализация на различни данни от сензори. В тази статия ще разгледаме два подхода за показване на аналогови стойности на LCD дисплей. Първият код използва по-прост, но по-малко ефективен метод, докато вторият оптимизира обновяването на екрана, за да избегне нежелани ефекти като премигване. Ще анализираме всеки код, като изясним предимствата и недостатъците им.
Тук ще използваме и познанията си за изчитане на аналогов вход (АЦП/ADC) на Arduino от статията ни: Arduino UNO ADC read
Библиотека LiquidCrystal.h
В тази статия ще използваме стандартната библиотека за LCD 16×2 дисплеи, която е вградена в Arduino IDE по подразбиране. Тази библиотека, наречена LiquidCrystal.h, осигурява лесен и интуитивен начин за управление на 16×2 LCD дисплеи чрез стандартни функции за инициализация, позициониране на курсора и отпечатване на текст. Тя поддържа както 4-битов, така и 8-битов режим на комуникация с дисплея, което я прави удобен инструмент за различни проекти, изискващи визуализация на данни.

За да свържете правилно LCD 16×2 дисплея към Arduino Uno, е важно първо да се запознаете с платформата и нейната конфигурация на пиновете. Arduino Uno разполага с дигитални и аналогови входове/изходи, които играят ключова роля при свързването на периферни устройства като LCD дисплеи. В нашата статия сме предоставили подробни обяснения за това как да се ориентирате в пиновата конфигурация на Arduino Uno, за да постигнете успешно и надеждно свързване.
LCD 16×2 конфигурация на пиновете
Картинката по-долу показва конфигурацията на пиновете на LCD 16×2 дисплея, който ще свържем към Arduino UNO. Връзките включват контролни пинове като RS и EN, както и четири данни пина (D4 до D7), използвани за комуникация в 4-битов режим. Тeзи пинове са стандартни за използване с библиотеката LiquidCrystal.h.

За този пример ще използваме LCD shield за улеснение, като този: LCD 16×2 shield
Първи код: Основен подход за управление на LCD 16×2 дисплей
#include <LiquidCrystal.h>
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("hello, world!");
delay(1000);
lcd.clear();
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("Analog A1= ");
lcd.setCursor(11, 0);
lcd.print(analogRead(A1));
lcd.setCursor(0, 1);
lcd.print("Analog A2= ");
lcd.setCursor(11, 1);
lcd.print(analogRead(A2));
delay(300);
lcd.clear();
}Обяснение на кода:
- Инициализация на LCD дисплея: Програмата започва с настройка на връзките между Arduino и LCD дисплея. Библиотеката
LiquidCrystal.hсе използва за управление на дисплея, а чрез променливитеrs,en,d4,d5,d6иd7се дефинират свързванията. - Функция
setup(): Вsetup()функцията се извършва първоначалното конфигуриране на дисплея с размер 16 колони и 2 реда. След това, чрезlcd.setCursor()иlcd.print(), се изписва съобщението “hello, world!” за 1 секунда, преди дисплеят да се изчисти. - Функция
loop():- Програмата циклично прочита аналоговите входове
A1иA2сanalogRead(), показвайки техните стойности на дисплея. - На всяка итерация се използва
lcd.clear(), за да се изчисти съдържанието на екрана, след което новите стойности се показват след закъснение от 300 ms.
- Програмата циклично прочита аналоговите входове
Проблем с премигване:
Основният проблем на този код е, че всяка итерация изчиства целия дисплей и след това обновява данните. Това причинява премигване на екрана, тъй като дисплеят се изтрива и презаписва непрекъснато, дори когато стойностите не са променени. Това не е ефективен начин за управление на дисплея, особено когато няма промяна в показваните данни.
Втори код: Оптимизиран подход за предотвратяване на премигване
Вторият код решава проблема с премигването, като обновява само променените стойности на дисплея:
#include <LiquidCrystal.h>
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int prevA1 = -1;
int prevA2 = -1;
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Analog A1= ");
lcd.setCursor(0, 1);
lcd.print("Analog A2= ");
}
void loop() {
int valueA1 = analogRead(A1);
int valueA2 = analogRead(A2);
// Update only if the value has changed to avoid flickering
if (valueA1 != prevA1) {
lcd.setCursor(11, 0);
lcd.print(" "); // Clear the previous value
lcd.setCursor(11, 0);
lcd.print(valueA1);
prevA1 = valueA1;
}
if (valueA2 != prevA2) {
lcd.setCursor(11, 1);
lcd.print(" "); // Clear the previous value
lcd.setCursor(11, 1);
lcd.print(valueA2);
prevA2 = valueA2;
}
delay(100);
}Обяснение на кода:
- Оптимизирано управление: Тук отново се инициализира LCD дисплея по същия начин, както в първия код. Обаче, вместо да се изчиства целият дисплей, програмата обновява само тези части, където се показват променящите се стойности от аналоговите входове.
- Използване на променливи за предишни стойности: Въвеждат се две променливи
prevA1иprevA2, които съхраняват предишните стойности на аналоговите входове. Програмата проверява дали текущите стойности, прочетени отA1иA2, са различни от предишните. Ако има промяна, само тогава дисплеят се обновява. - Частично изчистване на екрана: Вместо да се изчиства целият дисплей, изтриваме само пространството, където е показана стойността на аналоговия вход, с няколко празни символа
" ". Това предотвратява наслагването на старите стойности с новите. - По-кратко закъснение: Закъснението в този код е намалено на 100 ms, което позволява по-бърза реакция на системата без забележимо премигване на екрана.
Предимства на втория код:
- Предотвратяване на премигване: Най-голямото предимство на този подход е, че се избягва дразнещото премигване на дисплея, тъй като само изменените части от съдържанието се обновяват.
- По-ефективно обновяване: Тъй като дисплеят не се изчиства напълно на всяка итерация, управлението на екрана е по-ефективно, особено при голямо количество данни или по-често обновяване.
- По-плавна визуализация: Потребителят ще забележи много по-плавно и приятно изживяване, когато гледа дисплея, тъй като промените се правят само когато е необходимо.
Снимка от проекта: Управление и оптимизация на LCD 16×2 с Arduino

Заключение
И двата кода имат за цел да визуализират аналогови стойности на LCD 16×2 дисплей с Arduino, но подхождат към задачата по различен начин. Първият код използва прост подход с често изчистване на екрана, което води до нежелано премигване. Вторият код е по-ефективен, като обновява само променените стойности, което води до по-добро потребителско изживяване и предотвратява трептенето на дисплея.
Ако проектът ви изисква гладко и безпроблемно показване на данни, оптимизираният код е значително по-добър избор, особено при по-бързо обновяване на стойности.
