Arduino打开一个2秒钟,然后关闭并等待3秒再重新开始

时间:2014-09-13 03:09:04

标签: algorithm arduino microcontroller electronics

我在勤奋的脑机器人Mx4cK中使用微控制器PIC 32。 我在我的protoboard上实现了开关,我想在开关激活后打开一个LED,然后这个led必须处于这种状态2秒钟然后再关闭3秒并开始全部再次(开 - > 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); 
}        

}

实际上我的代码,闪烁了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;
      }



}

2 个答案:

答案 0 :(得分: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更改

答案 1 :(得分: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)
          {  
          }

    }
}