Arduino 按钮不在连续序列号“1”上

Arduino Button is not on continuous Serial "1"

功能:

串行监视器每 100 毫秒打印一次“0”,表示按钮状态为低电平。

然而,当用户按下红色圆顶按钮时 Red Dome Button,假设按钮状态为高电平并且在串行监视器上,它应该每 100 毫秒打印一次“1”,直到用户按下再次显示红色圆顶按钮表示按钮状态为低并且串行监视器正在打印“0”。

问题:

串行监视器最初每 100 毫秒输出“0”,当我按下红色圆顶按钮时,buttonState return 为高电平,串行监视器输出“1”。但是,序列号“1”不成立,它会立即恢复为“0”。

串行“1”只会在我连续按下按钮时显示在串行监视器中。

含义:

正确行为:

初始状态->串口监视器将输出所有串口0直到用户按下按钮然后串口监视器将输出所有串口1直到用户再次按下按钮然后输出将变为串口0

当前行为:

初始状态->串口监视器将输出所有串口0,直到用户按下按钮,然后串口监视器将输出串口1,但立即,串口将return变为0

那么,如何让按下按钮后串口状态保持为串口1,再次按下按钮串口状态才显示为0呢?我需要一些帮助。谢谢

代码:

const int buttonPin = 2;     // the number of the pushbutton pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  Serial.begin(9600); // Open serial port to communicate 
 }

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    Serial.println("1");
  }
  else {
    Serial.println("0");
  }
 delay(100);
}

您的按钮似乎在您松开后就没有被按下(不像 2 状态按钮)。因此,您需要创建自己的状态变量,在按下按钮时进行切换。

假设您想要在从按钮检测到 HIGH 时更改状态。这意味着您必须检测从 LOW 到 HIGH 的变化,而不仅仅是当它处于 HIGH 模式时。所以要做到这一点,你需要存储按钮的最后状态。此外,您需要保持输出状态,当检测到从低到高的变化时切换。

在你的代码中应该是这样的:

const int buttonPin = 2;     // the number of the pushbutton pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status
int buttonLastState = 0;
int outputState = 0;


void setup() {
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  Serial.begin(9600); // Open serial port to communicate 
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  // Check if there is a change from LOW to HIGH
  if (buttonLastState == LOW && buttonState == HIGH)
  {
     outputState = !outputState; // Change outputState
  }
  buttonLastState = buttonState; //Set the button's last state

  // Print the output
  if (outputState)
  {
     Serial.println("1");
  }
  else
  {
     Serial.println("0");
  }
  delay(100);
}