Время переключения многовходового переключателя

У меня в основном есть два переключателя Оба переключателя будут нажаты одновременно в разном порядке Я хочу знать, какой переключатель был нажат первым

, 👍0

Обсуждение

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

одновременно и `разного порядка " понятия взаимоисключающие ... вы либо нажимаете их одновременно, либо нажимаете последовательно ... вы не можете сделать и то и другое, @jsotola


2 ответа


0
  1. Простая версия: постоянно проверяйте состояние цифровых входов, к которым подключены переключатели. Когда один из них находится HIGH, то первым нажимается переключатель.
  2. Промежуточная версия: проверьте пример "мигание без задержки", чтобы убедиться, что вы не получите слишком много ложных срабатываний.
  3. Расширенная версия: используйте прерывания, когда один из двух переключателей становится "ВЫСОКИМ", используя функцию "мигать без задержки", чтобы предотвратить ложные срабатывания.

Если вы хотите знать, нажаты ли оба одновременно, но один нажат первым, используйте переменные, чтобы отслеживать его.

как две переменные:

bool button1Pressed = false;
bool button2Pressed = false;

Установите их соответствующим образом (в зависимости от того, какую из 3-х возможностей вы используете). Затем, когда вы знаете, что кнопка изменена, вы можете легко проверить логические значения, чтобы знать, что уже было нажато.

Или вы можете использовать перечисление, которое сочетает в себе состояние обоих:

enum EState { ALL_OFF, BUTTON_1_PRESSED, BUTTON_2_PRESSED, BOTH_BUTTONS_PRESSED };

EState buttonState;
,

1

Используйте внешние прерывания - вот короткий ответ.

Более длинная версия:

Вы, вероятно, хотите сделать систему зуммера, как то, что показывают в игровом шоу family feud. Я предполагаю, что вы используете Arduino UNO/MEGA и или имеете опыт программирования.

1/ Используйте INT0 и INT1 для кнопок 1 и 2.

Когда возникает прерывание, микроконтроллер переходит на определенный адрес для запуска процедуры обслуживания прерываний. Векторы INT0 и INT1 указывают на два отличительных адреса для запуска 2-х различных функций. Для этого mcu требуется наименьшее количество тактовых импульсов процессора, чтобы зафиксировать, какую кнопку нажать первой.

2/ Используйте векторы PCINT, которые являются прерыванием PinChange. Но лично я предпочитаю называть это прерыванием PortChange.

Существует 3 вектора прерываний PinChange PCINT0, PCINT1, PCINT2 для запуска 3 отличительных сервисных процедур. Но этот тип прерывания не знает, какой вывод изменен.

Таким образом, внутри процедуры обслуживания прерываний вы должны проверить наличие этого конкретного pin. Вы можете сделать это так же, как arduino way digitalRead(button1) или захватить весь регистр порта, т. е. PORTB, PORTC или PORTD.

В двух словах, PORTB содержит значения цифрового вывода от 8 до 13, в то время как порт D содержит значения цифрового вывода от 0 до 7 и PORC для A0 до A7.

Вы можете сбрить некоторые часы процессора (вероятно, 3-10 часов), поместив 2 кнопки разных векторов PCINT. Так что каждая кнопка по-прежнему запускает свою отличительную функцию.

За 3 такта процессора (или около 180 нс) многое может измениться, и вы можете не получить правильного результата.

3/ Опрос в основном цикле() Это худший способ сделать это. Тем не менее, это все равно дает хороший результат.

if (digitalRead(button1)==LOW) {
// сделай что-нибудь
}

if (digitalRead(button2)==LOW) {
// сделай что-нибудь еще
}
,