arduino 新手求教,如何用millis()实现LED间歇闪烁?-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5569|回复: 14

[已解决] arduino 新手求教,如何用millis()实现LED间歇闪烁?

[复制链接]
发表于 2021-7-7 09:42 | 显示全部楼层 |阅读模式
本帖最后由 arduinoeason 于 2021-7-8 11:17 编辑

arduino 新手求教,如何用millis()实现LED间歇闪烁?
目标:实现LED闪烁两次,然后间隔1秒,再闪烁2次,循环运行。


设计的代码:

unsigned long pretime1 = 0; //记录上次调节的时间时刻
unsigned long time1; //记录程序运行时间
boolean on1 = false; //记录灯的亮灭状态
int runNum1=0; //计数器 记录循环次数

void setup(){
pinMode(13,OUTPUT);
}

void loop(){
time1 = millis();
    if(runNum1<=2){ //计数器小于2次

        if((time1 - pretime1) == 500 && on1 == false){ //灯熄灭时长
        digitalWrite(13,HIGH); //灯点亮
        pretime1 = time1;  // 计时归零
        on1 = true;
        }


        if((time1 - pretime1) == 500 && on1 == true){ //灯熄灭时长
        digitalWrite(13,LOW);//灯熄灭
        pretime1 = time1;
        on1 = false;
        }
    runNum1 = runNum1+1; //运行一遍,计数器+1
    }

    else{
        if((time1 - pretime1) == 3000 && on1 == false){ //灯熄灭时长3秒
        digitalWrite(13,LOW);//灯1灭
        pretime1 = time1;
        on1 = false;
        }
    runNum1=0; //计数器归0
    }
}


问题:目前只实现闪烁,没有出现间隔。
请教:问题出在哪里?该如何修改呢?

发表于 2021-7-7 11:22 | 显示全部楼层
  1. unsigned long pretime1 = 0; //记录上次调节的时间时刻
  2. unsigned long time1;        //记录程序运行时间
  3. boolean on1 = false;        //记录灯的亮灭状态
  4. int runNum1 = 0;            //计数器 记录循环次数

  5. void setup()
  6. {
  7.   pinMode(13, OUTPUT);
  8. }

  9. void loop()
  10. {
  11.   time1 = millis();
  12.   if (runNum1 <= 3)
  13.   { //计数器小于2次

  14.     if ((time1 - pretime1) == 500 && on1 == false)
  15.     {                         //灯熄灭时长
  16.       digitalWrite(13, HIGH); //灯点亮
  17.       pretime1 = time1;       // 计时归零
  18.       on1 = true;
  19.       runNum1 = runNum1 + 1; //运行一遍,计数器+1
  20.     }

  21.     if ((time1 - pretime1) == 500 && on1 == true)
  22.     {                        //灯熄灭时长
  23.       digitalWrite(13, LOW); //灯熄灭
  24.       pretime1 = time1;
  25.       on1 = false;
  26.       runNum1 = runNum1 + 1; //运行一遍,计数器+1
  27.     }
  28.   }

  29.   else
  30.   {
  31.     if ((time1 - pretime1) == 3000 && on1 == false)
  32.     {                        //灯熄灭时长3秒
  33.       digitalWrite(13, LOW); //灯1灭
  34.       pretime1 = time1;
  35.       on1 = false;
  36.       runNum1 = 0; //计数器归0
  37.     }
  38.   }
  39. }
复制代码
发表于 2021-7-7 11:23 | 显示全部楼层
计数方式 有点问题 看着改就行了
发表于 2021-7-7 13:33 | 显示全部楼层
if((time1 - pretime1) == 500
if((time1 - pretime1) == 3000
为True的几率极小。
 楼主| 发表于 2021-7-7 13:57 | 显示全部楼层

感谢指点迷津,每一步都计数:亮是1步,灭是不同的两步。1亮、2短灭、3亮、4长灭,(循环).
发表于 2021-7-8 00:34 | 显示全部楼层
首先,不太明白這麼簡單的題目為何要用計數器將它複雜化?
再來,不懂你的時間是怎麼排,假設:
1.LED 亮 0.5秒
2.LED 滅 0.5秒
3.LED 亮 0.5秒
4.LED 滅 2 秒
重覆 1~4 動作,如果有循環作動次數限制再加上
計數器;如果是無限循環作動就不必再加計數器

if 的條件判斷就以這個計時器來運作即可,例如
一開始先記錄現在時間(計時器歸零),再來就是條件判斷:

1.如果時間經過 <=0.5秒,LED 亮,否則:
    2.如果時間經過 >0.5秒 & <=1.0秒,LED 滅,否則:
        3.如果時間經過 >1.0秒 & <=1.5 秒,LED 亮,否則:
            4..如果時間經過 >1.5秒 & <=3.5 秒,LED 滅,否則:
                5.重新記錄現在時間(計時器歸零)

這組條件判斷式會讓 LED 無限循環閃爍,如果有需要計數器
並判斷作動次數,就加在 5. 那邊,判斷式最前面再追加個
0.判斷計數器值是否未到達停止次數...
細節部份你可以自己再想想
发表于 2021-7-8 08:02 | 显示全部楼层
arduinoeason 发表于 2021-7-7 13:57
感谢指点迷津,每一步都计数:亮是1步,灭是不同的两步。1亮、2短灭、3亮、4长灭,(循环).
...

按楼上说的  ==500 和 ==3000 建议把==改成>   你如果还有其他更多的代码需要跑  可能有概率会错过这个值
 楼主| 发表于 2021-7-8 08:31 | 显示全部楼层
shouzama 发表于 2021-7-8 00:34
首先,不太明白這麼簡單的題目為何要用計數器將它複雜化?
再來,不懂你的時間是怎麼排,假設:
1.LED 亮 0.5秒

您讲得很有道理,我把计时问题考虑复杂了,我按照您的建议,试一下连续计时并且设置判断条件。感谢!
 楼主| 发表于 2021-7-8 08:31 | 显示全部楼层
ifeue 发表于 2021-7-7 13:33
if((time1 - pretime1) == 500
if((time1 - pretime1) == 3000
为True的几率极小。

谢谢解答
 楼主| 发表于 2021-7-8 08:32 | 显示全部楼层
ahua7336 发表于 2021-7-8 08:02
按楼上说的  ==500 和 ==3000 建议把==改成>   你如果还有其他更多的代码需要跑  可能有概率会错过这个值 ...

谢谢解答,我尝试一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-29 03:59 , Processed in 0.075023 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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