Управление и оптимизация на LCD 16×2 с Arduino: Сравнение на два подхода

Управление и оптимизация на LCD 16x2 с Arduino: Сравнение на два подхода

Управлението на 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

За да свържете правилно 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

За този пример ще използваме 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();
}

Обяснение на кода:

  1. Инициализация на LCD дисплея: Програмата започва с настройка на връзките между Arduino и LCD дисплея. Библиотеката LiquidCrystal.h се използва за управление на дисплея, а чрез променливите rs, en, d4, d5, d6 и d7 се дефинират свързванията.
  2. Функция setup(): В setup() функцията се извършва първоначалното конфигуриране на дисплея с размер 16 колони и 2 реда. След това, чрез lcd.setCursor() и lcd.print(), се изписва съобщението “hello, world!” за 1 секунда, преди дисплеят да се изчисти.
  3. Функция 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);
}

Обяснение на кода:

  1. Оптимизирано управление: Тук отново се инициализира LCD дисплея по същия начин, както в първия код. Обаче, вместо да се изчиства целият дисплей, програмата обновява само тези части, където се показват променящите се стойности от аналоговите входове.
  2. Използване на променливи за предишни стойности: Въвеждат се две променливи prevA1 и prevA2, които съхраняват предишните стойности на аналоговите входове. Програмата проверява дали текущите стойности, прочетени от A1 и A2, са различни от предишните. Ако има промяна, само тогава дисплеят се обновява.
  3. Частично изчистване на екрана: Вместо да се изчиства целият дисплей, изтриваме само пространството, където е показана стойността на аналоговия вход, с няколко празни символа " ". Това предотвратява наслагването на старите стойности с новите.
  4. По-кратко закъснение: Закъснението в този код е намалено на 100 ms, което позволява по-бърза реакция на системата без забележимо премигване на екрана.

Предимства на втория код:

  • Предотвратяване на премигване: Най-голямото предимство на този подход е, че се избягва дразнещото премигване на дисплея, тъй като само изменените части от съдържанието се обновяват.
  • По-ефективно обновяване: Тъй като дисплеят не се изчиства напълно на всяка итерация, управлението на екрана е по-ефективно, особено при голямо количество данни или по-често обновяване.
  • По-плавна визуализация: Потребителят ще забележи много по-плавно и приятно изживяване, когато гледа дисплея, тъй като промените се правят само когато е необходимо.

Снимка от проекта: Управление и оптимизация на LCD 16×2 с Arduino

Управление и оптимизация на LCD 16x2 с Arduino - снимка от проекта

Заключение

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

Ако проектът ви изисква гладко и безпроблемно показване на данни, оптимизираният код е значително по-добър избор, особено при по-бързо обновяване на стойности.

Translate »