求助了很多論壇 , 都沒法解決的簡單問題.......-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1045|回复: 14

[已解决] 求助了很多論壇, 都沒法解決的簡單問題.......

[复制链接]
发表于 2022-1-16 19:13 | 显示全部楼层 |阅读模式
本帖最后由 andywwf 于 2022-1-20 22:53 编辑

目標:
ledPin1 閃2次 -> ledPin2 閃2次 -> ........loop (2 LED 交替閃2次)

問題:
程序寫好, 但就是不懂交替地閃動.
不知道在哪裡出了錯, 請求大佬出頭.

  1. #define ledPin1 8
  2. #define ledPin2 9

  3. #define WW_ON        60
  4. #define WW_OFF      300

  5. unsigned long FLASH_START_TIME = 0;
  6. unsigned long FLASH_START_TIME2 = 300;


  7. void setup(){
  8.   pinMode(ledPin1,OUTPUT);
  9.   pinMode(ledPin2,OUTPUT);
  10. }


  11. void loop(){
  12. //.......................................................................... LED1
  13. if(millis()-FLASH_START_TIME<=WW_ON)
  14.    digitalWrite(ledPin1,HIGH);
  15.   else{
  16.       if(millis()-FLASH_START_TIME<=WW_ON*2)
  17.          digitalWrite(ledPin1,LOW);
  18.         else{
  19.             if(millis()-FLASH_START_TIME<=WW_ON*3)
  20.                digitalWrite(ledPin1,HIGH);
  21.               else{
  22.                   if (millis()-FLASH_START_TIME<=WW_ON*4)
  23.                       digitalWrite(ledPin1,LOW);
  24.                      else{
  25.                          if(millis()-FLASH_START_TIME<=WW_ON*5)
  26.                             digitalWrite(ledPin1,HIGH);
  27.                            else{
  28.                                if(millis()-FLASH_START_TIME<=(WW_ON*5+WW_OFF))
  29.                                   digitalWrite(ledPin1, LOW);
  30.                                  else{
  31.                                      FLASH_START_TIME=millis();
  32.                                  }
  33.                            }
  34.                      }
  35.               }
  36.         }
  37.   }

  38. //.......................................................................... LED2
  39. if(millis()-FLASH_START_TIME2<=WW_ON)
  40.    digitalWrite(ledPin2,HIGH);
  41.   else{
  42.       if(millis()-FLASH_START_TIME2<=WW_ON*2)
  43.          digitalWrite(ledPin2,LOW);
  44.         else{
  45.             if(millis()-FLASH_START_TIME2<=WW_ON*3)
  46.                digitalWrite(ledPin2,HIGH);
  47.               else{
  48.                   if (millis()-FLASH_START_TIME2<=WW_ON*4)
  49.                       digitalWrite(ledPin2,LOW);
  50.                      else{
  51.                          if(millis()-FLASH_START_TIME2<=WW_ON*5)
  52.                             digitalWrite(ledPin2,HIGH);
  53.                            else{
  54.                                if(millis()-FLASH_START_TIME2<=(WW_ON*5+WW_OFF))
  55.                                   digitalWrite(ledPin2,LOW);
  56.                                  else{
  57.                                      FLASH_START_TIME2=millis();
  58.                                  }
  59.                            }
  60.                      }
  61.               }
  62.         }
  63.   }
  64. }
复制代码


发表于 2022-1-16 19:29 | 显示全部楼层
本帖最后由 topdog 于 2022-1-17 23:10 编辑

两个LED分别接第2和3管脚,循环交替各闪烁两次,用Nano实际验证通过的。

[pre]volatile  unsigned long starttime;
const int pin[] = {2, 3, 3, 2};
bool LedOn = false;

void setup() {
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 4; i++) {
    lamplighter(pin, 300, LOW );
   
    if (LedOn == true) {
      lamplighter(pin, 300, HIGH);
    }
  }
}

bool lamplighter (int LED, unsigned long intervaltime, bool state) {
  pinMode(LED, OUTPUT);

  if (millis() - starttime == intervaltime) {
    digitalWrite(LED, state);
    starttime = millis();
    LedOn = true;
  }
  return LedOn;
}[/pre]
 楼主| 发表于 2022-1-16 21:07 | 显示全部楼层

我知道程式太累贅, 但初初學程度有限.
請問能解決嗎??
发表于 2022-1-17 00:54 | 显示全部楼层
andywwf 发表于 2022-1-16 21:07
我知道程式太累贅, 但初初學程度有限.
請問能解決嗎??

给你参考一下吧,班门弄斧见笑了。
https://www.arduino.cn/thread-101174-1-2.html
 楼主| 发表于 2022-1-17 18:28 | 显示全部楼层

謝謝! 可是我還未夠道行看得明白, 留起待有點經驗再研究.
在場有很多臥虎藏龍的, 只是不願出手罷.


看來師兄也是其中一員呢....
发表于 2022-1-17 18:50 | 显示全部楼层
要按顺序来触发灯闪,也就是加个状态,第1个灯闪完,才开始闪第2个灯。我也是新手,顺便问回复帖子一般是怎么粘贴代码上去的呢?是没权限吗?
发表于 2022-1-17 19:02 | 显示全部楼层
pnlaoxi 发表于 2022-1-17 18:50
要按顺序来触发灯闪,也就是加个状态,第1个灯闪完,才开始闪第2个灯。我也是新手,顺便问回复帖子一般是怎 ...

试试看
  1. #define ledPin1 8
  2. #define ledPin2 9

  3. #define WW_ON        60
  4. #define WW_OFF      300

  5. unsigned long FLASH_START_TIME = 0;
  6. unsigned long FLASH_START_TIME2 = 0;

  7. //灯闪选择状态标志
  8. //一开始led1闪,led2不闪
  9. boolean ledpin1_blink = true;  
  10. boolean ledpin2_blink = false;

  11. void setup() {
  12.   pinMode(ledPin1, OUTPUT);
  13.   pinMode(ledPin2, OUTPUT);
  14. }


  15. void loop() {

  16.   if (ledpin1_blink) {

  17.     //.......................................................................... LED1
  18.     if (millis() - FLASH_START_TIME <= WW_ON)
  19.       digitalWrite(ledPin1, HIGH);

  20.     else {
  21.       if (millis() - FLASH_START_TIME <= WW_ON * 2)
  22.         digitalWrite(ledPin1, LOW);
  23.       else {
  24.         if (millis() - FLASH_START_TIME <= WW_ON * 3)
  25.           digitalWrite(ledPin1, HIGH);
  26.         else {
  27.           if (millis() - FLASH_START_TIME <= WW_ON * 4)
  28.             digitalWrite(ledPin1, LOW);
  29.           else {
  30.             if (millis() - FLASH_START_TIME <= WW_ON * 5)
  31.               digitalWrite(ledPin1, HIGH);
  32.             else {
  33.               if (millis() - FLASH_START_TIME <= (WW_ON * 5 + WW_OFF))
  34.                 digitalWrite(ledPin1, LOW);
  35.               else {
  36.                 //FLASH_START_TIME = millis();
  37.                 ledpin1_blink = false;    //led1闪周期结束,led1闪状态设置为false
  38.                 ledpin2_blink = true;     //led2闪周期开启,led2闪状态设置为true
  39.                 FLASH_START_TIME2 = millis();   //保存led2闪间隔的初始时间,准备进入led2闪间隔
  40.               }
  41.             }
  42.           }
  43.         }
  44.       }
  45.     }
  46.   }

  47.   if (ledpin2_blink) {
  48.     //.......................................................................... LED2
  49.     if (millis() - FLASH_START_TIME2 <= WW_ON)
  50.       digitalWrite(ledPin2, HIGH);
  51.     else {
  52.       if (millis() - FLASH_START_TIME2 <= WW_ON * 2)
  53.         digitalWrite(ledPin2, LOW);
  54.       else {
  55.         if (millis() - FLASH_START_TIME2 <= WW_ON * 3)
  56.           digitalWrite(ledPin2, HIGH);
  57.         else {
  58.           if (millis() - FLASH_START_TIME2 <= WW_ON * 4)
  59.             digitalWrite(ledPin2, LOW);
  60.           else {
  61.             if (millis() - FLASH_START_TIME2 <= WW_ON * 5)
  62.               digitalWrite(ledPin2, HIGH);
  63.             else {
  64.               if (millis() - FLASH_START_TIME2 <= (WW_ON * 5 + WW_OFF))
  65.                 digitalWrite(ledPin2, LOW);
  66.               else {
  67.                 //FLASH_START_TIME2=millis();
  68.                 ledpin1_blink = true;     //led2闪周期结束,led2闪状态设置为false
  69.                 ledpin2_blink = false;    //led1闪周期开启,led1闪状态设置为true
  70.                 FLASH_START_TIME = millis();    //保存led1闪间隔的初始时间,准备进入led1闪间隔
  71.               }
  72.             }
  73.           }
  74.         }
  75.       }
  76.     }
  77.   }
  78. }
复制代码
发表于 2022-1-17 21:04 | 显示全部楼层
andywwf 发表于 2022-1-17 18:28
謝謝! 可是我還未夠道行看得明白, 留起待有點經驗再研究.
在場有很多臥虎藏龍的, 只是不願出手罷.

 楼主| 发表于 2022-1-17 22:14 | 显示全部楼层

謝謝指導!
我試了, 確是可以. 但是一個一個的排隊閃, 就失去millis的作用, 因為沒法再加其他燈效了.

Anyway, many thanks!
 楼主| 发表于 2022-1-17 22:15 | 显示全部楼层
本帖最后由 andywwf 于 2022-1-17 22:18 编辑
@topdog


出手吧! 高人!
別藏起來偷笑看凡塵
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 15:39 , Processed in 0.072555 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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