Это правильный способ мигать символом на ЖК-дисплее?

Код такой:

#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 станет больше двух цифр?

Есть ли лучший способ мигать значением на ЖК-дисплее?

, 👍1

Обсуждение

подсказка: lcd.setCursor(7, 0); находится в обоих блоках if... вместо этого используйте его перед первым if, @jsotola

@jsotola Готово, спасибо., @ElectronSurf

напишите функцию, которая принимает три параметра... boolean show, byte position и int value.... 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


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();

}
,