Кнопки и светодиоды

Я создаю программу, которая включает и выключает светодиод. Когда две кнопки считаются «высокими». Но есть нюанс: первая кнопка должна оставаться «высокими», пока не будет нажата вторая кнопка и светодиод не загорится. Вот мой код на данный момент.

// Булева логика для кнопочного переключателя
boolean currentState = LOW;    //хранилище текущего состояния кнопки
boolean lastState = LOW;      //хранилище последнего состояния кнопки
boolean ifcondState = LOW;    //хранилище текущего состояния ifturn (выкл/вкл)


// устанавливаем номера пинов:
const int buttonPinA = 3;     // номер контакта кнопки
const int buttonPin1 = 4;     // номер контакта кнопки
const int ledPin =  13;      // номер контакта светодиода
const int ifcond =  12;      // номер контакта ifcond
const int ifturn =  11;      // номер контакта ifturn

// переменные изменятся:
int buttonStateA = 0;         // переменная для чтения состояния кнопки
int buttonState1 = 0;         // переменная для чтения состояния кнопки
int buttonStateIf = 0;         // переменная для чтения статуса условия If

void setup() {
//инициализировать последовательное соединение
Serial.begin(9600);
// инициализируем вывод светодиода как выход:
pinMode(ledPin, OUTPUT);
// инициализируем вывод кнопки как вход:
pinMode(buttonPinA, INPUT);
// инициализируем вывод кнопки как вход:
pinMode(buttonPin1, INPUT);
// Если условный вывод
pinMode(ifcond, OUTPUT);
// Если Turnon Pin
pinMode(ifturn, INPUT);

}

void loop() {
  // считываем состояние значений кнопок:
  currentState = digitalRead(buttonPinA);
  buttonState1 = digitalRead(buttonPin1);
  buttonStateIf = digitalRead(ifturn);

  // проверяем, нажата ли кнопка.
  // если это так, то buttonState имеет значение HIGH:
  if (currentState == HIGH && lastState == LOW){    // если кнопка была только что нажата
    Serial.println("pressed");
    //задержка(1);

    //переключить состояние ifcond
    if (ifcondState == HIGH){
      digitalWrite(ifcond, LOW);
      ifcondState = LOW;
    }
    else {
      digitalWrite(ifcond, HIGH);
      ifcondState = HIGH;
    }
  }
  lastState = currentState;

  if (ifturn == HIGH && buttonState1 == HIGH) {
    digitalWrite(ledPin, HIGH);
  }
  else ();
  digitalWrite(ledPin, LOW);
}

У меня контакты 12 (ifcond) и 11 (ifturn) соединены вместе. Контакт 12 действует как кнопка для контакта 11. Когда на нём высокий уровень, контакт 11 считывает изменение.

Код работает следующим образом: когда на ButtonpinA поступает высокий уровень, на контакте 12 тоже появляется высокий уровень и остаётся высоким до следующего нажатия кнопки. Именно эта часть не работает. Контакт 11 должен считывать сигнал, независимо от того, есть ли на контакте 12 высокий уровень или нет. Если на нём высокий уровень, и на Button1 тоже высокий уровень, светодиод должен загореться, но этого не происходит.

Извините за возможные недоразумения. Спасибо.

, 👍0

Обсуждение

Я не понимаю, что вы хотите сделать. К тому же, else(); довольно странный. Возможно, вам стоит подумать о том, как сделать кнопки не дребезжащими., @Gerben

Я хочу иметь возможность нажать и отпустить кнопку А, а затем нажать кнопку 1 каждый раз, когда я захочу включить светодиод., @liljoey112


1 ответ


1
if (ifturn == HIGH && buttonState1 == HIGH) {
  digitalWrite(ledPin, HIGH);
}
else ();
digitalWrite(ledPin, LOW);

Я думаю, вы здесь допустили небольшую ошибку.

Вы говорите: «Если на обоих входах высокий уровень, то включите светодиод, в противном случае ничего не делайте», и сразу после этого «Выключите светодиод».

Поэтому светодиод включается, когда оба уровня высокие, и тут же выключается снова, так быстро, что вы вообще не видите, как светодиод загорается.

Я думаю, вы имели в виду следующее:

if (ifturn == HIGH && buttonState1 == HIGH) {
  digitalWrite(ledPin, HIGH);
} else {
  digitalWrite(ledPin, LOW);
}

Таким образом, светодиод включится, если оба сигнала будут ВЫСОКОГО уровня, в противном случае светодиод выключится, только если тест на высокий уровень обоих сигналов не пройден.

,