В общем задумка такая: Один LCD дисплей MT-16S2H, три тактовые кнопки и один светодиод. Двумя кнопками (+ и -) задаём уровень ШИМ в приделах 0 - 255. При этом на дисплее отображается этот самый уровень. Когда нужный уровень выбран, нажимаем на третью кнопку (старт) и светодиод зажигается (повторное нажатие гасит светодиод). Собрал схемку, написал код. Всё работает, но есть один косяк: При запуске программы у меня на дисплее высвечивается: "Уровень:0", первое нажатие + "Уровень: 35", далее "Уровень:70", далее "Уровень:105" если дальше нажать + то будет 140, а вот если нажать - то получается "Уровень:705", а дальше "Уровень:355". В общем, эта скотина не хочет удалять старые символы, а новые печатает сразу после двоеточия(( Как с этим бороться?
P.S: Вот мой скетч Код (Text): #include <LiquidCrystal.h> #define KEY_UP 7 #define KEY_DOWN 6 #define KEY_SET 5 #define LED_PIN 3 LiquidCrystal lcd(13, 12, 11, 10, 9, 8); int brightness = 0; boolean keyUp = true; boolean keyDown = true; boolean keySet = true; boolean lcdPrint = false; void setup() { lcd.begin(16, 2); pinMode(LED_PIN, OUTPUT); } void loop() { lcd.setCursor(0, 0); lcd.print("\xA9po\xB3""e\xBD\xC4"":"); lcd.print(brightness); \\вот тут я пропечатываю уровень ШИМ на дисплей if (lcdPrint){ lcd.setCursor(0, 1); lcd.print("\xA2\xBBo\xC0\xBA""a"" \xA1OP\xA5"); analogWrite(LED_PIN, brightness); } else { lcd.setCursor(0, 1); lcd.print("PAC"" \xE0""BA TP""\xA5: "); analogWrite(LED_PIN, 0); } boolean setIsUp = digitalRead(KEY_SET); if (keySet &&!setIsUp){ delay(10); setIsUp =digitalRead(KEY_SET); if (!setIsUp){ lcdPrint = !lcdPrint; } } keySet = setIsUp; keyUp = handleClick(KEY_UP, keyUp, +35); keyDown = handleClick(KEY_DOWN, keyDown, -35); } boolean handleClick(int keyPin, boolean wasUp, int delta) { boolean isUp = digitalRead(keyPin); if (wasUp && !isUp){ delay(10); isUp = digitalRead(keyPin); if (!isUp) brightness = constrain (brightness + delta, 0, 255); } return isUp; }
1. Выравнивать вывод пробелами слева что-то вроде Код (Text): if (brightness<100) lcd.print(" "); if (brightness<10) lcd.print(" "); lcd.print(brightness,DEC); 2. Дополнительно после числа выводить некоторое количество пробелов, которые гарантированно забьют остатки старого: Код (Text): lcd.print(brightness,DEC); lcd.print(" "); 3. Перед выводом числа на том месте, где оно должно выводиться выводить пробельную строку с длиной, соответствующей максимальной длине символьного представления числа. Код (Text): lcd.setCursor(x,y) lcd.print(" "); lcd.setCursor(x,y) lcd.print(brightness,DEC); Весь экран лучше не очищать, моргать будет неприятно.