таймер обратного отсчета на LCD Keypad Shield
- Войдите на сайт для отправки комментариев
Вс, 15/03/2015 - 00:15
Доброго всем.
Пока мое Leonardo в пути, осваиваю код на Proteus-е.
Имеем LCD Keypad Shield с 5-тью кнопками и 16/2 дисплеем.
Задача: выставить таймер от 1 до 5 минут кнопками вверх/вниз. Подтвердить кнопкой Select.
Таймер включает устройство (в данном случае светодиод диод на 13-м пине). Отрабатывает обратный отсчет с выводом на дисплей в секундах. Останавливает устройство и возвращается к выбору времени таймера.
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); int ledPin = 13; // LED подсоединен к выводу 13 int x; //шина кнопок unsigned long currentTime; //текущее время unsigned long loopTime; //время окончания unsigned long LimitTime = 0; //таймер boolean running = false; //Флаг Запуска отсчета void setup() { pinMode(ledPin, OUTPUT); // устанавливаем вывод 13 как выход lcd.begin(16, 2); //очистить экран lcd.print("Timer v.2"); //заставка delay(500); lcd.begin(16, 2); currentTime = millis(); // считываем время, прошедшее с момента запуска программы } void loop() { if (running == true) { //Выбран режим отсчета //отсчет времени currentTime = millis(); loopTime = currentTime + LimitTime; //когда закончить while(currentTime < loopTime){ // сравниваем текущее время с вр окончания digitalWrite(ledPin, HIGH); // включаем LED //Проверяем кнопку "Прервать" x = analogRead (0); //считываем шину кнопок delay(200); //защита от дребезга if (x < 60) { //"прервать" кнопка "Right " lcd.begin(16, 2); lcd.print("Interrupted"); //выводим прервано //устанавливаем начальные значения running = false; LimitTime = 0; delay(3000); //пауза lcd.begin(16, 2); goto bailout; //переход на опрос клавиатуры } lcd.begin(16, 2); lcd.setCursor(0, 0); //курсор в 0 lcd.print("Time to off: "); //время до окончания lcd.setCursor(13, 0); lcd.print(LimitTime/1000); delay(800); LimitTime = LimitTime - (millis() - currentTime); //уменьшаем таймер для вывода на экран currentTime = millis(); //получаем новое время } //окончание работы таймера lcd.setCursor(0, 0); lcd.print(" "); lcd.setCursor(0, 0); lcd.print("Timer: OFF"); running = false; delay (3000); digitalWrite(ledPin, LOW); //отключаем устройство (диод) lcd.begin(16, 2); } else {//Выбираем режим отсчета bailout: keypad (); } } //функция опроса клавиш: вверх вниз и выбор void keypad () { x = analogRead (0); delay(200); digitalWrite(ledPin, LOW); lcd.setCursor(0,1); lcd.print (" "); lcd.setCursor(0,0); lcd.print ("Time:"); if (x < 200) { //клавиша вверх if ((LimitTime + 60000) <= 300005) //максимум 5 минут { LimitTime += 60000; // + 1 минута lcd.setCursor(7,0); lcd.print (LimitTime/60000); } else { //если пытаемся прибавить больше 5 минут lcd.setCursor(0,1); lcd.print ("maximum 5 min"); delay (1000); lcd.setCursor(0,1); lcd.print (" "); } } else if (x < 400){ //кнопка вниз if (LimitTime > 60000) // минимум 1 минута { LimitTime -= 60000; lcd.setCursor(7,0); lcd.print (LimitTime/60000); } else { lcd.setCursor(0,1); lcd.print ("minimum 1 min"); delay (1000); lcd.setCursor(0,1); lcd.print (" "); } } else if (x < 800){ //кнопка выбор if (LimitTime !=0 ) {running = true; //Запуск отсчета lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print ("Start "); delay(1000); } else {//если не выбрали время lcd.setCursor(0,1); lcd.print ("minimum 1 min"); delay(700); } } } // конец
Извиняюсь за корявый код. Критика-идеи-предложения приветствуются.
Доброго времени суток. А как сделать на 10 минут с посекундным набором?
89-я строчка if
((LimitTime + 60000) <= 300005)
//максимум 5 минут
для 10-ти будет 600 001
LimitTime += 60000;
// + 1 минута -91я строчка
для секунды будет +=1000
Доброго времени суток. И Всех Вас С Наступающим Новым Годом!
А какие пины остаются свободными у этого шилда? Хочу прикупить себе такой.
Добрый день !
А есть ли возможность включать 13 пин не на весь цикл таймера , а по определенному времени - например когда таймер заканчивает считать и осталось 20 секунд?