為什麼要這麼折磨人了......... 求解脫......-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 790|回复: 8

[已解决] 為什麼要這麼折磨人了......... 求解脫......

[复制链接]
发表于 2022-1-20 23:06 | 显示全部楼层 |阅读模式
本帖最后由 andywwf 于 2022-2-3 15:47 编辑

我有一閃燈程序預備給小朋友裝上積木車上.
程序已弄好, 單獨閃燈測試是沒有問題.
但一結合按鈕開關, 就不行了.

閃燈程序如下:
1) 接上電源 -> LED_1閃2次, 換LED_2閃2次.......loop (兩燈交替互閃)
2) 按一下開關 -> 關閉所有LED
3) 再按一弄開關 -> 返回第一點 (LED_1閃2次, 換LED_2閃2次.......loop)

但問題出現了, 因為預設是一接電是LED ON, 閃燈沒有問題, 關也OK, 就是再開2閃燈就變成同步一起閃了.
請問是什麼原因?
謝謝
  1. // constants won't change. Used here to set a pin number:
  2. #define ledPin1 8      // police light A
  3. #define ledPin2 9      // police light B

  4. #define WW_ON2 60
  5. #define WW_OFF2 300

  6. const int  buttonPin = 2;   // the pin that the pushbutton is attached to

  7. // Variables will change:
  8. int ledState1 = 0; // ledState used to set the LED
  9. int ledState2 = 0;

  10. // Variables will change:
  11. int buttonPushCounter = 0;   // counter for the number of button presses //because if (buttonPushCounter % 3 == 0)
  12. int buttonState = 0;         // current state of the button
  13. int lastButtonState = 0;     // previous state of the button

  14. /*
  15. // Generally, you should use "unsigned long" for variables that hold time
  16. // The value will quickly become too large for an int to store
  17. unsigned long previousMillis = 0;        // will store last time LED was updated
  18. unsigned long previousMillis2 = 0;
  19. */

  20. unsigned long FLASH_START_TIME = 0;
  21. unsigned long FLASH_START_TIME3 = 300;


  22. /*
  23. // constants won't change:
  24. const long interval = 500; // interval at which to blink (milliseconds)
  25. const long interval2 = 100;
  26. */

  27. void setup() {
  28.   // set the digital pin as output:
  29.   pinMode(ledPin1, OUTPUT);
  30.   pinMode(ledPin2, OUTPUT);
  31.   
  32.   pinMode(buttonPin, INPUT);  // initialize the button pin as a input:
  33.   Serial.begin(9600);         // initialize serial communication:
  34. }

  35. void loop()
  36. {
  37.   // read the pushbutton input pin:
  38.   buttonState = digitalRead(buttonPin);

  39.   // compare the buttonState to its previous state
  40.   if (buttonState != lastButtonState) {
  41.     // if the state has changed, increment the counter
  42.     if (buttonState == HIGH) {
  43.       // if the current state is HIGH then the button went from off to on:
  44.       buttonPushCounter++;
  45.       Serial.println("on");
  46.       Serial.print("number of button pushes: ");
  47.       Serial.println(buttonPushCounter);
  48.     } else {
  49.       // if the current state is LOW then the button went from on to off:
  50.       Serial.println("off");
  51.     }
  52.     // Delay a little bit to avoid bouncing
  53.     delay(50);
  54.   }
  55.   // save the current state as the last state, for next time through the loop
  56.   lastButtonState = buttonState;
  57.   
  58.   // here is where you'd put code that needs to be running all the time.

  59.   // check to see if it's time to blink the LED; that is, if the difference
  60.   // between the current time and last time you blinked the LED is bigger than
  61.   // the interval at which you want to blink the LED.
  62.   unsigned long currentMillis = millis();

  63.   

  64.   // turns on the LED every four button pushes by checking the modulo of the
  65.   // button push counter. the modulo function gives you the remainder of the
  66.   // division of two numbers:
  67.   if (buttonPushCounter % 2 == 0) {
  68. //.......................................................................... LED1
  69. if(millis()>FLASH_START_TIME){
  70. if(millis()-FLASH_START_TIME<=WW_ON2)
  71.    digitalWrite(ledPin1,HIGH);
  72.   else{
  73.       if(millis()-FLASH_START_TIME<=WW_ON2*2)
  74.          digitalWrite(ledPin1,LOW);
  75.         else{
  76.             if(millis()-FLASH_START_TIME<=WW_ON2*3)
  77.                digitalWrite(ledPin1,HIGH);
  78.               else{
  79.                   if (millis()-FLASH_START_TIME<=WW_ON2*4)
  80.                       digitalWrite(ledPin1,LOW);
  81.                      else{
  82.                          if(millis()-FLASH_START_TIME<=WW_ON2*5)
  83.                             digitalWrite(ledPin1,HIGH);
  84.                            else{
  85.                                if(millis()-FLASH_START_TIME<=(WW_ON2*5+WW_OFF2))
  86.                                   digitalWrite(ledPin1, LOW);
  87.                                  else{
  88.                                      FLASH_START_TIME=millis();
  89.                                  }
  90.                            }
  91.                      }
  92.               }
  93.         }
  94.   }
  95. }
  96. //.......................................................................... LED2
  97. if(millis()>FLASH_START_TIME3){
  98. if((millis()-FLASH_START_TIME3)<=WW_ON2)
  99.    digitalWrite(ledPin2,HIGH);
  100.   else{
  101.       if(millis()-FLASH_START_TIME3<=WW_ON2*2)
  102.          digitalWrite(ledPin2,LOW);
  103.         else{
  104.             if(millis()-FLASH_START_TIME3<=WW_ON2*3)
  105.                digitalWrite(ledPin2,HIGH);
  106.               else{
  107.                   if (millis()-FLASH_START_TIME3<=WW_ON2*4)
  108.                       digitalWrite(ledPin2,LOW);
  109.                      else{
  110.                          if(millis()-FLASH_START_TIME3<=WW_ON2*5)
  111.                             digitalWrite(ledPin2,HIGH);
  112.                            else{
  113.                                if(millis()-FLASH_START_TIME3<=(WW_ON2*5+WW_OFF2))
  114.                                   digitalWrite(ledPin2,LOW);
  115.                                    else{
  116.                                      FLASH_START_TIME3=millis();
  117.                                  }
  118.                                 
  119.                            }
  120.                      }
  121.               }
  122.         }
  123.   }
  124. }
  125.      
  126.     // set the LED with the ledState of the variable:
  127.     digitalWrite(ledPin1, ledState1);
  128.     digitalWrite(ledPin2, ledState2);
  129.    
  130.     }else {
  131.     digitalWrite(ledPin1, LOW);
  132.     digitalWrite(ledPin2, LOW);
  133.    
  134.    }
  135. }
复制代码


发表于 2022-1-21 07:53 | 显示全部楼层
給你個提示
currentMillis
 楼主| 发表于 2022-1-21 08:30 | 显示全部楼层
shouzama 发表于 2022-1-21 07:53
給你個提示
currentMillis

你好!
unsigned long currentMillis = millis();

我已經做了以上聲明, 不對嗎?

我是新手, 可否詳細一點, 因程度有限. 謝謝!
发表于 2022-1-21 11:00 | 显示全部楼层
本帖最后由 shouzama 于 2022-1-21 11:03 编辑
andywwf 发表于 2022-1-21 08:30
你好!
unsigned long currentMillis = millis();

你宣告了這個變數並且用來記錄當下的時間值,
但程式中卻完全沒用上它,你不覺得奇怪?
 楼主| 发表于 2022-1-21 18:58 | 显示全部楼层
shouzama 发表于 2022-1-21 11:00
你宣告了這個變數並且用來記錄當下的時間值,
但程式中卻完全沒用上它,你不覺得奇怪?  ...

不好意思! 我真的是新手.

我認為 currentMillis = millis(),
所以 millis = currentMillis

我在程式中有用 millis() , 我就算它是當前的計時 currentMillis.
你這樣說, 恐怕我是理解錯誤了.

程式我是從示範 stateChangeDetection 和 論壇中看到的, 邊嘗試邊學習併出來.  
請問可否指導一下我??
謝謝!
 楼主| 发表于 2022-1-21 19:32 | 显示全部楼层
andywwf 发表于 2022-1-21 18:58
不好意思! 我真的是新手.

我認為 currentMillis = millis(),

是喔!
我發現逻辑 不對不通了.
我最後是FLASH_START_TIME3=millis()

按照我的逻辑都是不通.
millis() = currentMillis = FLASH_START_TIME3

.................
发表于 2022-1-21 22:00 | 显示全部楼层
本帖最后由 shouzama 于 2022-1-21 22:03 编辑
andywwf 发表于 2022-1-21 19:32
是喔!
我發現逻辑 不對不通了.
我最後是FLASH_START_TIME3=millis()

是啊,你發現你邏輯不通了,當然程式不會依你所想的運行
millis() 是系統提供的計時參數,單位 1/1000 秒(毫秒),
從一通電就開始運行遞加,直到它溢位歸零重頭再來

所以你要把它想像成一個掛在牆上自行運轉的時鐘,
你只能看它、記下它的時間(currentMillis),用你記下
的時間跟牆上時間做比對來得知從你上次記下後已經
經過多少時間,到達你所要的時間差後你想做什麼、
什麼時候重新記下時間再來跟牆上時鐘比對...

你不設任何條件隨時都在記時間(歸零計時基準),你記
下了時間但完全不用,所以你的程式跑得完全沒有基準
或亂用基準,所以我提示你時間基準值很重要,要學會
何時重設它,如何用它來比對時間差、進行輸出

好了,你再回頭看看別人的程式,有沒有什麼不一樣的
認知了?


 楼主| 发表于 2022-1-21 22:39 | 显示全部楼层
shouzama 发表于 2022-1-21 22:00
是啊,你發現你邏輯不通了,當然程式不會依你所想的運行
millis() 是系統提供的計時參數,單位 1/1000 秒(毫 ...

thankyou shouzama,
受教了, 我再回頭重看一遍, 再消化一下你的說話.
謝謝指導!
发表于 2022-1-23 12:05 | 显示全部楼层
本帖最后由 shouzama 于 2022-1-23 12:09 编辑

https://youtu.be/p0Tcipwm46c
時間我設定 100ms(60ms太快了),大概就是這樣的感覺
  1. /*
  2. 警車燈光控制 2022.01.23
  3. 使用 ATTINY13A 單晶片+紅、藍LED(燈光)
  4. 單晶片關機電壓準位設定為 2.7V,電源建議使用 3.6~4.2V 鋰離子電池
  5. 使用 1.2MHz 內建基頻(低頻省電考量)

  6. 2022.01.23          以 MODEL_MIX 檢具為基礎硬體, VEHICLE 程式為基礎進行修改:
  7.                 1.POWER ON 時紅、藍燈交替點亮,點亮方式各閃爍 2 次(DUTY 100ms ON/OFF)
  8.                 2.觸發開關每按一次,熄燈/點燈交替切換

  9. 草稿碼使用了 618 bytes (60%) 的程式儲存空間。上限為 1024 bytes。
  10. 全域變數使用了 16 bytes (25%) 的動態記憶體,剩餘 48 bytes 給區域變數。上限為 64 bytes 。
  11. */
复制代码


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

本版积分规则

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

GMT+8, 2024-11-28 15:40 , Processed in 0.099936 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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