Простой ЖК-таймер обратного отсчета

Я попытался изменить базовый скетч "hello-world" для ЖК-дисплея, который является частью раздела примеров в IDE. Я намеревался сделать таймер обратного отсчета с помощью ЖК-дисплея.

Исходный код просто печатает "Hello World" в первой строке, а затем использует функцию millis() для печати времени, прошедшего в следующей строке.

Поэтому я попробовал простую модификацию, чтобы сделать его обратный отсчет от 20. Вместо печати millis()/1000 я напечатал 20-millis()/1000, а также добавил некоторое время (), чтобы печатать только до millis()<=20 000. (чтобы он не выходил за пределы 00)

#include <LiquidCrystal.h>


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  
  lcd.begin(16, 2);
  
  lcd.print("time left");
}

void loop() {
  
  while(millis()<=20000){
    
    lcd.setCursor(0, 1);
    
    lcd.print(20- millis() / 1000);
  }
  

}

Казалось, работало до 10. но вместо 9он напечатал 90, а также 80,70... за 8,7...и т. Д. До 00.

Как я могу избавиться от этих лишних нулей?

, 👍2

Обсуждение

жк-дисплей.печать(' ');, @Juraj

куда мне это положить?, @satan 29


1 ответ


Лучший ответ:

6

вместо 9он напечатал 90

Нет, это не так: он напечатал “9”. Однако он не стирал предыдущее значение перед печатью “9”. Перед печатью 9-го номера жидкокристаллический дисплей имел:

┌────────────────┐
│time left       │
│10              │
└────────────────┘
 ^cursor position

Когда вы печатаете “9”, этот символ заменяет “1”, и в итоге вы видите “90”.

Исправление, как указал Юрай, состоит в том, чтобы добавить пробел после печати чисел.

Альтернативой является добавление пробела (или нуля), но только тогда, когда отображаемое число меньше 10:

int count = 20 - millis() / 1000;
if (count < 10)
    lcd.print(' ');  // alternatively: '0'
lcd.print(count);
,