功能
用户按下红色圆顶按钮(不是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);
}
答案 0 :(得分:0)
我猜您的代码几乎是正确的。
在案例200中:我也切换输出状态,返回默认状态。
顺便说一句: btncnt 是一个误导性的名称,因为你计算100毫秒间隔,而不是按下按钮或类似。
IMO,延迟(100); 是一个可接受的妥协:仍然按下按钮,但没有正确使用 if(millis() - lastpressed&gt; 20000){< / em> ...