无名2587 发表于 2013-11-27 16:27:59

前一个帖子 还没有弄出来,这个求助一个简单的

我想用arduino编一个,led on 100ms off 100ms, on 100ms off 700ms的一个程序(也就是说连闪两下),不用delay的

现在用timer实在是编不出来了

文科生伤不起啊 ,求救各位大大了

林定祥 发表于 2013-11-27 16:45:29

最简单的方法是流水账;
loop{
Led On
delay()
Led off
delay()
Led On
delay()
Led off
delay()
}

无名2587 发表于 2013-11-27 16:51:43

林定祥 发表于 2013-11-27 16:45 static/image/common/back.gif
最简单的方法是流水账;
loop{
Led On


这个我知道,但是不能用delay,因为有别的程序也在跑,继续救助

在网上看用余数可以弄 led on 和 off 不同周期,但是on 两下就不会了:Q:Q

林定祥 发表于 2013-11-27 17:01:03

无名2587 发表于 2013-11-27 16:51 static/image/common/back.gif
这个我知道,但是不能用delay,因为有别的程序也在跑,继续救助

在网上看用余数可以弄 led on 和 off...

有定时命令milis()毫秒为单位

无名2587 发表于 2013-11-27 17:12:51

林定祥 发表于 2013-11-27 17:01 static/image/common/back.gif
有定时命令milis()毫秒为单位

if (m - time1 > interval1){
    time1 = m;

    if (value1 == LOW)
      value1 = HIGH;
    else
      value1 = LOW;

    digitalWrite(led1, value1);

这个的话 on 和off的时间是相同的,怎么弄成闪两下,就不会了,可能是我不会举一反三把,求助阿

万马奔腾 发表于 2013-11-27 17:52:24

无名2587 发表于 2013-11-27 17:12 static/image/common/back.gif
if (m - time1 > interval1){
    time1 = m;



如果有其它程序跑就需要使用定时中断

无名2587 发表于 2013-11-27 18:05:51

万马奔腾 发表于 2013-11-27 17:52 static/image/common/back.gif
如果有其它程序跑就需要使用定时中断

interrupt,之后往上加,现在第一步,双闪还母有整出来呢:Q

pathletboy 发表于 2013-11-27 20:24:01

#define LED_PIN 1//led 引脚

enum LED_STATE
{
    LED_ON,
    LED_OFF,
};

struct led_t
{
    LED_STATE state;
    uint32_t timeout;
};

struct led_state_t
{
    uint8_t i;
    uint32_t time;
};

#define LED_MAX_COUNT 4
struct led_t g_led=
{
    {
      LED_ON, 100
    }
    ,
    {
      LED_OFF, 100
    }
    ,
    {
      LED_ON, 100
    }
    ,
    {
      LED_OFF, 700
    }
    ,
};

struct led_state_t g_led_state =
{
    0, 0
};

void setLed(struct led_t *led)
{
    switch (led->state)
    {
    case LED_ON:
      digitalWrite(LED_PIN,LOW);
      break;
    case LED_OFF:
      digitalWrite(LED_PIN, HIGH);
      break;
    }
    g_led_state.time = millis() + led->timeout;
}

inline void checkLed()
{
    if(millis() >= g_led_state.time)
    {
      g_led_state.i++;
      if (g_led_state.i >= LED_MAX_COUNT)
            g_led_state.i = 0;
      setLed(&g_led);
    }
}

void setup()
{
    pinMode(LED_PIN, OUTPUT);
    setLed(&g_led);
}

void loop()
{
    checkLed();
}


无名2587 发表于 2013-11-27 21:24:44

pathletboy 发表于 2013-11-27 20:24 static/image/common/back.gif



int LED_pin = 2;
long ON_time = 300;
long OFF_time = 700;
long time = millis();
int value = LOW;

void setup() {

pinMode(LED_pin,OUTPUT);

}

void loop() {


unsigned long PERIOD = ON_time + OFF_time;
unsigned M_time;
unsigned long m =millis();
M_time = millis() % PERIOD;

if(M_time < ON_time) {
if (m - time > 100){
    time = m;
   
    if (value == LOW);
      value = HIGH;}
    else
      value = LOW;
      
digitalWrite(LED_pin, value);//turns LED on

} else {
digitalWrite(LED_pin, LOW);   //turns LED off

}
}

无名2587 发表于 2013-11-27 21:25:09

谢谢大家回复,终于弄出来了

无名2587 发表于 2013-11-27 23:40:33

还是不对,灯的亮度很暗,但是加上serial print就亮了,求告人指点


int LED_pin = 2;
long ON_time = 400;
long OFF_time = 700;
long time = millis();
int value = LOW;
int i;
void setup() {

pinMode(LED_pin,OUTPUT);
Serial.begin(9600);
}

void loop() {


unsigned long PERIOD = ON_time + OFF_time;
unsigned M_time;
unsigned long m =millis();
M_time = millis() % PERIOD;

if(M_time < ON_time) {

if (m - time > 190){
    time = m;
   
    if (value == LOW);
      value = HIGH;}
    else
      value = LOW;
    Serial.println(value);
digitalWrite(LED_pin, value);//turns LED on

} else
digitalWrite(LED_pin, LOW);   //turns LED off



}

无名2587 发表于 2013-11-28 00:40:13

pathletboy 发表于 2013-11-27 20:24 static/image/common/back.gif


好厉害,灯正常亮,(52行 54行 大大定义反了) 正在慢慢读,有很多行看不懂,谢谢大大了
页: [1]
查看完整版本: 前一个帖子 还没有弄出来,这个求助一个简单的