У меня есть пять кнопок, которые ссылаются на определенный разъем. Мне нужен эффективный код, чтобы установить переменную для разъема с состоянием 1. Что использовать?
Есть 5 кнопок, каждая из которых соответствует определенному контакту, давайте использовать от 1 до 5 для примера. Я хочу установить переменную, ActiveButton, которая будет установлена равной единственному pin в одном состоянии.
Мы используем концепцию, что может быть только одна активная кнопка, которая означает, что пин этого будет иметь состояние 1, а остальные будут 0. Длинный метод для этого состоял бы в том, чтобы использовать if else и digitalRead(pin) == 1 для всего, но это было бы так долго для кода. Я рассматривал возможность использования do while или while loops для остановки, пока он не достигнет кнопки с состоянием 1, но мне было интересно, есть ли более эффективный код. Я также подумал, есть ли что-то, что использует массив?
Хотя идея, как с простым массивом вернуть индекс, который приводит к соответствующим значением, как допустим, массив[3] ==1 среди всех индексов от 0 до 4 чувствует себя, легко моделируется, я считаю, это может быть очень неприхотлива в коде и не может быть в состоянии быть сделано в короткий путь.
Я также думал о возможном использовании switch case, где переменная будет высоким состоянием, а значения case будут digitalRead для каждого ПИНа? Но это было бы неправильно, вероятно, потому что я не уверен, но вы не можете установить переменную switch в качестве константы. Это было бы что-то вроде
выключатель (1)
case digitalRead(1):
case digitalRead(2):
@AndroidV11, 👍0
Обсуждение1 ответ
Лучший ответ:
Есть 5 кнопок, каждая из которых соответствует определенному контакту, давайте для примера возьмем от 1 до 5. Я хочу установить переменную ActiveButton, которая будет установлена равной единственному контакту в одном состоянии.
Вот краткий фрагмент того, что я думаю, что вы хотите. Это довольно большой риск, так как ваш вопрос недостаточно ясен.
int ActiveButton = -1; // Инициализировать ActiveButton с помощью -1 (кнопка не активна)
int button_pins[] = {1, 2, 3, 4, 5}; //Массив с контактами кнопок
void loop(){
for(int i=0;i < sizeof(button_pins)/sizeof(button_pins[0]); i++){
if(digitalRead(button_pins[i])){ //если была нажата i-я кнопка
ActiveButton = button_pins[i]; // присвоить переменной i-й контакт кнопки
break; // Break, так как мы нашли нашу нажатую кнопку, игнорируйте все следующие пины
}
}
}
Это позволит присвоить переменной pin нажатой кнопки. Условие в цикле for
sizeof(button_pins)/sizeof(button_pins[0])
сделает код циклическим по всем элементам массива button_pins.
sizeof(button_pins)
возвращает количество байтов в массиве button_pins. Затем мы делим количество байтов в первом элементе, чтобы получить количество элементов в массиве.
Да, такой код-это именно то, что я хотел. Мне нужно было использовать его для освещения светодиодов по-другому. Проблема, когда я попытался это сделать, заключается в том, что мои огни не выключались, когда кнопки не были нажаты, и менялись только при нажатии другой кнопки. Я не указывал на это в первоначальном посте, потому что я уже знал, как сделать светодиодную часть, и хотел сосредоточиться на этом, но да, я должен был поднять это сейчас. Как сделать так, чтобы петля выключалась при нажатии кнопки?, @AndroidV11
Это единственная проблема. Все остальное работает. Я ценю ваши усилия. Я попытался поставить условие else, чтобы установить ActivePushButton в 0, но это, похоже, не так, как я намеревался. Для большего контекста после этого кода я поставил функцию переключения для случаев с 1 по 5, чтобы выполнить пользовательские пять функций, а затем код для пользовательских пяти функций после., @AndroidV11
Обновить. На самом деле я уже сделал это, установив ActiveButton равным 0 после случаев переключения. Я просто оставил этот вопрос на случай, если вы собираетесь предложить другое предложение., @AndroidV11
Да, я бы предложил нечто подобное. Если сейчас это сработает, мне нечего добавить., @chrisl
- NodeMCU - Vin контакт как выход 5V?
- Использовать все контакты как цифровые входы/выходы
- Что такое ICSP pin (разъём)?
- Сколько датчиков может поддерживать один модуль Arduino?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Какой тип разъема использует система GROVE?
- Неиспользуемые контакты в Arduino L293D motor shield?
- Как выбрать вывод передачи в библиотеке IRremote для Arduino Uno?
что это значит? - но это было бы слишком долго по коду ... вы можете использовать массив ... как вы ожидаете ссылаться на элементы массива без использования цикла или нескольких операторов if - else if?, @jsotola
Массив определенно будет использоваться, но я думал, что если else слишком длинный, то другие коды, такие как циклы do while, while, for, могут выполнить эту работу с меньшим количеством кода., @AndroidV11
вы могли бы использовать аппаратные средства ... поиск
приоритетного кодировщика
, @jsotolaне думайте о том, чтобы быть причудливым с кодом, используя форму "switch-case" вместо нескольких операторов "if"... компилятор может фактически выдавать один и тот же код, @jsotola
поместите номера выводов кнопок в массив ... затем вы можете использовать цикл " for " для считывания каждого вывода и возврата либо самого низкого, либо самого высокого вывода (или и того, и другого)., @jsotola
Мне не ясно, какого поведения вы хотите. Я понял следующее: пользователь может нажать несколько кнопок, но будет зарегистрирована только та, которая находится первой в ряду нажатых кнопок. Таким образом, если бы пользователь нажал кнопки 3,4 и 6, то была бы зарегистрирована только кнопка 3. Это верно?, @chrisl
Нет, давайте предположим, что пользователь может нажать только одну кнопку. В настоящее время я работаю только над симуляцией этой идеи TinkerCAD, поэтому я не буду обращать внимания на сценарий с несколькими кнопками, поскольку фактически ваш курсор действительно может удерживать только одну кнопку., @AndroidV11