查看: 3976|回复: 24

[已解决] 新手刚接触millis不久,请问使用millis函数可以实现以下blink...

[复制链接]

该用户从未签到

发表于 2020-9-1 20:31 | 显示全部楼层 |阅读模式



我引用范例的blink例子说明吧:
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}


void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(100);
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}



就是100毫秒快闪2下,停顿500毫秒,如此往复,希望大佬指点一下

签到天数: 312 天

[LV.8]以坛为家I

发表于 2020-9-3 23:55 | 显示全部楼层
Hitomi21 发表于 2020-9-3 19:55
还是不行额,无论我是放在setup()里,还是做unsigned long 声明,都是和之前结果一样,4个放一起就乱,新 ...

我就覺得怪怪的,如果 4 段程式是各自獨立,
為何你的程式到後來是一堆 } } } ...??
然後再仔細看你的程式碼,你好像將應該
各自獨立的 4 段程式碼全混在一起了...

点评

此楼正解 if (A) { if (B) { if (C) { XXX; }}} 等价于 if (A && B && C) { XXX; }  发表于 2020-9-4 01:05

签到天数: 71 天

[LV.6]常住居民II

发表于 2020-9-1 20:37 | 显示全部楼层
用个标志位记录下要执行的状态和间隔就行了

该用户从未签到

 楼主| 发表于 2020-9-1 20:54 | 显示全部楼层
XlinliY.Zhang 发表于 2020-9-1 20:37
用个标志位记录下要执行的状态和间隔就行了

我使用案例blinkwithoutdelay,const long interval = 100;
间隔改成了100,LED就一直在进行100毫秒的闪烁,那我需要怎么实现停顿500毫秒的动作呢?

签到天数: 312 天

[LV.8]以坛为家I

发表于 2020-9-1 22:55 | 显示全部楼层
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(100);
digitalWrite(LED_BUILTIN, HIGH);
delay(100);
digitalWrite(LED_BUILTIN, LOW);
delay(500);

這個有點像我先前幫同事寫的模型飛機
用的爆閃燈的樣子,閃二下停一下,不過我
是以1000ms當一個循環時間,也就是
ON 125ms+OFF 125ms+ON 125ms+OFF 625ms

我的做法是先記錄下 millis() 當時間基準點,
1.當經過時間在 125ms 內→點亮 LED,否則
2.當經過時間在 250ms 內→熄滅 LED,否則
3.當經過時間在 375ms 內→點亮 LED,否則
4.當經過時間在 1000ms 內→熄滅 LED,否則
5.若經過時間 >= 1000ms,重新記錄 millis(),
也就是時間基準點歸零重設,讓循環從頭再來

该用户从未签到

 楼主| 发表于 2020-9-2 00:23 | 显示全部楼层
shouzama 发表于 2020-9-1 22:55
這個有點像我先前幫同事寫的模型飛機
用的爆閃燈的樣子,閃二下停一下,不過我
是以1000ms當一個循環時間,也 ...

谢谢指导,我消化研究一下
我也是在写模型闪灯,因为我需要复数led同时去运行各自闪烁代码,delay不能实现,millis刚接触又没理解透,想找个类似案例,好像也没看到有

签到天数: 312 天

[LV.8]以坛为家I

发表于 2020-9-2 02:44 | 显示全部楼层
Hitomi21 发表于 2020-9-2 00:23
谢谢指导,我消化研究一下
我也是在写模型闪灯,因为我需要复数led同时去运行各自闪烁代码,de ...

若依照我說的寫法,你可以有多組閃燈同時啟動,
啟動的時間點及閃爍的方式各組都可各別控制,
每個閃燈都寫一段類似的條件判定式及相對應
的控制就可以了 ^^
#define WW_LED         2
#define WW_ON        125
#define WW_OFF        625
unsigned long FLASH_START_TIME = 0;

void loop()
{
        if ( millis()-FLASH_START_TIME <= WW_ON )
                 digitalWrite( WW_LED, HIGH );
        else
        {
                if ( millis()-FLASH_START_TIME <= WW_ON*2 )
                        digitalWrite( WW_LED, LOW );
                else
                {
                        if ( millis()-FLASH_START_TIME <= WW_ON*3 )
                                digitalWrite( WW_LED, HIGH );
                        else
                        {
                                if ( millis()-FLASH_START_TIME <= (WW_ON*3+WW_OFF) )
                                        digitalWrite( WW_LED, LOW );
                                     else
                                        FLASH_START_TIME = millis();               
                        }
                }
        }
}

该用户从未签到

 楼主| 发表于 2020-9-2 14:33 | 显示全部楼层
shouzama 发表于 2020-9-2 02:44
若依照我說的寫法,你可以有多組閃燈同時啟動,
啟動的時間點及閃爍的方式各組都可各別控制,
每個閃燈都寫 ...

昨晚我在油管看的millis教程有一段说到创建event,应该就是这个思路了吧,感谢大佬解答

该用户从未签到

 楼主| 发表于 2020-9-2 18:18 | 显示全部楼层
shouzama 发表于 2020-9-2 02:44
若依照我說的寫法,你可以有多組閃燈同時啟動,
啟動的時間點及閃爍的方式各組都可各別控制,
每個閃燈都寫 ...

大佬,有个新的问题,用了这段代码后我这里的LED亮度变得非常低啊,亮度大概是50/255这样子吧,是什么原因呢?

签到天数: 312 天

[LV.8]以坛为家I

发表于 2020-9-3 01:04 | 显示全部楼层
Hitomi21 发表于 2020-9-2 18:18
大佬,有个新的问题,用了这段代码后我这里的LED亮度变得非常低啊,亮度大概是50/255这样子吧,是什么原 ...

把你的程式 & 電路圖貼上來看看吧,
不然不知道怎麼猜...

話說回來,我只貼了"控制部份"的程式,
setup() 裏的 I/O 宣告、初始化難道
你都沒做?

该用户从未签到

 楼主| 发表于 2020-9-3 03:24 | 显示全部楼层
shouzama 发表于 2020-9-3 01:04
把你的程式 & 電路圖貼上來看看吧,
不然不知道怎麼猜...

是打错了pinMode,后面补回去就好了。

现在有个新问题,就是我照着代码加了几个led灯组,然后开始乱闪了,我贴代码给你看看~

#define WW_LED         2
#define WW_LED2        3
#define WW_LED3        6
#define WW_LED4        7

#define WW_ON        30
#define WW_OFF       180
#define WW_ON2       60
#define WW_OFF2      300




unsigned long FLASH_START_TIME = 0;
unsigned long FLASH_START_TIME2 = 0;
unsigned long FLASH_START_TIME3 = 180;
unsigned long FLASH_START_TIME4 = 300;


void setup(){
  pinMode( WW_LED, OUTPUT );
  pinMode( WW_LED2, OUTPUT );
  pinMode( WW_LED3, OUTPUT );
  pinMode( WW_LED4, OUTPUT );
}
void loop()
{
  //.......................................................................... LED1
  if ( millis()-FLASH_START_TIME <= WW_ON2 )
       digitalWrite( WW_LED, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME <= WW_ON2*2 )
       digitalWrite( WW_LED, LOW );
  else
{
  if ( millis()-FLASH_START_TIME <= WW_ON2*3 )
       digitalWrite( WW_LED, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME <= WW_ON2*4 )
       digitalWrite( WW_LED, LOW );
  else
{
  if ( millis()-FLASH_START_TIME <= WW_ON2*5 )
       digitalWrite( WW_LED, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME <= (WW_ON2*5+WW_OFF2) )
       digitalWrite( WW_LED, LOW );
  else
  FLASH_START_TIME = millis();
}
//..........................................................................  LED2   
{
  if ( millis()-FLASH_START_TIME4 <= WW_ON2 )
       digitalWrite( WW_LED2, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME4 <= WW_ON2*2 )
       digitalWrite( WW_LED2, LOW );
  else
{
  if ( millis()-FLASH_START_TIME4 <= WW_ON2*3 )
       digitalWrite( WW_LED2, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME4 <= WW_ON2*4 )
       digitalWrite( WW_LED2, LOW );
  else
{
  if ( millis()-FLASH_START_TIME4 <= WW_ON2*5 )
       digitalWrite( WW_LED2, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME4 <= (WW_ON2*5+WW_OFF2 ))
       digitalWrite( WW_LED2, LOW );
  else
  FLASH_START_TIME4 = millis();
}
///////////////////////////////////////////////////////////////
//.......................................................................... LED3
{  if ( millis()-FLASH_START_TIME2 <= WW_ON )
       digitalWrite( WW_LED3, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME2 <= WW_ON*2 )
       digitalWrite( WW_LED3, LOW );
  else
{
  if ( millis()-FLASH_START_TIME2 <= WW_ON*3 )
       digitalWrite( WW_LED3, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME2 <= WW_ON*4 )
       digitalWrite( WW_LED3, LOW );
  else
{
  if ( millis()-FLASH_START_TIME2 <= WW_ON*5 )
       digitalWrite( WW_LED3, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME2 <= (WW_ON*5+WW_OFF) )
       digitalWrite( WW_LED3, LOW );
  else
  FLASH_START_TIME2 = millis();
}      
//.......................................................................... LED4
{  if ( millis()-FLASH_START_TIME3 <= WW_ON )
       digitalWrite( WW_LED4, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME3 <= WW_ON*2 )
       digitalWrite( WW_LED4, LOW );
  else
{
  if ( millis()-FLASH_START_TIME3 <= WW_ON*3 )
       digitalWrite( WW_LED4, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME3 <= WW_ON*4 )
       digitalWrite( WW_LED4, LOW );
  else
{
  if ( millis()-FLASH_START_TIME3 <= WW_ON*5 )
       digitalWrite( WW_LED4, HIGH );
  else
{
  if ( millis()-FLASH_START_TIME3 <= (WW_ON*5+WW_OFF) )
       digitalWrite( WW_LED4, LOW );
  else
  FLASH_START_TIME3 = millis();  
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
                              
1和2还是正常的,就后面3和4乱闪,我的理解是时间从0开始走,然后到标注点开始执行,正常应该是各做各的,现在看3和4是被干扰到的样子,。不知道是我理解错了,然后写错代码还是具体哪部分细节搞错了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

毕设求助!max30102与gy906实现脉搏体温测量
毕设求助!max30102与gy90
各位大佬,我最近在搞毕业设计,想通过arduino,max30102,gy906实现脉搏体温测量,但
arduino解码sbus
arduino解码sbus
市面上有很多sbus接收机,它只有一根线就可以实现很多通道的通信,其本质利用了串口通
香蕉派 BPI-R3 开源路由器开发板采用 联发科MT7986(Filogic 830)
香蕉派 BPI-R3 开源路由器
香蕉派 BPI-R3 开源路由器开发板采用 联发科MT7986(Filogic 830)芯片设计,支持Wi-Fi 6
求智能垃圾桶编程代码
求智能垃圾桶编程代码
求大佬解答 很急!!
安信可ESP32点灯APP自动浇花和天气空气质量
安信可ESP32点灯APP自动浇
本人是完全不懂C语言,大部分都是借鉴各位大佬的,没有时间和精力去学习C语言,能达
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表