таймер обратного отсчета на 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 секунд?