Проект 2. Кухонный таймер

Кухонный таймер предназначен для обратного отсчета времени за интервал от заданного времени до нуля. Обратный отсчет происходит с момента запуска. Пригодится для точного измерения приготовления изысканных блюд на кухне.

Описание работы таймера:

При подключение питания, включается Trema-модуль Четырехразрядный LED индикатор. На нем высвечиваются нули. Зеленой и красной Trema-модуль кнопкой происходит регулирование времени. Зеленая кнопка увеличивает количество минут. Красная кнопка уменьшает количество минут. Диапазон выставляемых значений от 0 до 99. Одновременное нажатие двух кнопок приведет в действие таймер и пойдет обратный отсчет времени. Чтобы поставить отсчет времени на паузу, необходимо нажать и удерживать красную кнопку. Чтобы продолжить отсчет времени необходимо нажать зеленую кнопку. Чтобы сбросить отсчет времени необходимо сначала поставить таймер на паузу, а потом нажать две кнопки одновременно. После сброса можно настраивать таймер заново. По достижению нуля начнет вибрировать Trema-модуль вибромодуль, звучать Trema-модуль Зуммер со встроенным генератором, а на индикаторе будет мигать нулевые значения. Для сброса в начальное состояние не обходимо нажать и удерживать красную кнопку. Чтобы начать обратный отсчет с заданного в первый раз времени, необходимо нажать и удерживать зеленую кнопку.

Нам понадобится:

Для реализации проекта нам необходимо установить следующие библиотеки:

  • Библиотека iarduino_4LED (для работы с четырёхразрядным LED индикатором).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE.

Схема сборки:

Код программы:

#include <iarduino_4LED.h>                                            // Подключаем библиотеку iarduino_4LED
iarduino_4LED dispLED(1,A0);                                          // Объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO )
                                                                      //
uint8_t pinBuzzer = 2;                                                // Объявляем пин для работы с зуммером.
int pinVibr = 3;                                                      // Объявляем пин для работы с вибромодулем.
const int pinKeyRed = A3;                                             // Объявляем пин для работы с красной кнопкой.
const int pinKeyGreen = 11;                                           // Объявляем пин для работы с зеленой кнопкой.
                                                                      //
long prevmicros = 0;                                                  // Переменная для хранения значений таймера.
int sek=0;                                                            // Переменная для значений секунд.
int minu=0;                                                           // Переменная для значений минут.
int sekA=0;                                                           // Переменная для значений начальниых секунд.
int minuA=0;                                                          // Переменная для значения начальных минут.
String sekChar;                                                       // Переменная для преобразования числового значения секунд в строковое.
String minuChar;                                                      // Переменная для преобразования числового значения минут в строковое.
boolean counter=false;                                                // Переменная события счетчика для полсекунды.
int act;                                                              // Переменная выбора действия.
String times;                                                         // Переменная вывода времени на дисплей.
int i;                                                                // Переменная счета
int eventTime;                                                        // Переменная события. Разрешение или запрет изменения времени.
                                                                      //
void TimeOff();                                                       // Функция завершения времени.
void ShowTime();                                                      // Функция перевода и вывода времени на экран.
                                                                      //
void setup()                                                          //
{                                                                     //
  dispLED.begin();                                                    // Инициируем LED дисплей.
                                                                      //
  pinMode(pinBuzzer,  OUTPUT  );                                      // Переводим вывод pinBuzzer в режим выхода
  digitalWrite(pinBuzzer, LOW );                                      // Устанавливаем уровень логического «0» на выводе pinBuzzer.
                                                                      //
  pinMode(pinVibr, OUTPUT);                                           // Переводим вывод led в режим выхода.
  pinMode(pinKeyGreen, INPUT);                                        // Переводим вывод pinKeyGreen в режим входа.
  pinMode(pinKeyRed, INPUT);                                          // Переводим вывод pinKeyRed в режим входа.
                                                                      //
  eventTime = 1;                                                      // Разрешаем изменение времени.
  act = 1;                                                            // Переходим к заданию времени.
}                                                                     //
                                                                      //
void loop()                                                           //
{                                                                     //
  dispLED.light(7);                                                   // Устанавливаем максимальную яркость свечения LED индикатора
  ShowTime();                                                         // Выводим на дисплей время.
                                                                      //
  switch (act)                                                        // Выбираем действие.
  {                                                                   //
    case 1:                                                           // Задание времение.
    if(digitalRead(pinKeyGreen) && (digitalRead(!pinKeyRed)))         // Проверка нажатия зеленой кнопки и не нажатия красной кнопки.
    {                                                                 //
      while(digitalRead(pinKeyGreen) && (digitalRead(!pinKeyRed)))    // Цикл слежения нажатой зеленой кнопки.
      {                                                               //
        delay(10);                                                    // Ждём пока мы её не отпустим.
        if(i<50 && digitalRead(pinKeyRed)){act = 2;eventTime=0;}      // Проверка нажатия красной кнопки. Если нажаты обе, то переходим к дейстивию обратного отсчета.
        if(i<150){i++;} else{delay(100);minu++;ShowTime();}           // Фиксируем, как долго удерживается кнопка pinKeyGreen, если дольше 2 секунд, то увеличиваем минуты, до отжатия кнопки.
      }                                                               //
      if(eventTime)                                                   // Проверяем переменную события.
      {                                                               //
        if(i<150){minu++;ShowTime();}                                 // Если кнопка pinKeyGreen удерживалась меньше 2 секунд, то увеличиваем минуты.
      }                                                               //
    i = 0;                                                            // Обнуляем переменную счета.
    }                                                                 //
                                                                      //
    if(digitalRead(pinKeyRed) && digitalRead(!pinKeyGreen))           // Проверка нажатия красной кнопки и не нажатия зеленой кнопки.
    {                                                                 //
      while(digitalRead(pinKeyRed) && digitalRead(!pinKeyGreen))      // Цикл слежения нажатой зеленой кнопки.
      {                                                               //
        delay(10);                                                    // Ждём пока мы её не отпустим.
        if(i<50 && digitalRead(pinKeyGreen)){act = 2;eventTime=0;}    // Проверка нажатия зеленой кнопки. Если нажаты обе, то переходим к дейстивию обратного отсчета.
        if(i<150){i++;} else{delay(100);minu--;ShowTime();}           // Фиксируем, как долго удерживается кнопка pinKeyRed, если дольше 2 секунд, то увеличиваем минуты, до отжатия кнопки.
      }                                                               //
      if(eventTime)                                                   // Проверяем переменную события.
      {                                                               //
        if(i<150) {minu--;ShowTime();}                                // Если кнопка pinKeyRed удерживалась меньше 2 секунд, то увеличиваем минуты.
      }                                                               //
    i = 0;                                                            // Обнуляем переменную счета.
    }                                                                 //
                                                                      //
    sekA = sek;                                                       // Присваиваем заданное значение секунд дополнительной переменной.
    minuA = minu;                                                     // Присваиваем заданное значение минут дополнительной переменной.
    break;                                                            // Выходим из оператора case.  
                                                                      //
    case 2:                                                           // Отсчет времени.
    if(micros() - prevmicros > 500000)                                // Раз в пол секунду уменьшаем значение секунд.
    {                                                                 //
      prevmicros = micros();                                          // Сохраняем значение таймера.
      counter=!counter;                                               // Разрешаем изменение секунд.
      if(!counter)                                                    // Проверка переменной события.
      {                                                               //
        if(!minu && !sek){act = 3;}                                   // Проверка завершения обратного отсчета. Переходим к действиею завершения обратного отсчета.
        else                                                          // Иначе переходим к деуствию обратного отсчета.
        {                                                             //
          sek--;                                                      // Уменьщаем секунды.
          if(sek < 0)                                                 // Если переменная секунд меньше нуля.
          {                                                           //
            sek=59;                                                   // Присваиваем значение 59.
            minu--;                                                   // Уменьшаем минуты.
          }                                                           //
        }                                                             //
        dispLED.point(0, false);                                      // Гасим двоеточие на индикаторе.
        dispLED.point(2, true);                                       // Подсвечиваем 2 точку.
        delay(400);                                                   // Задержка пол секунды.
      }                                                               //
      else                                                            // Обеспечиваем мигание. Во второй половине секунды.
      {                                                               //
        dispLED.point(2, false);                                      // Гасим 2 точку.
        delay(400);                                                   // Задержка пол секунды.
      }                                                               //
    }                                                                 //
    if(digitalRead(pinKeyRed) && digitalRead(!pinKeyGreen)){act = 4;} // Проверяем нажатие красной кнопки при не нажатой зелейной кнопки и переходим к действию пауза и сброс.
    break;                                                            // Выходим из оператора case.
                                                                      //
    case 3:                                                           // Отсчет закончился.
    minu = 0;                                                         // Обнуляем переменную минут.
    sek = 0;                                                          // Обнуляем переменную секунд.
    if(digitalRead(pinKeyRed) || digitalRead(pinKeyGreen))            // Проверка нажатия красной либо зеленой клавиши.
    {                                                                 //
      if(digitalRead(pinKeyRed))                                      // Проверка нажатия красной кнопки.
      {                                                               //
        act = 1;                                                      // Разрешаем переход к заданию времени.
        eventTime = 1;                                                // Разрешаем изменение времени.
      }                                                               //
      if(digitalRead(pinKeyGreen))                                    // Проверка нажатия зеленой кнопки.
      {                                                               //
        sek = sekA;                                                   // Присваиваем дополнительной переменной секунд предыдущее значение.
        minu = minuA;                                                 // Присваиваем дополнительной переменной минут предыдущее значение.
        act = 2;                                                      // Разрешаем переход в отсчет времение. Начинаем повторный отсчет с предыдущими значениями.
      }                                                               //
    }                                                                 //
    else{TimeOff();}                                                  // Иначе переходим в функцию завершения отсчета.
    break;                                                            // Выходим из оператора case.
                                                                      //
    case 4:                                                           // Пауза и сброс.
    if(digitalRead(pinKeyGreen)){act = 2;}                            // Если нажата зеленая кнопка, то переходим к действию отсчет времени.
    if(digitalRead(pinKeyGreen) && (digitalRead(!pinKeyRed)))         // Проверка нажатия зеленой кнопки, при не нажатой красной.
    {                                                                 //
      while(digitalRead(pinKeyGreen) && (digitalRead(!pinKeyRed)))    // Цикл слежения нажатия зеленой кнопки, при не нажатой красной.
      {                                                               //
        delay(10);                                                    // Ждём пока мы её не отпустим
        if(i<50 && digitalRead(pinKeyRed))                            // Проверка нажатия красной кнопки.
        {                                                             //
          act = 1;                                                    // разрешаем переход в задание времени.
          sek = 0;                                                    // Обнуляем количество секунд.
          minu = 0;                                                   // Обнуляем количество минут.
          eventTime=1;                                                // Разрешаем изменение времени.
        }                                                             //
        if(i<150){i++;}                                               // Фиксируем, как долго удерживается кнопка pinKeyGreen
      }                                                               //
    i = 0;                                                            // Обнуляем переменную счета.
    }                                                                 //
                                                                      //
    if(digitalRead(pinKeyRed) && digitalRead(!pinKeyGreen))           // Проверка нажатия красной кнопки, при не нажатой зеленой.
    {                                                                 //
      while(digitalRead(pinKeyRed) && digitalRead(!pinKeyGreen))      // Цикл слежения нажатия красной кнопки, при не нажатой зеленой.
      {                                                               //
        delay(10);                                                    // Ждём пока мы её не отпустим
        if(i<50 && digitalRead(pinKeyGreen))                          // Проверка нажатия зеленой кнопки.
        {                                                             //
          act = 1;                                                    // разрешаем переход в задание времени.
          sek = 0;                                                    // Обнуляем количество секунд.
          minu = 0;                                                   // Обнуляем количество минут.
          eventTime=1;                                                // Разрешаем изменение времени.
        }                                                             //
        if(i<150){i++;}                                               // Фиксируем, как долго удерживается кнопка pinKeyRed.
      }                                                               //
    i = 0;                                                            // Обнуляем переменную счета.
    }                                                                 //
    break;                                                            // Выходим из оператора case.
  }                                                                   //
}                                                                     //
                                                                      //
void TimeOff()                                                        // Функцию завершения отсчета.
{                                                                     //
      digitalWrite(pinBuzzer, HIGH);                                  // Включаем зуммер.
      digitalWrite(pinVibr, HIGH);                                    // Включаем вибромодуль.
      delay(1000);                                                    // Задержка 1 секунда.
                                                                      //
      digitalWrite(pinBuzzer, LOW );                                  // Выключаем зуммер.
      dispLED.light(0);                                               // уменьшаем яркость дисплея.
      digitalWrite(pinVibr, LOW);                                     // Включаем вибромодуль.
      delay(1000);                                                    // Задержка 1 секунда.
}                                                                     //
                                                                      //
void ShowTime()                                                       // Функция перевода и вывода времени на экран.
{                                                                     //
  if (minu > 99){minu = 99;}                                          // Проверка выхода минут за диапазон. Не больше 99.
  if (minu < 0){minu = 0;}                                            // Проверка выхода минут за диапазон. Не меньше 0.
                                                                      //
  if (minu>=0 && minu<10){minuChar = (String) "0" + minu;}            // Если минуты от 0 до 9, то добавляем спереди ноль и переводим в строковое значение.
  else{minuChar = (String) minu;}                                     // Переводим минуты в строковое значение.
  if (sek>=0 && sek<10){sekChar = (String) "0" + sek;}                // Если секунды от 0 до 9, то добавляем спереди ноль и переводим в строковое значение.
  else{sekChar = (String) sek;}                                       // Переводим секунды в строковое значение.
                                                                      //
  times = minuChar + ":" + sekChar;                                   // Присваиваем общей переменной минуты, двоеточие, секунды.
  dispLED.print(times);                                               // Выводим значение на индикатор.
}                                                                     //

Алгоритм работы:

В начале скетча (до кода setup) выполняются следующие действия:

В коде setup выполняются следующие действия:

  • Инициируем LED дисплей.
  • Переводим выводы в режим выхода или входа. pinBuzzer, pinVibr - выход, pinKeyGreen, pinKeyRed - вход. Устанавливаем логический ноль на выводе pinBuzzer.
  • Разрешаем событие изменение времени, разрешаем начала задания времени.

В коде loop выполняются следующие действия:

  • Устанавливаем максимальный уровень яркости.
  • Выводим на Trema-модуль Четырехразрядный LED индикатор значения времени с помощью функции "ShowTime()". В ней происходит проверка выхода количество минут диапазон значений от 0 до 99. Также проверка количества единиц в секундах и минутах, чтобы добавить ноль спереди, если количество единиц не превышает десятков и перевод чисел в строковое значение с дальнейшим выводи на индикатор.
  • Задаём время. Для этого контролируем нажатие Trema-модуль кнопок.
  • При нажатии зеленой кнопки, увеличиваем количество минут до 99. Здесь происходит проверка нажатия зеленой кнопки, при не нажатой красной кнопки. Внутри проверки цикл слежения нажатой зеленой кнопки (в цикле ожидаем 2 секунды и выводим на индикатор увеличение количества минут пока нажата зеленая кнопка) и проверка нажатой красной кнопки (если красная кнопка нажата, то разрешаем переход к отсчету времен, запрещаем увеличение количества минут), если обе проверки не верны, увеличиваем количество минут на один и выводим значение на индикатор. Обнуляем переменную счета.
  • При нажатии красной кнопки, уменьшается количество минут до 0. Здесь происходит проверка нажатия красной кнопки, при не нажатой зеленой кнопки. Внутри проверки цикл слежения нажатой красной кнопки (в цикле ожидаем 2 секунды и выводим на индикатор уменьшение количества минут пока нажата красная кнопка) и проверка нажатой зеленой кнопки (если зеленая кнопка нажата, то разрешаем переход к отсчету времен, запрещаем уменьшение количества минут), если обе проверки не верны, уменьшаем количество минут на один и выводим значение на индикатор. Обнуляем переменную счета.
  • Сохраняем заданное время.
  • Отсчет времени. Каждые пол секунды уменьшаем количество секунды на один. При достижении секунд нуля уменьшаем минуты на один, а секундам присваиваем значение 59. Реализуем каждые пол секунды мигание двоеточия или второй точки на индикаторе. Отслеживаем нажатие красной кнопки, чтобы поставить отсчет времени на паузу. При достижении нуля и секунд и минут, заканчиваем отсчет времени.
  • Отсчет времени закончился. Сбрасываем переменные времени и ждем нажатие кнопок зеленой или красной. При нажатии зеленой кнопки, устанавливается предыдущее заданное время и начинается отсчет времени заново. При нажатии красной кнопки, переходим в начальное положение программы. Если не нажаты кнопки, включаем и выключаем на 1 секунду Trema-модуль Зуммер со встроенным генератором и Trema-модуль вибромодуль, а также мигает Trema-модуль Четырехразрядный LED индикатор.
  • Когда отсчет времени поставлен на паузу, контролируется нажатие зеленой Trema-модуль кнопки, для продолжения отсчета времени или нажатие одновременно двух кнопок, для сброса отсчета времени.

Ссылки:

Обсуждение