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