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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: arduinoeason

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

[复制链接]
 楼主| 发表于 2021-7-8 17:55 | 显示全部楼层
本帖最后由 arduinoeason 于 2021-7-8 17:59 编辑
shouzama 发表于 2021-7-8 00:34
首先,不太明白這麼簡單的題目為何要用計數器將它複雜化?
再來,不懂你的時間是怎麼排,假設:
1.LED 亮 0.5秒

根据上述逻辑,我写了以下代码:
unsigned long pretime1=0;
unsigned long time1;

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

void loop()
{
  time1 = millis();

    if ((time1 - pretime1) <= 500 )
    {
      digitalWrite(13, HIGH);
    }
    else
    {
       if ((time1 - pretime1) > 500 && (time1 - pretime1) <= 1000 )
       {
         digitalWrite(13, LOW);
       }
    }


    if ((time1 - pretime1) > 1000 && (time1 - pretime1) <= 1500 )
    {
      digitalWrite(13, HIGH);
    }
    else
    {
       if ((time1 - pretime1) > 1500 && (time1 - pretime1) <= 3500 )
       {
         digitalWrite(13, LOW);
       }
    }
    pretime1 = time1;  
}



经运行,不论采用“&”或是“&&”,这个灯始终是“长亮”、不会闪烁,不是何故?

发表于 2021-7-8 22:47 | 显示全部楼层
arduinoeason 发表于 2021-7-8 17:55
根据上述逻辑,我写了以下代码:
unsigned long pretime1=0;
unsigned long time1;

我習慣第一次的計時器歸零寫在 setup() 裏
void setup()
{
  pinMode(13, OUTPUT);
  pretime1 = millis();
}
那麼進入 loop() 就可以被立即判斷執行,不必
等到 loop() run過一次後才被執行,不過也沒
差多少就是了 ^^

再來,if 的條件判斷式要在同一區段中寫完所有
判定階層(就像我舉的例子是一次寫完 5 階層的
if else),不能分段寫,你都能寫出 2 階層了,弄成
更多階層應該也不難

不能將歸零 pretime1=millis();  寫在判定式外
的獨立部份,這樣一來每次 loop() 一跑完就會將
計時器歸零,那麼計時器就會一直處於計時 <0.5
秒的區間內,等於 LED 長亮不滅...

P.S.我覺得 time1 是多餘的,直接用 millis() 不就
好了? 不過這個就看各人的 CODING  STYLE,
沒什麼對/錯
发表于 2021-7-8 23:07 | 显示全部楼层
本帖最后由 shouzama 于 2021-7-8 23:09 编辑

  1. #define LED 13
  2. unsigned long PRETIME1=0;
  3. unsigned long TIME1=0;

  4. void setup()
  5. {
  6.   pinMode(LED, OUTPUT);
  7.   PRETIME1=millis();
  8. }

  9. void loop()
  10. {
  11.   TIME1 = millis()-PRETIME1;
  12.   if (TIME1 <= 500 )
  13.     digitalWrite(LED, HIGH);
  14.   else
  15.   {
  16.     if (TIME1 > 500 && TIME1 <= 1000 )
  17.       digitalWrite(LED, LOW);
  18.     else
  19.     {
  20.       if (TIME1 > 1000 && TIME1 <= 1500 )
  21.         digitalWrite(LED, HIGH);
  22.       else
  23.       {
  24.         if (TIME1 > 1500 && TIME1 <= 3500 )
  25.           digitalWrite(LED, LOW);
  26.         else
  27.           PRETIME1 = millis();
  28.       }
  29.     }
  30.   }
  31. }
复制代码

我沒 RUN 過,你自己 RUN RUN 看,有問題自己修正

 楼主| 发表于 2021-7-9 09:33 | 显示全部楼层
shouzama 发表于 2021-7-8 22:47
我習慣第一次的計時器歸零寫在 setup() 裏
void setup()
{

正如您的分析,“pretime1 = time1;”的位置经过调整,灯就闪烁了。


    if ((time1 - pretime1) > 1000 && (time1 - pretime1) <= 1500 )
    {
      digitalWrite(13, HIGH);
    }
    else
    {
       if ((time1 - pretime1) > 1500 && (time1 - pretime1) <= 3500 )
       {
         digitalWrite(13, LOW);
         pretime1 = time1;
       }
    }
 楼主| 发表于 2021-7-9 09:36 | 显示全部楼层
本帖最后由 arduinoeason 于 2021-7-9 09:37 编辑
shouzama 发表于 2021-7-8 23:07
我沒 RUN 過,你自己 RUN RUN 看,有問題自己修正

谢谢您,这段代码运行了,这样连续嵌套的if else是可以闪烁的!学习到了连续嵌套的用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-29 04:01 , Processed in 0.071467 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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