极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13400|回复: 11

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

[复制链接]
发表于 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()
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-27 16:51:43 | 显示全部楼层
林定祥 发表于 2013-11-27 16:45
最简单的方法是流水账;
loop{
Led On

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

在网上看用余数可以弄 led on 和 off 不同周期,但是  on 两下就不会了
回复 支持 反对

使用道具 举报

发表于 2013-11-27 17:01:03 | 显示全部楼层
无名2587 发表于 2013-11-27 16:51
这个我知道,但是不能用delay,因为有别的程序也在跑,继续救助

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

有定时命令milis()毫秒为单位
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-27 17:12:51 | 显示全部楼层
林定祥 发表于 2013-11-27 17:01
有定时命令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
if (m - time1 > interval1){
    time1 = m;

如果有其它程序跑就需要使用定时中断
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-27 18:05:51 | 显示全部楼层
万马奔腾 发表于 2013-11-27 17:52
如果有其它程序跑就需要使用定时中断

interrupt,之后往上加,现在第一步,双闪还母有整出来呢
回复 支持 反对

使用道具 举报

发表于 2013-11-27 20:24:01 | 显示全部楼层
  1. #define LED_PIN 1  //led 引脚

  2. enum LED_STATE
  3. {
  4.     LED_ON,
  5.     LED_OFF,
  6. };

  7. struct led_t
  8. {
  9.     LED_STATE state;
  10.     uint32_t timeout;
  11. };

  12. struct led_state_t
  13. {
  14.     uint8_t i;
  15.     uint32_t time;
  16. };

  17. #define LED_MAX_COUNT 4
  18. struct led_t g_led[LED_MAX_COUNT]  =
  19. {
  20.     {
  21.         LED_ON, 100
  22.     }
  23.     ,
  24.     {
  25.         LED_OFF, 100
  26.     }
  27.     ,
  28.     {
  29.         LED_ON, 100
  30.     }
  31.     ,
  32.     {
  33.         LED_OFF, 700
  34.     }
  35.     ,
  36. };

  37. struct led_state_t g_led_state =
  38. {
  39.     0, 0
  40. };

  41. void setLed(struct led_t *led)
  42. {
  43.     switch (led->state)
  44.     {
  45.     case LED_ON:
  46.         digitalWrite(LED_PIN,  LOW);
  47.         break;
  48.     case LED_OFF:
  49.         digitalWrite(LED_PIN, HIGH);
  50.         break;
  51.     }
  52.     g_led_state.time = millis() + led->timeout;
  53. }

  54. inline void checkLed()
  55. {
  56.     if  (millis() >= g_led_state.time)
  57.     {
  58.         g_led_state.i++;
  59.         if (g_led_state.i >= LED_MAX_COUNT)
  60.             g_led_state.i = 0;
  61.         setLed(&g_led[g_led_state.i]);
  62.     }
  63. }

  64. void setup()
  65. {
  66.     pinMode(LED_PIN, OUTPUT);
  67.     setLed(&g_led[0]);
  68. }

  69. void loop()
  70. {
  71.     checkLed();
  72. }


复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-27 21:24:44 | 显示全部楼层
pathletboy 发表于 2013-11-27 20:24


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

}
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-27 21:25:09 | 显示全部楼层
谢谢大家回复,终于弄出来了
回复 支持 反对

使用道具 举报

 楼主| 发表于 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



}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-28 00:40:13 | 显示全部楼层
pathletboy 发表于 2013-11-27 20:24

好厉害,灯正常亮,(52行 54行 大大定义反了) 正在慢慢读,有很多行看不懂,谢谢大大了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-13 23:00 , Processed in 0.055222 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表