极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17547|回复: 19

求助 用多个人体红外控制多个led 遇到问题

[复制链接]
发表于 2014-5-13 13:58:44 | 显示全部楼层 |阅读模式
用多个人体红外控制LED

一个人体红外模块对应一个led
人体红外点亮LED  led亮10S
但是用delay() 就造成其他人体红外接收到信号 led也没有反应

有什么函数可以解决啊
就是灯亮的时候  不影响其他工作

用的2560
看扩展库有个 Timer是什么利用millis()函数来模拟多线程

回复

使用道具 举报

发表于 2014-5-13 15:41:55 | 显示全部楼层
不要用delay好了,自己定义个变量,自己计数。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-13 17:35:52 | 显示全部楼层
自己人工置顶
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-13 17:38:09 | 显示全部楼层
瘦网虫 发表于 2014-5-13 15:41
不要用delay好了,自己定义个变量,自己计数。

计数器和定时器 差不多
我用定时函数一样

计时未完成就不会 响应  其他信号
回复 支持 反对

使用道具 举报

发表于 2014-5-13 18:10:18 | 显示全部楼层
用millis(),不到点循环,到点处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-13 18:47:29 | 显示全部楼层
林定祥 发表于 2014-5-13 18:10
用millis(),不到点循环,到点处理。

类似查询中断吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-13 18:54:53 | 显示全部楼层
林定祥 发表于 2014-5-13 18:10
用millis(),不到点循环,到点处理。

这个不影响其他传感器 响应吗

比如   人体红外1响应  LED1亮(需要亮5分钟)
亮了一分钟    人体红外2响应  LED2亮(需要亮五分钟)

按我的理解  你说的函数  millis()用于关灯
但读取系统时间  也不能执行其他 响应吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-13 19:27:12 | 显示全部楼层

自己人工置顶
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-13 20:09:14 | 显示全部楼层


自己人工置顶
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-13 20:43:31 | 显示全部楼层



自己人工置顶
回复 支持 反对

使用道具 举报

发表于 2014-5-13 21:39:10 | 显示全部楼层
把程序放上來,看看怎替你改吧!
回复 支持 反对

使用道具 举报

发表于 2014-5-13 21:44:02 | 显示全部楼层
dbwing520 发表于 2014-5-13 18:54
这个不影响其他传感器 响应吗

比如   人体红外1响应  LED1亮(需要亮5分钟)

他的原理是,在loop中在执行到millis时和需要延时的值比对,不对,继续执行下个指令,操作
值处理时间,因此使用millis不存在时间等待问题
回复 支持 反对

使用道具 举报

发表于 2014-5-13 21:44:27 | 显示全部楼层
dbwing520 发表于 2014-5-13 18:54
这个不影响其他传感器 响应吗

比如   人体红外1响应  LED1亮(需要亮5分钟)

他的原理是,在loop中在执行到millis时和需要延时的值比对,不对,继续执行下个指令,操作
值处理时间,因此使用millis不存在时间等待问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-13 21:50:52 | 显示全部楼层
eddiewwm 发表于 2014-5-13 21:39
把程序放上來,看看怎替你改吧!

int echo2=40;
int trig2=43;
int led2=7;
int echo1=32;
int trig1=35;
int led1=9;
void setup()
{
    Serial.begin(9600);
    pinMode(echo2, INPUT);
    pinMode(trig2, OUTPUT);
    pinMode(led2, OUTPUT);

    pinMode(echo1, INPUT);
    pinMode(trig1, OUTPUT);
    pinMode(led1, OUTPUT);
}

void loop()
{
  sr1();
  sr2();
}

void sr1()
{
    digitalWrite(trig1, LOW);
    delayMicroseconds(2);
    digitalWrite(trig1, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig1, LOW);  
    int d1 = pulseIn(echo1, HIGH);
    d1= d1/58;  
    delay(10);
  if(d1 <30 )   
  {
    Serial.println(d1);
    Serial.println("sr1");
    digitalWrite(led1, HIGH);
    delay(5000);
  }
  else digitalWrite(led1, LOW);
}

void sr2()
{
    digitalWrite(trig2, LOW);
    delayMicroseconds(2);
    digitalWrite(trig2, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig2, LOW);  
    int d2 = pulseIn(echo2, HIGH);
    d2= d2/58;  
    delay(10);
  if(d2 <30 )   
  {
    Serial.println(d2);
    Serial.println("sr2");
    digitalWrite(led2, HIGH);
    delay(5000);
  }
  else digitalWrite(led2, LOW);
}



改掉delay  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-13 21:56:29 | 显示全部楼层
林定祥 发表于 2014-5-13 21:44
他的原理是,在loop中在执行到millis时和需要延时的值比对,不对,继续执行下个指令,操作
值处理时间, ...

我看扩展库里有个 Timer  就是没找到下载

回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 20:56 , Processed in 0.037905 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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