如何用一个按钮实现LED不同状态的切换-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 635|回复: 6

[未解决] 如何用一个按钮实现LED不同状态的切换

[复制链接]
发表于 2022-3-5 22:36 | 显示全部楼层 |阅读模式
新手刚学习,遇到个问题,要求用一个按钮控制一个LED灯三种状态:按一次,灯以5秒间隔闪烁;再按一次,灯变成呼吸灯闪烁;再按一次,灯又以0.5秒间隔闪烁,该怎么实现呢?
用中断可以是可以,但是5秒间隔的时间里中断,回来之后还是继续延时,直到5秒,不能实现按下按键马上就切换状态,有没有好的办法,可以让中断之后马上就进入下一个状态呢?
发表于 2022-3-5 22:59 | 显示全部楼层
這種小功能完全不必用上中斷,
只要用上輪詢(LOOP)就可以了

重點是點燈的時間控制(含呼吸)
不能用 delay() 指令,要活用 millis(),
再用 >=< 等條件判定式來決定
點燈狀態,因為沒有 delay() 的
等待時間,收到按鍵觸發可以立即
作出反應

millis() 的討論站內很多了,請...爬文...
发表于 2022-3-6 14:57 | 显示全部楼层
使用变量,建立变量a,使用变量a=0且按键按下,a赋值为1,让灯闪烁。
发表于 2022-3-6 17:03 | 显示全部楼层
 楼主| 发表于 2022-3-6 17:18 | 显示全部楼层
感谢各位指点,现在闪烁切换状态没问题了,但是呼吸灯状态时,按下按键还是不能马上切换到下一个状态,必须等for循环结束才能切换到下一个状态,change1是中断函数,当符合条件了,用中断跳出也不行,break也不能终止for循环
    case 3:
      for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 1) {
         analogWrite(lightPin, fadeValue);         
            if (status1 != 3)
            {
                     break;  
            }  
          delay(30);      
        }                           
      for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 1) {
         analogWrite(lightPin, fadeValue);
            if (status1 != 3)
            {
                     break;  
            }  
         delay(30);
       }
     break;         
   }         
}
void change1() {
if ((millis() - time) > 25){
      status1++;
         if (status1 >= 4) {
         status1 = 1;
          }
  time= millis();
    }
}
 楼主| 发表于 2022-3-6 17:19 | 显示全部楼层
但是同样代码,加上“  Serial.println("");”这句,就可以实现,中断按键按下,for循环立刻终止   
case 3:
      for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 1) {
         analogWrite(lightPin, fadeValue);         
            if (status1 != 3)
            {
                     break;  
            }  
          delay(30);   
         Serial.println("");         
        }                           
      for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 1) {
         analogWrite(lightPin, fadeValue);
            if (status1 != 3)
            {
                     break;  
            }  
        Serial.println("");
         delay(30);
       }
     break;         
   }         
}
void change1() {
if ((millis() - time) > 25){
      status1++;
         if (status1 >= 4) {
         status1 = 1;
          }
     Serial.println(status1);
  time= millis();
    }
}
实在搞不懂是什么原因

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 13:36 , Processed in 0.080464 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表