таймер обратного отсчета на LCD Keypad Shield

wgaint
Offline
Зарегистрирован: 15.03.2015

Доброго всем.

Пока мое 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);
   }
  }
  } 
   // конец
 

Извиняюсь за корявый код. Критика-идеи-предложения приветствуются. 

 

aleksrulevoi
Offline
Зарегистрирован: 25.05.2015

Доброго времени суток. А как сделать на 10 минут с посекундным набором?

wgaint
Offline
Зарегистрирован: 15.03.2015

89-я строчка if ((LimitTime + 60000) <= 300005) //максимум 5 минут
для 10-ти будет 600 001

LimitTime += 60000; // + 1 минута -91я строчка

для секунды будет +=1000

Uborevich
Offline
Зарегистрирован: 20.08.2015

Доброго времени суток. И Всех Вас С Наступающим Новым Годом!

А какие пины остаются свободными у этого шилда? Хочу прикупить себе такой.

 

Skvidward
Skvidward аватар
Offline
Зарегистрирован: 16.12.2015

Добрый день !

А есть ли возможность включать 13 пин не на весь цикл таймера , а по определенному времени - например когда таймер заканчивает считать и осталось 20 секунд?