我希望能够在没有任何东西的情况下启动该程序,然后当我按下按钮一次时,它应该切换为红色,然后如果你再次按下它应该切换到绿色,然后再次按下它应该去蓝色。毕竟,当你再次按下按钮时它应该关闭,然后它就会循环。
这是我一直在使用的东西,但它似乎失败了 当您第一次按下按钮时它总是变为红色,如果再次按下它,它什么都不做。如果你继续发送垃圾邮件按钮,它会随机切换所有颜色,但永远不会关闭。
void loop() {
int toRed = digitalRead(button);
if (toRed == HIGH){
switchtoRed();
delay(250); // Give you time to take your finger off the button.
int toGreen = digitalRead(button);
if (toGreen == HIGH) {
switchtoGreen();
delay(250);
int toBlue = digitalRead(button);
if (toBlue == HIGH) {
switchtoBlue();
delay(250);
int state = digitalRead(button);
if (state == HIGH) {
return;
}
}
}
}
}
答案 0 :(得分:1)
问题是代码中的逻辑是有缺陷的。在您按下按钮之前,digitalRead
功能正在等待。相反,实际发生的是loop
函数被重复调用,你只是真正测试最外面的按钮测试,或者如果你垃圾按钮,你可能很幸运,让它循环通过每个颜色。
相反,您想要的只是测试按钮,如果已经按下,则增加一个变量以指示应该打开什么灯。类似的东西:
int pressed = 0;
int state = 0;
void loop()
{
if(digitalRead(button)==HIGH)
{
if(pressed==0)
{
pressed=1;
switch(state)
{
case 0:
switchToRed();
state++;
break;
case 1:
switchToGreen();
state++;
break;
case 2:
switchToBlue();
state++;
break;
case 3:
switchToOff();
state=0;
break;
}
}
}
else
{
pressed=0;
}
}
答案 1 :(得分:0)
使用状态机设计模式方法可以做到这样的事情:
int nextState = 0;
void loop(){
while(1){
if(digitalRead(button) == HIGH){
switch(nextState){
case 0: // Red Button
switchToRed();
break;
case 1: // Green Button
switchToGreen();
break;
case 2: // Blue Button
switchToBlue();
break;
case 3: // Switch off
switchOff();
break;
}
nextState = (nextState + 1) % 4;
delay(250);
}
// or you can delay here
}
}
如果你不想在案例3之后继续;你可以在案例3中使用return
语句来打破循环。