Скидки, ограниченное предложение! Полный список акционных товаров

Проект 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-модуль кнопки, для продолжения отсчета времени или нажатие одновременно двух кнопок, для сброса отсчета времени.

Ссылки:

Обсуждение

Присоединяйся

Другие уроки

На главную