一段时间后,arduino按钮状态从HIGH切换到LOW状态

时间:2016-08-25 08:56:17

标签: arduino arduino-uno arduino-ide

功能

用户按下红色圆顶按钮(不是2状态按钮),因此必须在第一次按下“0” - >“1”&当再次按下“1” - >“0”时。

因此,按下时,串行监视器将每隔100ms从“0”打印“1”。该行为表示buttonState从LOW切换为HIGH

此外,LED条纹也连接到arduino。因此,当按钮状态在串行监视器中显示为高电平时,LED状态将在延迟10秒后切换到高电平,并在切换到低电平状态之前保持高电平状态10秒。

最后,buttonState应在延迟(25秒)后从HIGH切换到LOW,而无需用户实际按下按钮。

问题:

此时,用户必须按下红色圆顶按钮才能在LOW&高州。因此,当按钮初始状态为LOW时,它在串行监视器中显示“0”,按下时,按钮将切换到HIGH,在串行监视器中显示“1”,再次按下按钮时,它将从从高到低,在串行监视器中显示“0”。

因此,在没有用户按下按钮的情况下,我想请求如何让buttonstate从HIGH切换到LOW。

因此, 的 correctBehaviour:

初始状态:“0”显示在串行监视器中,当用户按下按钮按钮状态在串行监视器中显示“1”时,在计数25秒后,按钮状态将切换到低电平而无需用户再次按下按钮。 / p>

代码:

const int buttonPin = 2; //the number of the pushbutton pin
const int Relay     = 4; //the number of the LED relay pin

uint8_t    stateLED = LOW;
uint8_t      btnCnt = 1;

int buttonState = 0; //variable for reading the pushbutton status
int buttonLastState = 0;
int outputState = 0;

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT); 
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, LOW);
}

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)
 {
      switch (btnCnt++) {
        case 100:
        stateLED = LOW;
         digitalWrite(Relay, HIGH); // after 10s turn on
         break;

       case 200:
         digitalWrite(Relay, LOW); // after 20s turn off
         break;

       case 202: // small loop at the end, to do not repeat the LED cycle
         btnCnt--;
         break;    
       }

       Serial.println("1");
  }else{
    Serial.println("0");
    if (btnCnt > 0) {  
       // disable all:
       stateLED = LOW;
       digitalWrite(Relay, LOW);
    }
    btnCnt = 0;
  }

  delay(100);
}

1 个答案:

答案 0 :(得分:0)

我猜您的代码几乎是正确的。

在案例200中:我也切换输出状态,返回默认状态。

顺便说一句: btncnt 是一个误导性的名称,因为你计算100毫秒间隔,而不是按下按钮或类似。

IMO,延迟(100); 是一个可接受的妥协:仍然按下按钮,但没有正确使用 if(millis() - lastpressed&gt; 20000){< / em> ...