![Управление и оптимизация на LCD 16x2 с Arduino: Сравнение на два подхода](http://ardudevelop.eu/wp-content/uploads/2024/09/Управление-и-оптимизация-на-LCD-16x2-с-Arduino-Сравнение-на-два-подхода.png)
Управлението на 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-битов режим на комуникация с дисплея, което я прави удобен инструмент за различни проекти, изискващи визуализация на данни.
![Arduino IDE LiquidCrystal.h](http://ardudevelop.eu/wp-content/uploads/2024/09/Arduino-IDE-LiquidCrystal.h.png)
За да свържете правилно 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 16x2-PinOUT](http://ardudevelop.eu/wp-content/uploads/2024/09/LCD-16x2-PinOUT.png)
За този пример ще използваме 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 16x2 с Arduino - снимка от проекта](http://ardudevelop.eu/wp-content/uploads/2024/09/Управление-и-оптимизация-на-LCD-16x2-с-Arduino-снимка-от-проекта-1024x776.jpg)
Заключение
И двата кода имат за цел да визуализират аналогови стойности на LCD 16×2 дисплей с Arduino, но подхождат към задачата по различен начин. Първият код използва прост подход с често изчистване на екрана, което води до нежелано премигване. Вторият код е по-ефективен, като обновява само променените стойности, което води до по-добро потребителско изживяване и предотвратява трептенето на дисплея.
Ако проектът ви изисква гладко и безпроблемно показване на данни, оптимизираният код е значително по-добър избор, особено при по-бързо обновяване на стойности.