Кухонный таймер на Arduino
2012-02-17
Все статьи →
Этот кухонный таймер представляет собой достаточно простое устройство, кнопка для нажимания и удерживания, которая поведет отсчет с интервалами в 5 минут до тех пор, пока вы не отпустите кнопку. Когда вы это сделаете, будет сигнал и таймер начнет отсчитывать назад. В таймер входят будильник и дисплей с пронзительным звуком, чтобы привлечь ваше внимание.
я взял все электрические компоненты из старых испорченных приспособлений. Старайтесь использовать вещи повторно, таким образом можно довольно просто избавиться от испорченной электроники, постарайтесь использовать поломанное по максимуму! Видите перемычки в проекте? Нет, скрепки для бумаги намного лучше — они очень дешевы и более надежны:)
Шаг 1. Компоненты
Вам понадобятся:
Arduino – я использовал duemillanove, но вы всегда можете взять другую вместо нее.
Проводки переходников – у меня они закончились, и я использовал скрепки для бумаги, но вы всегда можете сделать по-своему.
Кнопка – думаю, что можно использовать кнопку, встроенную в протошилд!
10 Bar LED Bar Graph – можно использовать для этого 10 светодиодов, я нашел мои в сломанном CD плеере.
Пьезо-электрическая пищалка –я использовал элемент от старого кухонного таймера со сломанным чипом. В общем-то, это и стало причиной, почему я захотел сделать собственный таймер на основе Ардуино!
Резистор – для подключения кнопки я использовал подтягивающий резистор в 10k, который выпаял из машинки для посева семян.
Дополнительно:
Arduino шилд – я использовал его, т.к. мне нравится экспериментировать с Arduino, и я не хочу долго возиться с таймером, если можно бысро сделать и пользоваться. В шилд встроена небольшая макетная плата, с ними проект выглядит аккуратнее.
Еще резисторы – для ваших компонентов, чтобы не сгорели выводы на вашей Arduino. Хотя я знаю, что это хорошая идея, у меня на тот момент не было достаточно резисторов, кроме того, я не знал, как использовать подтягивающие резисторы с Arduino, поэтому на тот момент сделал без них. Просто помните об этом, и не моя вина, если вы сожжете свою Arduino!
Шаг 2. Строим!
Проще всего показать, как соединена схема, это нарисовать ее в программе Fritzing (см. выше). Теперь о схеме. Как вы видите, одна сторона линейки из 10 светодиодов соединена с Gnd выводом Arduino, в то время, как каждая ножка с другой стороны присоединена к цифровому выводу Arduino. Это значит, что когда на выводе Arduino установлен высокий уровень (HIGH), соответствующий сегмент светодиода загорится. Выводы используемые для соединения с Arduino, 3, 4, 5, 6, 7, 8, 10, 11, 12, и 13, а вывод 2 резервируется для кнопки, и ШИМ (PWM) вывод 9 зарезервирован для использования пьезо-электрического звукового сигнала. Кнопка подсоединена проводком, таким образом, что когда она нажата напряжение 5В подается на вывод 2 и на нем появляется высокий логический уровень (HIGH), а когда кнопка не нажата, вывод на вывод 2 будет поступать низкий логический уровень (LOW). Пьезо звуковой сигнал соединен с ШИМ выводом 9, таким образом мы можем имитировать квадратную синусоидальную волну, используя analogWrite, который создаст звуковой сигнал, предупреждающий, что время истекло.
ШАГ 3: Кодируйте! Или используйте мой код
Чтобы запустить кухонный таймер, накормите вашу Ардуинку качественным, вкусненьким кодом. Я написал достаточно простой (но страшненький на вид) код, который может вести все это. Те, кому достаточно, чтобы система просто работала, могут загрузить его сейчас.
Объяснить немного сложнее, поэтому я сделаю краткий обзор, а остальное достаточно понятно:
Сначала мы инициализируем все выводы и функции, которые собираемся использовать, чтобы убедиться, что наша Arduino будет с ними работать. Мы используем const int чтобы показать, что вывод, который мы инициализируем, является константным и не изменится. Переменные могут также быть инициализированы, но, как правило, они не является константными (постоянными), так как они установлены по всему скрипту. Затем мы проверяем, была ли кнопка (подключенная к выводу 2) нажата или нет, и если это так, то загорается следующий сегмент, и добавляет к tastyTimeVariable.
Я также написал комментарии в скрипте, чтобы помочь тем, кто хочет понять, как это работает, или модифицировать для своих нужд.
Добавляю сообщение, присланное мне от одной читательницы, она пишет:
Я изменила код кухонного таймера, т.к. он был очень длинным. Написанный мною код делает то же самое, но является частью оригинального кода. Надеюсь, вы не возражаете. Вот линк к нему. Для работы этого скетча необходима библиотека Utility, если она у вас не установлена — скачайте и сохраните в подпапку libraries папки, в которую установлен ваш Arduino IDE
Это фантастический кусок кода, поэтому попробуйте его, процесс инсталляции тот же.
Шаг 4 Готовим!
Да, подключаем устройство к USB адаптеру. Не думаю, что оно очень защищено от воды, поэтому убедитесь, что руки сухие перед тем, как пользоваться. И все, что вы делаете, теперь на вашей ответственности, поэтому не пытайтесь потом предъявлять мне иск.
*/ Usage Instructions
Перезагрузите Arduino, и нажмите кнопку, чтобы светодиодные сегменты загорелись. Каждый сегмент представляет 5 минутный отрезок времени. Когда нужное количество сегментов загорится, отпустите кнопку. Дисплей засветится и все сегменты появятся опять. 5 минут спустя один исчезнет, и так далее, до тех пор, пока время не истечет. В этот момент раздастся звуковой сигнал. Чтобы остановить сигнал, перезагрузите Arduino. Выключать Arduino не нужно, т.к. кухонный таймер не включается без нажатия.
Наслаждайтесь /*
Anonymouse197, Ari Cooper Davis ©, anonymouse197[at]gmail. com
Прерывание— структура ядра Arduino и использование таймера
Изменено 5 лет, 6 месяцев назад
Просмотрено 2к раз
Мне нужно было использовать TC1 для захвата ввода, а также AnalogWrite() и прерывание примерно на 1 мс для опроса пользовательского интерфейса (кодер, кнопка).
ATmega328p Arduino Nano (техническое описание, будьте осторожны: много опечаток битовых символов) имеет три таймера:
- TC0
- ТС1
- ТК2
Не так просто найти информацию о структуре «ядра Arduino» и использовании периферийных устройств. Справочник по Arduino, похоже, не содержит никакой информации.
Некоторую информацию можно найти на
https://arduino-info.wikispaces.com/Timers-Arduino
, но я не уверен, что она актуальна. Например, я обнаружил, что отключение TC2 также отключает аналоговая запись ()
ШИМ.
Попытка использовать TC0 приводит к ошибке, так как TIMER0_OVF_vect
уже используется («множественное определение `__vector_16′»).
Как я могу использовать таймеры (и их прерывания), которые уже используются для ядра?
- прерывание
- ШИМ
- atmega328
- таймеры
- основные библиотеки
3
Вот краткое изложение всего этого. На ATmega328P (Arduino Uno, Nano, д.), основная библиотека Arduino использует таймеры следующим образом:
- Таймер 0
- Функции синхронизации и задержки с использованием прерывания
TIMER0_OVF
- «быстрый» ШИМ на частоте 980 Гц на контактах 5 и 6 (PD5 и PD6)
- Функции синхронизации и задержки с использованием прерывания
- Таймер 1
- «фазокорректирующий» ШИМ на 490 Гц на контактах 9 и 10 (PB1 и PB2)
- Таймер 2
- «фазокорректирующий» ШИМ на 490 Гц на контактах 3 и 11 (PD3 и PB3)
Предварительные делители всех трех таймеров установлены на 64. TIMER0_OVF
это
по умолчанию включено только прерывание по таймеру.
Обратите внимание, что библиотеки могут использовать таймеры в своих целях. Сервопривод
например, использует Таймер 1 для выполнения ШИМ на основе прерываний.
«Повторная реализация» обработчиков прерываний для освобождения ресурсов таймера/счетчика потребует внесения изменений в прошивку ядра Arduino. Но может быть обходной путь:
Исходный код показывает, как используются init()
и loop()
:
https://github.com/arduino/Arduino/blob/master/hardware/arduino/ avr/cores/arduino/main.cpp
и основная инициализация таймера здесь:
https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/wiring.c#L45
и init() Там же находится
, который также настраивает все остальные таймеры для фазовой коррекции ШИМ …
AnalogWrite()
находится в https://github. com/arduino/Arduino/blob/master/hardware/ arduino/avr/cores/arduino/wiring_analog.c
Я думал, что как раз на 490/980 Гц он может использовать программно-ШИМ, но на самом деле он выбирает соответствующий таймер 9Выход 0101 сравнивается с выводом (это также означает, что процессор может быть отключен, пока генерируется ШИМ).
Это делается с помощью поиска во время выполнения в заголовке платы digital_pin_to_timer_PGM
, например. https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/variants/standard/pins_arduino.h
, который кажется (условным) списком всех контактов.
Таким образом, существует ограниченный косвенный выбор того, какой таймер используется для ШИМ:
PD5 и PD6 обслуживаются TC0, поэтому использование одного из них как 9Выходной контакт 0029 AnalogWrite() освобождает TC2 для моих целей (опрос ~ 1 кГц).
У меня работает!
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
.