Путаница между 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);
  }

};

, 👍-1

Обсуждение

Примечание. «else» применяется только ко второму оператору «if». Поэтому, если вы отпустите кнопку 1, пока кнопка 2 все еще нажата, светодиод 2 не погаснет., @Gerben

Вы также можете заменить весь код на digitalWrite(Led1, digitalRead(button1)); digitalWrite(Led2, digitalRead(button2)); . Не могли бы вы немного рассказать о том, чего вы хотите достичь, поскольку это ограничило бы множество различных подходов, которые вы могли бы использовать. Если вы хотите прочитать большое количество кнопок и изменить соответствующие им светодиоды, вы можете использовать массив для номеров контактов кнопок и массив. Затем используйте цикл for, чтобы прочитать каждую из кнопок одну за другой и запустить некоторый код. Это уменьшит количество «дублирующегося» кода., @Gerben


2 ответа


1

Корпус переключателя не кажется эффективным способом управления светодиодами. Было бы разумнее (и, возможно, проще) вместо этого создать функцию для управления светодиодами.

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);

,

1

Если вы хотите использовать отдельную кнопку для каждого светодиода, то нецелесообразно использовать оператор 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));
      // и так далее
    }
,