2014-09-13 135 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

相关问题