极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15300|回复: 6

长按按钮,如何让LED点亮三秒后息灭?

[复制链接]
发表于 2014-10-14 12:26:06 | 显示全部楼层 |阅读模式
本帖最后由 hjhhsl35158 于 2014-10-14 17:33 编辑
  1. void setup()
  2. {
  3. pinMode(A0,INPUT_PULLUP);
  4. pinMode(13,OUTPUT);
  5. }

  6. void loop()
  7. {
  8. if(digitalRead(A0)==LOW)
  9. {
  10.   digitalWrite(13,HIGH);
  11.   delay (3000);
  12.   digitalWrite(13,LOW);
  13. }
  14. }
复制代码
现在的情况就是长按按钮就会隔三秒闪一次,不会息灭。我是新手,代码该如何修改?谢谢!
回复

使用道具 举报

发表于 2014-10-14 13:51:57 | 显示全部楼层
本帖最后由 i7456 于 2014-10-14 14:06 编辑
  1. int ledPin =  13;      // the number of the LED pin
  2. int buttonPin = 3;
  3. int ledState;            
  4. long previousMillis = 0;      
  5. long interval = 3000;         
  6. void setup() {
  7.   pinMode(ledPin, OUTPUT);
  8.   pinMode(buttonPin, INPUT_PULLUP);  
  9. }
  10. void loop()
  11. {
  12.   unsigned long currentMillis = millis();

  13. //如果按键未按下(高电平),定义为状态0;更新按键未按下的最新时间标签      
  14.   if((digitalRead(buttonPin) == HIGH)){
  15.     ledState = 0;
  16.     previousMillis = currentMillis;
  17.   }  

  18. //如果检测到按键按下(下降沿),定义为状态1
  19.   if((ledState==0)&&(digitalRead(buttonPin)==LOW)){
  20.     delay(20);
  21.     ledState = 1;  
  22.   }

  23. //如果按键按下(低电平)时间超过3秒钟,定义为状态2
  24.   if((ledState == 1)&&(currentMillis - previousMillis > interval))
  25.     ledState = 2;  

  26. //如果状态为1,让灯亮   
  27.   if(ledState == 1)
  28.     digitalWrite(ledPin, HIGH);
  29. //如果状态不为1,让灯灭
  30.   else
  31.     digitalWrite(ledPin, LOW);  
  32. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-14 17:28:08 | 显示全部楼层
i7456 发表于 2014-10-14 13:51

非常感谢i7456的兄弟!代码已测试过了,和我想要的功能一样。
回复 支持 反对

使用道具 举报

发表于 2014-10-15 01:05:24 | 显示全部楼层
楼主的代码只差一刀,我来补刀

  1. void setup()
  2. {
  3.     pinMode(A0, INPUT_PULLUP);
  4.     pinMode(13, OUTPUT);
  5. }

  6. void loop()
  7. {
  8.     if(digitalRead(A0) == LOW)
  9.     {
  10.         digitalWrite(13, HIGH);
  11.         delay (3000);
  12.         digitalWrite(13, LOW);
  13.         while(digitalRead(A0) == LOW) {}
  14.     }
  15. }
复制代码


差倒数第三行while
回复 支持 反对

使用道具 举报

发表于 2014-10-15 09:27:36 | 显示全部楼层
本帖最后由 i7456 于 2014-10-15 09:30 编辑

程序里要尽量避免使用较长时间的延时,死循环。当程序的功能稍复杂时,如果延时过长,实时性会非常差。

平时自己写程序时,最好避免使用长时间的延时,对以后写复杂些的程序有好处。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-15 15:17:32 | 显示全部楼层
Ansifa 发表于 2014-10-15 01:05
楼主的代码只差一刀,我来补刀

void setup()

感谢拨刀相助!想问一下为什么后面要加一对大括号呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-15 15:24:24 | 显示全部楼层
i7456 发表于 2014-10-15 09:27
程序里要尽量避免使用较长时间的延时,死循环。当程序的功能稍复杂时,如果延时过长,实时性会非常差。

...

明白了,再次感谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 01:48 , Processed in 0.103994 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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