Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Кухонный таймер Arduino

Компоненты и расходные материалы

Arduino UNO
× 1
Стандартный ЖК-экран Adafruit - 16x2, белый на синем
× 1
Кнопочный переключатель SparkFun, 12 мм
× 4
Резистор 10 кОм
× 4
Резистор 221 Ом
Ну, 220 Ом ...
× 2
Однооборотный потенциометр - 100 кОм
× 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;} 

Схема

Вы можете использовать любую макетную плату общего назначения, включая стартовый комплект, который меньше изображенного здесь (зуммер можно разместить под желтыми проводами, см. Видео и фотографии).

Производственный процесс

  1. Сигнал тревоги для растений, предупреждающий о жажде
  2. DIY Простой осциллограф Arduino 20 кГц на ЖК-дисплее Nokia 5110
  3. Умные жалюзи
  4. Итальянские часы со словами
  5. Таймер обратного отсчета Arduino
  6. Счетчик кВтч Sigfox
  7. Монитор температуры Bluetooth
  8. Блокировка, управляемая жестами
  9. Изолированный аналоговый вход для Arduino
  10. Измерьте время реакции