Путаница между switch и if
Следующий код предназначен для управления включением и выключением двух светодиодов с помощью двух специальных кнопок. Я использовал if()
для каждого условия, и мне было неудобно писать этот код, поскольку я чувствовал, что может быть лучше с switch...case
, потому что, если если увеличить количество кнопок, это будет беспорядочное решение. Однако мне не удалось оптимизировать для него switch...case
. Может ли кто-нибудь предложить хорошее преобразование переключателя для этого if()
.
int buttonState1 = 0; // переменная для чтения статуса кнопки1
int buttonState2 = 0; // переменная для чтения статуса кнопки 2
//устанавливаем номера контактов
int button1 = 2; // кнопка №. 1
int button2 =3; // кнопка №. 2
int Led1 = 4; // светодиод 1
int Led2 =5; // светодиод 2
void setup() {
Serial.begin(9600); // сериал начинается с 9600
// определение режимов контактов для светодиода и кнопок
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode (Led1, OUTPUT);
pinMode (Led2, OUTPUT);
};
void loop() {
buttonState1 = digitalRead(button1); // читаем кнопку 1 в переменной buttonstate1
buttonState2 = digitalRead(button2); // читаем кнопку 2 в переменной buttonstate2
// состояние включения светодиода 1, если нажата кнопка 1
if (buttonState1 == HIGH) {
digitalWrite(Led1, HIGH);
}
// условие включения светодиода2, если нажата кнопка2.
if (buttonState2 ==HIGH){
digitalWrite(Led2, HIGH);
}
// оба светодиода не горят, если ни одна кнопка не нажата
else{
digitalWrite(Led1, LOW);
digitalWrite(Led2, LOW);
}
};
@Birender Brar, 👍-1
Обсуждение2 ответа
Корпус переключателя не кажется эффективным способом управления светодиодами. Было бы разумнее (и, возможно, проще) вместо этого создать функцию для управления светодиодами.
void buttonToggle(int buttonPin, int ledPin) {
int buttonState = digitalRead(buttonPin);
if(buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
Тогда вам нужно будет заменить оператор if
вызовами функции (EX buttonToggle(Button1, Led1);
Если вы хотите использовать отдельную кнопку для каждого светодиода, то нецелесообразно использовать оператор switch..case. Это связано с тем, что сначала вам нужно создать переменную-переключатель на основе показаний переключателей, прежде чем вы сможете использовать ее (переменную-переменную) для операторов de case.
Когда вы объедините чтение переключателей с настройкой светодиодов, вы получите красивый циклический раздел:
void loop() {
digitalWrite(Led1, digitalRead(button1));
digitalWrite(Led2, digitalRead(button2));
digitalWrite(Led3, digitalRead(button3));
digitalWrite(Led4, digitalRead(button4));
digitalWrite(Led5, digitalRead(button5));
// и так далее
}
- Как повторить другое действие внутри цикла?
- Обнаружение нажатия кнопки в цикле
- Непрерывно запускайте функцию световой последовательности в операторе if
- Определение того, была ли нажата и отпущена кнопка
- Хорошая кнопка debouncing/Библиотека StateChange
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Код Arduino для управления 4 светодиодами с 4 кнопок
Примечание. «else» применяется только ко второму оператору «if». Поэтому, если вы отпустите кнопку 1, пока кнопка 2 все еще нажата, светодиод 2 не погаснет., @Gerben
Вы также можете заменить весь код на
digitalWrite(Led1, digitalRead(button1)); digitalWrite(Led2, digitalRead(button2));
. Не могли бы вы немного рассказать о том, чего вы хотите достичь, поскольку это ограничило бы множество различных подходов, которые вы могли бы использовать. Если вы хотите прочитать большое количество кнопок и изменить соответствующие им светодиоды, вы можете использовать массив для номеров контактов кнопок и массив. Затем используйте цикл for, чтобы прочитать каждую из кнопок одну за другой и запустить некоторый код. Это уменьшит количество «дублирующегося» кода., @Gerben