Arduino 制作RGB二极管的单按钮开关级
我希望能够在没有打开的情况下启动程序,然后当我按下按钮一次时,它应该切换为红色,如果你再按一次,它应该切换为绿色,再按一次,它应该变为蓝色。毕竟,当你再次按下按钮时,它应该关闭,然后它只是循环 以下是我一直在使用的工具,但它似乎失败了。Arduino 制作RGB二极管的单按钮开关级,arduino,Arduino,我希望能够在没有打开的情况下启动程序,然后当我按下按钮一次时,它应该切换为红色,如果你再按一次,它应该切换为绿色,再按一次,它应该变为蓝色。毕竟,当你再次按下按钮时,它应该关闭,然后它只是循环 以下是我一直在使用的工具,但它似乎失败了。 当你第一次按下按钮时,它总是变成红色,如果你再按一次,它什么也不做。如果你一直对按钮乱发信息,它会在所有颜色中随机切换,但从不关闭 void循环(){ int toRed=数字读取(按钮); 如果(存储==高){ 切换到(); 延迟(250);//给你时间把手指
当你第一次按下按钮时,它总是变成红色,如果你再按一次,它什么也不做。如果你一直对按钮乱发信息,它会在所有颜色中随机切换,但从不关闭
void循环(){
int toRed=数字读取(按钮);
如果(存储==高){
切换到();
延迟(250);//给你时间把手指从按钮上拿开。
int toGreen=数字读取(按钮);
如果(toGreen==高){
开关绿色();
延迟(250);
int toBlue=数字读取(按钮);
如果(toBlue==高){
switchtoBlue();
延迟(250);
int状态=数字读取(按钮);
如果(状态==高){
返回;
}
}
}
}
}
您可以使用状态机设计模式方法执行类似操作:
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
语句中断循环。问题在于代码中的逻辑有缺陷。它的作用就好像在您按下按钮之前,digitalRead
功能一直在等待。相反,实际发生的情况是,循环
函数被反复调用,而您只真正测试最外层的按钮测试,或者如果您发送垃圾邮件,您可能会幸运地让它在每种颜色之间循环
相反,您需要的只是测试按钮,如果按下了按钮,则增加一个变量以指示应该亮起的灯。比如:
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;
}
}
失败似乎不是一个有用的问题描述。它以什么方式特别失败?很抱歉描述不好,希望编辑可以帮助描述它。谢谢太棒了,你忘了做nextState++;在switchToX之后,但这完全有效!不,我把它放在switch语句之外,在它们之后运行。我看到了,但是在每种情况下,如果没有nextState++和nextState=(nextState+1)%4,程序将无法工作;如果您在switch语句的每种情况下或在switch语句之外编写increment语句,则情况是一样的。它将以两种方式跟踪每个案例。谢谢你的解释,你对我的逻辑是正确的,抱歉,我是C新手。虽然你的代码由于某些原因无法立即从红色>绿色>蓝色切换,但它会逐渐淡入其他颜色,如:红色>黄色>绿色>青色>蓝色,然后在关闭时慢慢淡出。哈哈,我只是需要延迟,现在它可以正常工作了。谢谢