Массив влияет на значения цифрового чтения

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

Это первый набор кода, который работает правильно:

class Button {

  public:

    int pin;
    int state;
    int location;
    int Speed;
    int Direction;
    int active;
    int prevstate;

    Button(int pin1, int state1, int location1, int active1, int previousState)
    {
      pin = pin1;
      state = state1;
      location = location1;
      active = active1;
      prevstate = previousState;
    }
};

Button button(7,0,0,0,0);
Button button2(8,0,0,0,0);
Button buttons[2] = {button, button2};

void setup() {
      pinMode(ledPin, OUTPUT); 
}

void loop() {
   if (digitalRead(button2.pin) == HIGH){
             digitalWrite(ledPin, HIGH);
          } else {
          // выключаем светодиод:
          digitalWrite(ledPin, LOW);
          }
       if (digitalRead(button.pin) == HIGH){
             digitalWrite(ledPin, HIGH);
          } else {
          // выключаем светодиод:
          digitalWrite(ledPin, LOW);
          }
}

Это код, который я хочу использовать, но он не работает. Светодиод остается включенным:

void loop(){
  for (int i = 0; i<sizeof(buttons); i++){
    if(digitalRead(buttons[i].pin) == HIGH){
          digitalWrite(ledPin, HIGH);
          } else {
          // выключаем светодиод:
          digitalWrite(ledPin, LOW);
          }
    }
}

а также, если я изменюсь

if(digitalRead(buttons[i].pin) == HIGH)

в

if(digitalRead(buttons[0].pin) == HIGH)

код работает только для первой или второй кнопки в массиве... но не для обеих???

, 👍0

Обсуждение

sizeof(buttons) не является количеством элементов в массиве. это размер в байтах. так что вы читаете и другие пины. используйте #define BUTTONS_COUNT 2, @Juraj

«Если какая-либо из кнопок нажата, я хочу, чтобы светодиод включался, пока кнопка нажата, и не гас, если ничего не нажимается» — просто соедините кнопки параллельно и используйте только 1 контакт ввода-вывода ;-), @SBF


2 ответа


0

Я не согласен с тем, что ваш первый скетч работает. Я предполагаю, что очень быстро мигающий светодиод кажется «включенным».

Когда вы логически описываете то, что должно произойти, вы можете поместить это в код.

Логика такая: светодиод горит, если нажата хотя бы одна из кнопок.
Другими словами: светодиод не горит, если ни одна кнопка не нажата, иначе светодиод горит.

В результате этой логики светодиод горит, если нажата вторая кнопка, а после этого отпускается первая кнопка. Думаю, это нормально.

Для двух кнопок можно проверить оба условия.

if (digitalRead(button.pin) == HIGH || digitalRead(button2.pin) == HIGH)
  digitalWrite(ledPin, HIGH);
else
  digitalWrite(ledPin, LOW);

Или проверьте НИЗКИЙ уровень:

if (digitalRead(button.pin) == LOW && digitalRead(button2.pin) == LOW)
  digitalWrite(ledPin, LOW);
else
  digitalWrite(ledPin, HIGH);

Для нескольких кнопок можно использовать bool или можно подсчитать количество нажатых кнопок.

Фиксированное число размера массива легко и с меньшей вероятностью ошибки:

#define BUTTONS_COUNT 2

Также можно использовать sizeof(). Общий размер необходимо разделить на размер одного элемента:

int count = 0;
for (int i = 0; i<sizeof(buttons)/sizeof(Button); i++) {
  if (digitalRead(buttons[i].pin) == HIGH) {
    count++;
  }
}

if (count == 0)
  digitalWrite(ledPin, LOW);
else
  digitalWrite(ledPin, HIGH);
,

1

Похоже, вы создали 4 объекта-кнопки: button, button2 и button[2]. button[0] и button[1] — это полные объекты кнопок, первый член которых, .pin, инициализируется адресами button и button2 соответственно. Вероятно, это не то, что вы хотели.

Вы хотели создать:

Button buttons[2] = {
   {7,0,0,0,0},
   {8,0,0,0,0}
};

, массив из двух инициализированных объектов кнопок?

,