2014-09-13 153 views
0

我在勤奮的cerebot Mx4cK中使用微控制器PIC 32。 我在原型板上安裝了開關,我想在啓動開關後打開一個LED,然後LED必須處於這種狀態2秒鐘,然後必須再關閉3秒鐘,然後重新開始( > 2秒關 - > 3秒)Arduino打開領先2秒,然後關閉並等待3秒,然後重新開始

這是我的代碼到目前爲止,我認爲它缺少一個條件,但我找不到它...你能幫助我嗎?

const int led=PIN_LED1; 
const int pinSwitch1=16; 

void setup() 
{ 
    pinMode(pinSwitch1,INPUT); 
    pinMode(led,OUTPUT); 
    digitalWrite(led,LOW); 
} 
void loop() 
{ 
    unsigned long actual_time=millis(); 
    static unsigned long cicle_time=0; 
    static unsigned long off_time=0; 

    static int switch_state1=0; 

    switch_state1=digitalRead(pinSwitch1); 

    if (switch_state1==HIGH) 
    { 
     if((actual_time-cicle_time)<5000) 
    { 
     digitalWrite(led,HIGH); 
     cicle_time=actual_time; 
    } 
     if((actual_time-off_time)>2000) 
     { 
     digitalWrite(led,LOW); 
     off_time=actual_time; 
     } 

} 
else 
{ 
    digitalWrite(led,LOW); 
}   

} 

其實我的代碼,blincks 2秒,它不認爲它必須關閉3秒。

[這是我的新代碼,我缺少的初始條件,以光首次]

const int的LED = PIN_LED1; const int pinSwitch1 = 16;

void setup() 
{ 
    pinMode(pinSwitch1,INPUT); 
    pinMode(led,OUTPUT); 
    digitalWrite(led,LOW); 
} 
void loop() 
{ 
    unsigned long actual_time=millis(); 
    static unsigned long cicle_time=0; 
    static unsigned long off_time=0; 

    static int switch_state1=0; 

    static int cicle_on=0; 

    switch_state1=digitalRead(pinSwitch1); 

    if (switch_state1==HIGH) 
    { 
     if((actual_time-cicle_time)>5000) 
    { 
     digitalWrite(led,HIGH); 
     cicle_time=actual_time; 
     cicle_on=HIGH; 
    } 
    } 
else 
{ 
    digitalWrite(led,LOW); 
}   

     if((actual_time-off_time)>2000) 
     { 
     digitalWrite(led,LOW); 
     off_time=actual_time; 
     cicle_on=LOW; 
     } 



} 
+0

這是完整的代碼?如果不是那麼millis()會返回什麼? – Harsha 2014-09-13 07:10:18

+0

Millis()這是一個函數,如果arduino:返回從Arduino開始運行當前程序以來的毫秒數。大約50天后,這個數字會溢出(回到零)。 – cotita 2014-09-13 13:34:05

+0

嘗試下面我發佈的解決方案.. – Harsha 2014-09-13 13:36:37

回答

0
  1. 通用代碼的調試是題外話這裏

    • ,你甚至不指定這是什麼做的,而不是它應該做的
  2. 你寫LED每個週期

    • 這會減慢速度
    • 當你添加更多的東西,然後它可以給你很多頭年齡後
  3. 使用絕對時間,而不是相對你的計劃中的活動並在需要時只更新

    static unsigned long time_LED_on =0xFFFFFFFF; 
        static unsigned long time_LED_off=0xFFFFFFFF; 
        //... 
        if ((switch_state1==HIGH)&&(time_LED_on!=0xFFFFFFFF)) // init on switch toggle only would be better in interrupt 
         { 
         time_LED_on =actual_time; 
         time_LED_off=actual_time+2000; 
         } 
        if (switch_state1==LOW) // stop if switch off also would be better in interrupt 
         { 
         time_LED_on =0xFFFFFFFF; 
         time_LED_off=0xFFFFFFFF; 
         } 
        // handle LED event 
        if (time_LED_on >=actual_time) { digitalWrite(led,HIGH); time_LED_on +=5000; } 
        if (time_LED_off>=actual_time) { digitalWrite(led,LOW); time_LED_off+=5000; } 
    
    • 當心到時候能漫過你可以通過
    • if (min(all_times) > max) all_times -= max;
    • 處理它不知道有多少位平臺有如果不是32,則改變0xFFFFFFFF acordingly
+0

@user_ing btw有些MCU的PWM模塊可以配置爲這個任務,然後您只需在開關中斷時啓動/停止它,其餘的都由HW完成。只是設置比例2:3和期限爲5秒:) – Spektre 2014-09-13 07:08:28

+0

這是一個32位平臺,我將編輯我的問題,以澄清我的代碼做什麼,而不是應該做什麼,謝謝 – cotita 2014-09-13 13:40:57

+0

@user_ing你誤會了離開那部分它是什麼應該照原樣做。只需添加你的代碼,而不是它應該的東西:)但你的編輯正是我的意圖,所以不要介意:) – Spektre 2014-09-13 15:16:19

0

這應該解決您的問題:

const int led=PIN_LED1; 
    const int pinSwitch1=16; 
    unsigned long cicle_time=0; 
    void setup() 
    { 
     pinMode(pinSwitch1,INPUT); 
     pinMode(led,OUTPUT); 
     digitalWrite(led,LOW); 
    } 
    void loop() 
    { 
     unsigned long actual_time=0; 
     static int switch_state1=0 
     switch_state1=digitalRead(pinSwitch1); 
     digitalWrite(led,LOW); 
     while(switch_state1==HIGH) 
      { 
      digitalWrite(led,HIGH); 
      cicle_time=millis(); 
      while((millis()-cicle_time)!>=2000) 
     {  
     } 
     cicle_time=millis(); 
     digitalWrite(led,LOW); 
      while((millis()-circle_time)!>=3000) 
      { 
      } 

    } 
} 
+0

我不能使用延遲,我需要使用我在我的問題中公開的時間關係... – cotita 2014-09-13 13:36:47

+0

不,沒有工作,led從不熄滅:/ – cotita 2014-09-13 18:42:35

+0

你確定millis()返回ms的時間嗎? – Harsha 2014-09-13 19:01:27

相關問題