我在勤奋的脑机器人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;
}
}
答案 0 :(得分:0)
通用代码调试在这里是偏离主题的
您每个周期都在写LED
使用绝对时间代替计划事件的相对时间,仅在需要时更新
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;
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)
{
}
}
}