Массив влияет на значения цифрового чтения
Я хочу включить светодиод с помощью двух кнопок. Если какая-либо из кнопок нажата, я хочу, чтобы светодиод включался, пока кнопка нажата, и не выключался, если ничего не нажимается. У меня есть два набора кода, они оба делают одно и то же, но второй набор кода заставляет светодиод оставаться во включенном положении, даже когда ничего не нажимается, и я не понимаю, почему ... я использую понижающие резисторы на обоих кнопки.
Это первый набор кода, который работает правильно:
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)
код работает только для первой или второй кнопки в массиве... но не для обеих???
2 ответа
Я не согласен с тем, что ваш первый скетч работает. Я предполагаю, что очень быстро мигающий светодиод кажется «включенным».
Когда вы логически описываете то, что должно произойти, вы можете поместить это в код.
Логика такая: светодиод горит, если нажата хотя бы одна из кнопок.
Другими словами: светодиод не горит, если ни одна кнопка не нажата, иначе светодиод горит.
В результате этой логики светодиод горит, если нажата вторая кнопка, а после этого отпускается первая кнопка. Думаю, это нормально.
Для двух кнопок можно проверить оба условия.
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);
Похоже, вы создали 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}
};
, массив из двух инициализированных объектов кнопок?
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
sizeof(buttons)
не является количеством элементов в массиве. это размер в байтах. так что вы читаете и другие пины. используйте#define BUTTONS_COUNT 2
, @Juraj«Если какая-либо из кнопок нажата, я хочу, чтобы светодиод включался, пока кнопка нажата, и не гас, если ничего не нажимается» — просто соедините кнопки параллельно и используйте только 1 контакт ввода-вывода ;-), @SBF