
Кухонный таймер предназначен для обратного отсчета времени за интервал от заданного времени до нуля. Обратный отсчет происходит с момента запуска. Пригодится для точного измерения приготовления изысканных блюд на кухне.
Описание работы таймера:
При подключение питания, включается Trema-модуль Четырехразрядный LED индикатор. На нем высвечиваются нули. Зеленой и красной Trema-модуль кнопкой происходит регулирование времени. Зеленая кнопка увеличивает количество минут. Красная кнопка уменьшает количество минут. Диапазон выставляемых значений от 0 до 99. Одновременное нажатие двух кнопок приведет в действие таймер и пойдет обратный отсчет времени. Чтобы поставить отсчет времени на паузу, необходимо нажать и удерживать красную кнопку. Чтобы продолжить отсчет времени необходимо нажать зеленую кнопку. Чтобы сбросить отсчет времени необходимо сначала поставить таймер на паузу, а потом нажать две кнопки одновременно. После сброса можно настраивать таймер заново. По достижению нуля начнет вибрировать Trema-модуль вибромодуль, звучать Trema-модуль Зуммер со встроенным генератором, а на индикаторе будет мигать нулевые значения. Для сброса в начальное состояние не обходимо нажать и удерживать красную кнопку. Чтобы начать обратный отсчет с заданного в первый раз времени, необходимо нажать и удерживать зеленую кнопку.
Нам понадобится:
- Arduino Uno х 1шт.
- Trema Set Shield х 1шт.
- Trema-модуль Зуммер со встроенным генератором x 1шт.
- Trema-модуль Четырехразрядный LED индикатор х 1шт.
- Trema-модуль красная кнопка х 1шт.
- Trema-модуль зеленая кнопка х 1шт.
- Trema-модуль вибромодуль х 1шт.
Для реализации проекта нам необходимо установить следующие библиотеки:
- Библиотека iarduino_4LED (для работы с четырёхразрядным LED индикатором).
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE.
Схема сборки:
- Устанавливаем Trema Set Shield в Arduino Uno.
- Устанавливаем Trema-модуль Четырехразрядный LED индикатор во 2 посадочную площадку.

- Устанавливаем Trema-модуль кнопка в 5 и 6 посадочные площадки.

- Устанавливаем Trema-модуль вибромодуль в 3 посадочную площадку.
- Устанавливаем Trema-модуль Зуммер со встроенным генератором в 4 посадочную площадку.

Код программы:
#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) выполняются следующие действия:
- Подключаем библиотеку iarduino_4LED для работы с Trema-модуль Четырехразрядным LED индикатором.
- Объявляем объект dispLED, с указанием выводов дисплея.
- Объявляем пины для работы с Trema-модуль вибромодуль, Trema-модуль Зуммер со встроенным генератором и Trema-модуль кнопками. pinBuzzer для зуммера, pinVibr для вибромодуля, pinKeyRed для красной кнопки, pinKeyGreen для зеленой кнопки.
- Объявляем функции и переменные участвующие в работе скетча.
В коде 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-модуль кнопки, для продолжения отсчета времени или нажатие одновременно двух кнопок, для сброса отсчета времени.

Обсуждение