Это правильный способ мигать символом на ЖК-дисплее?
Код такой:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
unsigned long blinkTime = 0;
int ValueA = 22;
String placeHolder = " ";
void setup() {
lcd.begin();
}
void loop() {
lcd.setCursor(7, 0);
if (millis() - blinkTime > 2000) {
lcd.print(ValueA);
blinkTime = millis();
}
if (millis() - blinkTime > 1000) {
lcd.print(placeHolder);
}
}
В ЖК-библиотеке I2C есть функция lcd.blink()
, но кажется, что она мигает только "курсор".
Проблема с приведенным выше кодом заключается в placeHolder
. Что, если ValueA
станет больше двух цифр?
Есть ли лучший способ мигать значением на ЖК-дисплее?
@ElectronSurf, 👍1
Обсуждение1 ответ
Лучший ответ:
▲ 2
Чтобы подмигнуть число (через число и пустое пространство), вы можете попробовать класс BlinkLCD
в этом скетче. Он работает только с числами от 0 до 4294967295 или текстом (массив char
, не более 16 символов). Он не работает с числами с плавающей запятой.
// 4540 байт.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
class BlinkLCD{
private:
byte m_blinkState, m_startPosition, m_dataLength;
unsigned long m_dataToBlink, m_previousMillis, m_blinkRate;
char m_text[16 + 1];
public:
BlinkLCD(): m_blinkState(0), m_startPosition(0), m_dataLength(0),
m_dataToBlink(0), m_previousMillis(0), m_blinkRate(500),
m_text(){}
void Update(){
unsigned long m_currentMillis = millis();
if(m_currentMillis - m_previousMillis >= m_blinkRate){
byte m_row = 0;
m_blinkState = !m_blinkState;
m_previousMillis = m_currentMillis;
if(m_startPosition > 15){
m_startPosition -= 16;
m_row = 1;
}
lcd.setCursor(m_startPosition, m_row);
if(m_blinkState){
if((unsigned)strlen(m_text) > 0){
lcd.print(m_text);
}
else{
lcd.print(m_dataToBlink);
}
}
else{
for(byte i = 0; i < m_dataLength; i++){
lcd.print(" ");
}
}
}
}
void SetBlinkRate(unsigned long blinkRate){
m_blinkRate = blinkRate;
}
void SetNumber(unsigned long dataToBlink){
m_dataToBlink = dataToBlink;
}
void SetLength(byte dataLength){
m_dataLength = dataLength;
}
// Верхняя строка ЖК-дисплея, столбцы 0–15
// LCD Нижний ряд, 16 - 31
void SetStartPosition(byte startPosition){
m_startPosition = startPosition;
}
void SetText(char text[]){
strcpy(m_text, text);
}
};
BlinkLCD TopRowLCD;
BlinkLCD BottomRowLCD;
BlinkLCD BottomRowLCDtext;
void setup(){
lcd.init();
lcd.backlight();
lcd.clear();
lcd.print("Temperature 35 C");
lcd.setCursor(0, 1);
lcd.print("Num = 4294967295");
}
void loop(){
// Моделирование данных датчика.
static byte counter = 35;
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
// Обновляем показания температуры каждые 2 секунды.
if(currentMillis - previousMillis >= 2000){
previousMillis = currentMillis;
counter++;
if(counter > 45){counter = 35;}
lcd.setCursor(12, 0);
lcd.print(counter);
}
// Мигаем показания температуры, если она выше 40 C.
if(counter > 40){
TopRowLCD.SetNumber(counter);
TopRowLCD.SetStartPosition(12);
TopRowLCD.SetLength(2);
TopRowLCD.SetBlinkRate(250);
TopRowLCD.Update();
}
// Мигаем числом во второй строке ЖК-дисплея
// с частотой мигания по умолчанию 500 мс ВКЛ, 500 мс ВЫКЛ.
BottomRowLCD.SetNumber(4294967295);
BottomRowLCD.SetStartPosition(22);
BottomRowLCD.SetLength(10);
BottomRowLCD.Update();
// Мигание текста с частотой мерцания по умолчанию.
BottomRowLCDtext.SetText("Num");
BottomRowLCDtext.SetStartPosition(16);
BottomRowLCDtext.SetLength(3);
BottomRowLCDtext.Update();
}
,
@VE7JRO
Смотрите также:
- Как преобразовать код Arduino во встроенный код C/C++
- Печать содержимого файла SD - карты на ЖК-дисплее
- Первое использование Kuman 3,5-дюймового TFT-экрана модели SC3A-NEW-UK с Arduino
- Почему жк-дисплей не показывает никакого выхода?
- Как заполнить треугольник с помощью библиотеки LCD5110 Graph?
- Как полностью очистить все от arduino и напечатать что-то новое?
- Как запрограммировать кнопку джойстика, чтобы сбросить все?
- C++ против языка Arduino?
подсказка:
lcd.setCursor(7, 0);
находится в обоих блокахif
... вместо этого используйте его перед первымif
, @jsotola@jsotola Готово, спасибо., @ElectronSurf
напишите функцию, которая принимает три параметра... boolean
show
, byteposition
и intvalue
....value
- это отображаемые данные...position
- расположение отображаемых данных...show
, если true, отображать данные, если false, отображать пробелы .....show
устанавливается функцией таймера в начале цикла(), @jsotola@jsotola Я никогда раньше не писал функцию, не могли бы вы опубликовать пример того, что вы только что описали?, @ElectronSurf
функции google arduino... https://www.arduino.cc/en/Reference/FunctionDeclaration, @jsotola
ЖК-модуль имеет эту встроенную функцию. Нет необходимости реализовывать ее самостоятельно. Вызовите
lcd.blink();
, и текущая позиция курсора начнет мигать., @Gerbenмигает курсор, я хочу моргнуть персонаж...!, @ElectronSurf
Вместо перерисовки можно было периодически включать и выключать дисплей., @Mikael Patel
@MikaelPatel выключает дисплей? что ты имеешь в виду?, @ElectronSurf
Вы можете использовать управление подсветкой вместо перезаписи дисплея, чтобы создать иллюзию мигания текста (всего)., @Mikael Patel
@MikaelPatel, но это будет мигать на весь экран, а не на двух- или трехзначный символ, верно? плюс я хочу оставить подсветку включенной..., @ElectronSurf