"Простой" код...Но что я сделал не так?

Этот код компилируется без проблем, но не работает вообще... Переключатель не устанавливает низкий уровень светодиода, и цикл while не работает, плюс серийная печать не печатается.... Пока я не включу цикл while, нажатие любой кнопки изменит состояние светодиода. Я хотел сделать последовательность "кнопка один, смена светодиода, ЗАТЕМ кнопка два". Я уверен, что что-то упустил...

const int buttonPin1 = 2;     // номер кнопки 1 pin 2
const int buttonPin2 = 7;     // номер кнопки 2 pin 7
const int ledPin = 13;      // номер светодиодного вывода

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

void setup() {
// инициализировать вывод светодиода в качестве вывода:
  pinMode(ledPin, OUTPUT);
// инициализировать вывод кнопки 1 в качестве входного сигнала:
  pinMode(buttonPin1, INPUT);
// инициализировать вывод кнопки 2 в качестве входного сигнала:
  pinMode(buttonPin2, INPUT);
  Serial.begin(9600);
}

void loop() {

  digitalWrite(ledPin, HIGH);

// считайте состояние значения кнопки:
  buttonState1 = digitalRead(buttonPin1);

// проверьте, нажата ли кнопка.
// если это так, то buttonState ВЫСОК:

  if (buttonState1 == HIGH) {
// выключить светодиод:   // 
    digitalWrite(ledPin, LOW);
    while (1) {
      (buttonState1 == LOW);
      if (buttonState1 == LOW) {
        Serial.println("1");
      }
      {
        break;
      }
    }

    delay[1000];

    digitalWrite(ledPin, HIGH);

// считайте состояние значения кнопки 2:
    buttonState2 = digitalRead(buttonPin2);
    if (buttonState2 == HIGH) {
// выключить светодиод:
      while (1) {
        if (buttonState2 == LOW) {
          break;
        }
      }
      digitalWrite(ledPin, LOW);

      delay(10000);
      digitalWrite(ledPin, HIGH);

    }
  }
}

, 👍2

Обсуждение

Ваш код считывает реальное состояние *buttonPin1* только один раз и копирует значение *как оно есть в данный момент* в переменную *buttonState1*, которая после этого больше не будет изменять или отражать реальное состояние кнопки (значение *buttonState1* не будет автоматически меняться при нажатии или отпустите кнопку 1). Если вы хотите продолжать проверять текущее состояние кнопки, вы должны постоянно считывать порт ввода-вывода, используя, где это уместно, операторы digitalRead (). То же самое относится и к *buttonPin2*., @StarCat

Я предполагаю, что поскольку функция "name" в основном является указателем, действительно можно написать delay[1000]; :D К счастью, она не была вызвана, поэтому она ничего не делает :D, @KIIV

@KIIV, я этого не заметил, хороший улов!, @StarCat


1 ответ


Лучший ответ:

1

Я думаю, что существует непонимание того, как работают переменные.

Ваш код считывает реальное состояние buttonPin1 только один раз (перед первым оператором if ()) и копирует значение, считанное из порта ввода-вывода в том виде, в каком оно есть в данный момент, в переменную buttonState1, выполнив buttonState1 = digitalRead(buttonPin1);.

После копирования значения, считанного с порта buttonPin1, в переменную buttonState1 эта переменная больше не будет изменять или отражать фактическое состояние кнопки. Т. е. значение переменной buttonState1 не будет автоматически меняться при нажатии или отпускании кнопки 1. buttonState1 является обычной программной переменной и не связано с порт ввода-вывода.

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

То же самое касается buttonPin2 и buttonState2.

,