10 кнопок с использованием 1 прерывания
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 21 | ||||
| × | 10 |
Приложения и онлайн-сервисы
|
Об этом проекте
Введение
Удобны прерывания. Они, помимо упрощения кода, могут использоваться для точного определения времени или для вывода Arduino из спящего режима.
Допустим, у вас есть пользовательский интерфейс, например, пульт дистанционного управления, работающий от батареек. Возможно, вы захотите перевести Arduino (или автономный ATmega) в режим отключения питания для экономии энергии. Когда Arduino переходит в режим пониженного энергопотребления, он может быть разбужен только внешним прерыванием. Микросхема ATmega328P, используемая в Arduino Uno, имеет только два внешних прерывания вывода. ( INT0
и INT1
на контактах 2 и 3). Поскольку в пользовательском интерфейсе может быть больше двух кнопок, это проблема.
Стандартный способ решения
это было бы для обычного подключения всех кнопок, но также для подключения их к контакту прерывания с диодом. Однако это значительно усложняет схему.
Помимо стандартных внешних прерываний, ATmega328P также имеет прерывания по смене вывода. Для их решения существуют библиотеки, и они являются хорошим решением этой проблемы.
Однако во время соревнований по программированию я понял, как это сделать, используя стандартные внешние прерывания без дополнительных электрических компонентов.
Схема
У нас есть несколько кнопок. Я использовал десять, которые хорошо поместились на моей макетной плате. (У меня их тоже нет.) У вас может быть одна кнопка на пин, то есть до 20 на Uno и до 70 на Mega! (Если вам действительно нужно 70 кнопок, я рекомендую использовать мультиплексирование, для этого вам не понадобится целая Mega.)
Каждая кнопка имеет одну сторону, соединенную с произвольным контактом. (4-13 в моем случае) Остальные стороны всех кнопок соединены вместе с помощью единственного контакта с функцией прерывания. (2 в моем случае)
Код
Код прилагается ниже. Чтобы этот пример заработал, загрузите его на свою доску. Откройте монитор последовательного порта. Когда вы нажимаете кнопку, появляется ее номер. Как видите, функция цикла вообще не используется.
Как это работает?
Очевидно, что есть прерывание. В моем случае он прикреплен к контакту 2. Он настроен как ПАДЕНИЕ
.
Чтобы избежать использования диодов, Arduino меняет схему на лету. Возможны две конфигурации: Обычный режим . и Особый режим .
Общий режим
Большую часть времени схема будет в обычном режиме. Вывод прерывания будет настроен как INPUT_PULLUP
а остальное будет OUTPUT
и LOW
.
void configureCommon () {pinMode (commonPin, INPUT_PULLUP); для (int я =0; я
В обычном режиме нажатие любой кнопки потянет наш контакт прерывания вниз и вызовет прерывание. Как только это произойдет, наша процедура обслуживания прерывания перенастроит контакты для отдельного режима.
Особый режим
Как только срабатывает наше прерывание, мы быстро переключаемся в отдельный режим.
Особый режим противоположен обычному режиму. Вывод прерывания будет OUTPUT
. и LOW
а остальное будет INPUT_PULLUP
.
void configureDistinct () {pinMode (commonPin, OUTPUT); digitalWrite (commonPin, LOW); для (int я =0; я
В отдельном режиме будут опускаться только контакты, соответствующие фактически нажатым кнопкам. Мы можем легко просмотреть все контакты, чтобы определить, какой из них вызвал прерывание.
После этого Arduino может вернуться в обычный режим и дождаться следующего прерывания. Или, в зависимости от вашего приложения, он может оставаться в отдельном режиме и обрабатывать пользовательский ввод, как обычно, переключаясь обратно в общий режим до того, как Arduino перейдет в спящий режим.
Более сложный пример
Попробуем что-нибудь посложнее. Мы прикрепим сервопривод и разместим каждую кнопку под разным углом. (1 =0 °, 2 =20 ° ... 10 =120 °). Мы также запитаем нашу Arduino от нескольких батареек.
В этом примере мы переводим Arduino в режим отключения питания после пяти секунд бездействия для экономии энергии. Вы можете найти несколько руководств по спящему режиму в Интернете. В дополнение к этому мы запитываем сервопривод через транзистор, чтобы выключать его, когда он не используется.
Код этого примера также прилагается ниже.
Код
- Серийный регистратор
- Сервопривод со спящим режимом
Последовательный логгер Arduino
const int commonPin =2; const int buttonPins [] ={4,5,6,7,8,9,10,11,12,13}; unsigned long lastFire =0; void setup () {configureCommon ( ); // Установка контактов для прерывания attachInterrupt (digitalPinToInterrupt (commonPin), pressInterrupt, FALLING); Serial.begin (9600);} void loop () {// Пусто!} Void pressInterrupt () {// ISR if (millis () - lastFire <200) {// Debounce return; } lastFire =millis (); configureDistinct (); // Настройка выводов для тестирования отдельных кнопок для (int i =0; iСервопривод со спящим режимом Arduino
#include#include #include const int commonPin =2; const int buttonPins [] ={4,5,6,7,8 , 9,10,11,12,13}; const int servoEnablePin =A1; const int servoPin =A0; Servo servo; unsigned long lastFire =0; int status =0; void setup () {pinMode (commonPin, INPUT_PULLUP); configureCommon (); attachInterrupt (digitalPinToInterrupt (commonPin), pressInterrupt, ПАДЕНИЕ); серво.аттач (сервопин); pinMode (servoEnablePin, OUTPUT);} void loop () {if (millis () - lastFire> 5000) {digitalWrite (servoEnablePin, LOW); set_sleep_mode (SLEEP_MODE_PWR_DOWN); sleep_enable (); Режим сна(); } задержка (10);} void pressInterrupt () {sleep_disable (); power_all_enable (); если (millis () - lastFire <200) {возврат; } lastFire =millis (); configureDistinct (); for (int я =0; я
Схема
multiinterrupt_hoF76Oc4T5.fzz servo_with_sleep_u9ZqxF0jhY.fzzПроизводственный процесс
- Декодер DTMF с использованием только Arduino
- Создание монитора Ambilight с помощью Arduino
- Ультразвуковой левитационный аппарат с использованием ARDUINO
- Вольтметр своими руками с использованием Arduino и смартфона
- Монитор сердечного ритма с использованием Интернета вещей
- WebServerBlink с использованием Arduino Uno WiFi
- Счетчик автомобилей с использованием Arduino + Обработка + PHP
- Автоматизированная игра Дино с использованием arduino
- FM-радио с использованием Arduino и RDA8057M
- BLUE_P:беспроводной экран программирования Arduino