Кухонный таймер Arduino
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Об этом проекте
В начале Бог сотворил небо и землю. И люди. И люди создали цифровые кухонные таймеры, подобные этому.
И люди сказали:круто, но немного мрачно. Сделаем лучше!
И сказал Бог:я слышал ваш призыв, да будет Ардуинос:а Ардуино было по всей земле, и это было хорошо.
И люди взяли Arduino и создали лучший кухонный таймер, вроде этого.
И Бог увидел новый кухонный таймер и сказал:Я видел ваш новый кухонный таймер, и он выглядит ужасно . , но это кажется слишком забавным ! И это хорошо . :-)
Что нужно иметь
Теперь, когда вы знаете, откуда все это взялось, давайте углубимся в это.
Все компоненты, которые я использовал, входят в стартовый комплект Arduino . , включая небольшой макет, который вы видите на фотографиях и в видео. Не стесняйтесь включать проект в более крупный , если хотите.
Вам также понадобится источник питания:пока вы играете, USB-порта ПК и кабеля будет достаточно.
Что вам нужно сделать
Во-первых:пожалуйста, соберите все необходимые компоненты из Стартового набора или желаемой корзины для компонентов; если у вас его нет, не паникуйте. Здесь много в Интернете. Вы можете найти список компонентов ниже.
И вам тоже понадобится код. Он снова в коробке, внизу.
Как это работает
В принципе, как и любое другое подобное устройство, вы можете купить за доллар в любом магазине рядом с вами. Но это ваш . И это покажет вам как эти маленькие гаджеты действительно работают.
Ключевое слово здесь: текущий режим . Сам таймер может работать только в одном из четырех режимов одновременно:
- IDLE - таймер ожидает вашего ввода, показывая текущее установленное время; это также начальный режим после включения или сброса.
- НАСТРОЙКА - в этот режим можно войти долгим нажатием S4 (в коде это также называется «кнопка сброса»); здесь, используя S3 («кнопка запуска и остановки»), вы можете выбрать, какое значение следует изменить, чтобы установить прошедшее время, которое будет отсчитываться позже; наконец, используя S2 («кнопка вниз») и S1 («кнопка вверх») соответственно, вы можете уменьшить или увеличить выбранное значение (часы, минуты или секунды).
- РАБОТА - вы можете войти в этот режим, нажав S3, а для выхода из него потребуются S3 или S4 (что приведет вас в режим IDLE).
- ЗВОНОК - этот режим автоматически активируется по истечении желаемого времени; вы можете оставить его (то есть заставить маленького мальчика перестать звонить), нажав любой переключатель.
Код
Во-первых, нам нужно включить соответствующие библиотеки:
#include
#include
Если у вас их еще нет, вам необходимо загрузить и установить их:
- Пол Stoffregen's Время Библиотека (загрузите ZIP с помощью зеленой кнопки «Клонировать или скачать»)
- Библиотека Arduino LiquidCrystal
Затем давайте инициализируем этот красивый ЖК-модуль:
ЖК-дисплей LiquidCrystal (12, 11, 5, 4, 3, 2);
Пожалуйста, не стесняйтесь перебирать контакты по своему желанию, чтобы получить хорошую схему подключения:не следуйте за мной в этом, так как я сделал ужасный план подключения! :D Например, вы можете поменять местами последние четыре контакта в приведенном выше заявлении, чтобы избежать пересечения желтых проводов, которые вы видите на схеме ниже (очевидно, вам придется соответствующим образом настроить константы контактов кнопки, см. Ниже). Играйте, веселитесь! Жизнь с Arduinos начинается сразу после этого копирования / вставки!
Следующие 51 строка кода содержат объявление и инициализацию статических переменных. Не стесняйтесь просматривать их, их кристально четкие названия и отдельные комментарии помогут вам понять все.
Функция setup () выполняет обычные предварительные шаги, которые вы видели миллионы раз в любом скетче Arduino, существующем и до сих пор. Единственное примечательное утверждение - это первое, которое устанавливает начальную позицию курсора ЖК-дисплея. Потому что да:этот модуль требует, чтобы вы установили позицию по его строкам и столбцам, а затем что-то «распечатали», что будет появляться, начиная с этой позиции.
Теперь перейдем к функции loop ().
Прежде всего, давайте узнаем о статусах переключателей. Для этого следующий блок кода используется для почти каждый из них:
/ *
* Управление кнопкой Start / Stop
* /
startStopButtonPressed =false;
startStopButtonState =digitalRead (startStopButtonPin);
if (startStopButtonState ! =startStopButtonPrevState)
{
startStopButtonPressed =startStopButtonState ==HIGH;
startStopButtonPrevState =startStopButtonState;
}
Для связанного вывода выдается digitalRead, и результат сравнивается с ранее считанным значением:если что-то изменилось, новое значение сохраняется для использования в будущем, а статическая переменная bool «xxxButtonPressed» принимает значение true, если кнопка нажата.
Глядя на принципиальную схему ниже, вы заметите, что каждый входной вывод принудительно переводится в низкий уровень резистором 10 кОм, если не нажат соответствующий переключатель, а сам вывод напрямую не подключен к + 5 В. Довольно классический сценарий, а?
Раньше я говорил " почти " каждая из них », потому что есть одна кнопка, которая действует иначе, чем другие:S4. Ее кодовый блок способен обнаруживать вышеупомянутое долгое нажатие, чтобы войти в режим НАСТРОЙКИ.
Затем следует переключение блока управления режимом:каждый случай смотрит на триггеры состояния кнопки («xxxButtonPressed») и перенаправляет поток в правильное новое состояние или выполняет правильное действие.
case MODE_IDLE:
if (resetButtonPressed)
{
Reset ();
}
if (resetButtonLongPressed)
{
currentMode =MODE_SETUP;
}
if (startStopButtonPressed)
{
currentMode =currentMode ==MODE_IDLE? MODE_RUNNING:MODE_IDLE;
if (currentMode ==MODE_RUNNING)
{
// ТАЙМЕР ЗАПУСКА!
startTime =now ();
}
}
перерыв;
Предыдущий фрагмент кода показывает, как управляется режим IDLE, и он довольно понятен. Другой пример показывает, как нажатие любой кнопки во время звонка останавливает его:
case MODE_RINGING:
if (resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed)
{
currentMode =MODE_IDLE;
}
break;
Выглядит просто, не правда ли? :-) Это так.
Следующий блок - «Управление временем» - выполняет расчет фактической разницы во времени, запускает режим ЗВОНОК и фактически звонит . шум, когда пришло время это сделать.
Последний блок - «Управление ЖК-дисплеем» - управляет ЖК-дисплеем для каждого режима путем печати правильных строк в соответствующих местах.
Вот и все.
Подводя итоги и приступайте к делу!
Теперь, когда у этого маленького щенка больше нет секретов для вас, давайте посмотрим на него в действии. Спасибо за просмотр и получайте удовольствие!
Код
- ArduinoSketch
ArduinoSketch Arduino
/ ********************************************* **** * Arduino Kitchen Timer v1.0 - 27.01.2016 * Автор:Анджело Фиорилло (Рим, Италия) * Эта работа распространяется под лицензией GNU General * Public License версии 3 или более поздней (GPL3 +) * Пожалуйста, укажите этот кредит обратите внимание, если вы хотите * повторно использовать любую часть этого эскиза. Уважайте мою работу *, как я буду относиться к вашей. * Не стесняйтесь обращаться ко мне:[email protected] * ************************************ *********** / # include#include // ИСПРАВЛЕНИЕ 2018-08-12 Это исправление «'сейчас' не было объявлено в этой области» errorLiquidCrystal lcd ( 12, 11, 5, 4, 3, 2); const int buzzerPin =10; const int resetButtonPin =6; const int startStopButtonPin =7; const int downButtonPin =8; const int upButtonPin =9; int setupHours =0; // Сколько часов будет отсчитываться при запуске int setupMinutes =0; // Сколько минут будет отсчитываться при запуске int setupSeconds =0; // Сколько секунд будет отсчитываться при запуске time_t setupTime =0; int currentHours =0; int currentMinutes =0; int currentSeconds =0; time_t currentTime =0; time_t startTime =0; time_t elapsedTime =0; int resetButtonState =LOW; long; resetButtonLongPressCounter =0; int startStopButtonState =LOW; int upButtonState =LOW; int downButtonState =LOW; int resetButtonPrevState =LOW; int startStopButtonPrevState =LOW; int upButtonPrevState=LOW; startStopButtonPressed =false; bool upButtonPressed =false; bool downButtonPressed =false; const int MODE_IDLE =0; const int MODE_SETUP =1; const int MODE_RUNNING =2; const int MODE_RINGING =3; int currentMode =MODE_IDLE; // 0 =режим ожидания 1 =настройка 2 =работа 3 =звонок // Включение -> режим ожидания // Сброс -> режим ожидания // Запуск / остановка -> счетчик запуска или остановки // Вверх / вниз -> NOP // Сброс (долгое нажатие) -> войти в настройки // Старт / Стоп -> выбор данных // Вверх -> увеличить текущее значение данных // Вниз -> уменьшить текущее значение данных // Сброс -> выйти из настройки (простаивает) int dataSelection =0; // Текущие выбранные данные для редактирования (режим настройки, изменяется с помощью Start / Stop) // 0 =часы (00-99) 1 =минуты (00-59) 2 =секунды (00-59) void setup () {// поместите сюда свой установочный код, чтобы запустить его один раз:lcd.begin (16, 2); pinMode (resetButtonPin, ВХОД); pinMode (startStopButtonPin, ВХОД); pinMode (upButtonPin, ВХОД); pinMode (downButtonPin, ВХОД); pinMode (buzzerPin, ВЫХОД); Serial.begin (9600);} void loop () {// поместите сюда ваш основной код, чтобы запускать его повторно:startStopButtonPressed =false; upButtonPressed =false; downButtonPressed =false; / * * Управление кнопкой сброса * / resetButtonPressed =false; resetButtonLongPressed =false; resetButtonState =digitalRead (resetButtonPin); если (resetButtonState! =resetButtonPrevState) {resetButtonPressed =resetButtonState ==HIGH; resetButtonPrevState =resetButtonState; } else // Управление длительным нажатием ... {if (resetButtonState ==HIGH) {resetButtonLongPressCounter ++; если (resetButtonLongPressCounter ==100) {resetButtonPressed =false; resetButtonLongPressed =true; resetButtonLongPressCounter =0; }} еще {resetButtonLongPressCounter =0; resetButtonPressed =false; resetButtonLongPressed =false; }} / * * Управление кнопками Start / Stop * / startStopButtonPressed =false; startStopButtonState =digitalRead (startStopButtonPin); если (startStopButtonState! =startStopButtonPrevState) {startStopButtonPressed =startStopButtonState ==HIGH; startStopButtonPrevState =startStopButtonState; } / * * Управление кнопкой вниз * / downButtonPressed =false; downButtonState =digitalRead (downButtonPin); если (downButtonState! =downButtonPrevState) {downButtonPressed =downButtonState ==ВЫСОКИЙ; downButtonPrevState =downButtonState; } / * * Управление кнопкой вверх * / upButtonPressed =false; upButtonState =digitalRead (upButtonPin); если (upButtonState! =upButtonPrevState) {upButtonPressed =upButtonState ==HIGH; upButtonPrevState =upButtonState; } / * * Управление режимом * / switch (currentMode) {case MODE_IDLE:if (resetButtonPressed) {Reset (); } если (resetButtonLongPressed) {currentMode =MODE_SETUP; } if (startStopButtonPressed) {currentMode =currentMode ==MODE_IDLE? MODE_RUNNING:MODE_IDLE; if (currentMode ==MODE_RUNNING) {// ТАЙМЕР ЗАПУСКА! startTime =сейчас (); } } ломать; case MODE_SETUP:if (resetButtonPressed) {// Выйти из режима настройки setupTime =setupSeconds + (60 * setupMinutes) + (3600 * setupHours); currentHours =setupHours; currentMinutes =setupMinutes; currentSeconds =setupSeconds; dataSelection =0; currentMode =MODE_IDLE; } if (startStopButtonPressed) {// Выбрать следующие данные для настройки dataSelection ++; если (dataSelection ==3) {dataSelection =0; }} if (downButtonPressed) {switch (dataSelection) {case 0:// часы setupHours--; если (setupHours ==-1) {setupHours =99; } ломать; case 1:// минуты setupMinutes--; если (setupMinutes ==-1) {setupMinutes =59; } ломать; case 2:// секунды setupSeconds--; если (setupSeconds ==-1) {setupSeconds =59; } ломать; }} if (upButtonPressed) {switch (dataSelection) {case 0:// часы setupHours ++; если (setupHours ==100) {setupHours =0; } ломать; case 1:// минуты setupMinutes ++; если (setupMinutes ==60) {setupMinutes =0; } ломать; case 2:// секунды setupSeconds ++; если (setupSeconds ==60) {setupSeconds =0; } ломать; } } ломать; case MODE_RUNNING:если (startStopButtonPressed) {currentMode =MODE_IDLE; } если (resetButtonPressed) {Reset (); currentMode =MODE_IDLE; } ломать; case MODE_RINGING:if (resetButtonPressed || startStopButtonPressed || downButtonPressed || upButtonPressed) {currentMode =MODE_IDLE; } ломать; } / * * Управление временем * / switch (currentMode) {case MODE_IDLE:case MODE_SETUP:// NOP break; case MODE_RUNNING:currentTime =setupTime - (now () - startTime); если (currentTime <=0) {currentMode =MODE_RINGING; } ломать; case MODE_RINGING:analogWrite (buzzerPin, 20); задержка (20); analogWrite (buzzerPin, 0); задержка (40); ломать; } / * * Управление ЖК-дисплеем * / //lcd.clear (); lcd.setCursor (0, 0); переключатель (currentMode) {case MODE_IDLE:lcd.print ("Таймер готов"); lcd.setCursor (0, 1); lcd.print (текущие часы); lcd.print (""); lcd.print (currentMinutes); lcd.print (""); lcd.print (текущие секунды); lcd.print (""); ломать; case MODE_SETUP:lcd.print ("Режим настройки:"); переключатель (выбор данных) {случай 0:lcd.print ("HRS"); ломать; случай 1:lcd.print ("MINS"); ломать; случай 2:lcd.print («СЕКУНДЫ»); ломать; } lcd.setCursor (0, 1); lcd.print (setupHours); lcd.print (""); lcd.print (setupMinutes); lcd.print (""); lcd.print (setupSeconds); lcd.print (""); ломать; case MODE_RUNNING:lcd.print («Обратный отсчет ...»); lcd.setCursor (0, 1); если (час (currentTime) <10) lcd.print ("0"); lcd.print (час (текущее время)); lcd.print (":"); если (минута (currentTime) <10) lcd.print ("0"); lcd.print (минута (текущее время)); lcd.print (":"); если (секунда (currentTime) <10) lcd.print ("0"); lcd.print (секунда (текущее время)); ломать; case MODE_RINGING:lcd.print («КОЛЬЦО-КОЛЬЦО!»); lcd.setCursor (0, 1); lcd.print (""); ломать; } delay (10);} сбросить void () {currentMode =MODE_IDLE; currentHours =setupHours; currentMinutes =setupMinutes; currentSeconds =setupSeconds;}
Схема
Вы можете использовать любую макетную плату общего назначения, включая стартовый комплект, который меньше изображенного здесь (зуммер можно разместить под желтыми проводами, см. Видео и фотографии).Производственный процесс
- Сигнал тревоги для растений, предупреждающий о жажде
- DIY Простой осциллограф Arduino 20 кГц на ЖК-дисплее Nokia 5110
- Умные жалюзи
- Итальянские часы со словами
- Таймер обратного отсчета Arduino
- Счетчик кВтч Sigfox
- Монитор температуры Bluetooth
- Блокировка, управляемая жестами
- Изолированный аналоговый вход для Arduino
- Измерьте время реакции