У меня есть пять кнопок, которые ссылаются на определенный разъем. Мне нужен эффективный код, чтобы установить переменную для разъема с состоянием 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):

, 👍0

Обсуждение

что это значит? - но это было бы слишком долго по коду ... вы можете использовать массив ... как вы ожидаете ссылаться на элементы массива без использования цикла или нескольких операторов if - else if?, @jsotola

Массив определенно будет использоваться, но я думал, что если else слишком длинный, то другие коды, такие как циклы do while, while, for, могут выполнить эту работу с меньшим количеством кода., @AndroidV11

вы могли бы использовать аппаратные средства ... поиск приоритетного кодировщика, @jsotola

не думайте о том, чтобы быть причудливым с кодом, используя форму "switch-case" вместо нескольких операторов "if"... компилятор может фактически выдавать один и тот же код, @jsotola

поместите номера выводов кнопок в массив ... затем вы можете использовать цикл " for " для считывания каждого вывода и возврата либо самого низкого, либо самого высокого вывода (или и того, и другого)., @jsotola

Мне не ясно, какого поведения вы хотите. Я понял следующее: пользователь может нажать несколько кнопок, но будет зарегистрирована только та, которая находится первой в ряду нажатых кнопок. Таким образом, если бы пользователь нажал кнопки 3,4 и 6, то была бы зарегистрирована только кнопка 3. Это верно?, @chrisl

Нет, давайте предположим, что пользователь может нажать только одну кнопку. В настоящее время я работаю только над симуляцией этой идеи TinkerCAD, поэтому я не буду обращать внимания на сценарий с несколькими кнопками, поскольку фактически ваш курсор действительно может удерживать только одну кнопку., @AndroidV11


1 ответ


Лучший ответ:

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