极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8908|回复: 4

如何在循环结构中使用红外遥控暂停?

[复制链接]
发表于 2013-4-11 12:27:39 | 显示全部楼层 |阅读模式
我结合光控电路和红外遥控搭建了这么一个电路。想用光控来自动控制LED的开关,用遥控可以手动控制LED开关。
程序是这样的
#include <IRremote.h>
const int irReceiverPin = 2;
int a =100;     //此处需是环境基础亮度变量,请查看自己的亮度数值,
                //填写到此处数值要略大于所测得的数据但小于灯光下的数据
IRrecv irrecv(irReceiverPin); // 设置irReceiverPin定义的端口为红外信号接收端口
decode_results results;    // 定义results变量为红外结果存放位置
void setup ()
{
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  irrecv.enableIRIn();   // 启动红外解码
}
void loop()
{
    int n = analogRead(A0);            //读取模拟口A0数值
    if (irrecv.decode(&results)) {   // 解码成功,把数据放入results变量中
    // 把数据输入到串口


if(results.value == 0xFF30CF) digitalWrite(13,HIGH);//按下1键时,手动亮起LED
if(results.value == 0xFF18E7) digitalWrite(13,LOW);//按下2键时,手动亮起LED

if(results.value == 0xFF7A85) //按下3键时,光控自动控制LED
        {
          if (n<= a )                   //对光线强度进行判断,如果比我们的预设值大 就点亮LED否则就关闭
          {
            digitalWrite(13,HIGH);
          }
          else
          {
            digitalWrite(13,LOW);
          }
    }
    irrecv.resume();    // 继续等待接收下一组信号
  }  
}

但问题是到了irrecv.resume(); 程序就停下来等待信号了,虽然results.value == 0xFF7A85 但光控的if (n<= a ) 语句已经不再执行了。。

我是想如果我不按1键或2键,程序就一直自动控制LED开关,如果我按1键,就一直保持亮的状态,不受光控的影响。我应该怎么怎样修改?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-4-11 13:05:26 | 显示全部楼层
  1. int autoControl = true;

  2. void loop()
  3. {
  4.         if (irrecv.decode(&results)) {   // 解码成功,把数据放入results变量中
  5.                 if(results.value == 0xFF30CF) {
  6.                         autoControl = false;
  7.                         digitalWrite(13,HIGH);//按下1键时,手动亮起LED
  8.                 }
  9.                 if(results.value == 0xFF18E7) {
  10.                         digitalWrite(13,LOW);//按下2键时,手动亮起LED
  11.                 }
  12.                 if(results.value == 0xFF7A85) { //按下3键时,光控自动控制LED
  13.                         autoControl = true;
  14.                 }
  15.                 irrecv.resume();    // 继续等待接收下一组信号
  16.         }

  17.         if (autoControl) {
  18.                 int n = analogRead(A0);            //读取模拟口A0数值
  19.                 if (n<= a ) {                  //对光线强度进行判断,如果比我们的预设值大 就点亮LED否则就关闭
  20.                         digitalWrite(13,HIGH);
  21.                 } else {
  22.                         digitalWrite(13,LOW);
  23.                 }
  24.         }
  25. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-11 14:25:54 | 显示全部楼层
贱客 发表于 2013-4-11 13:05
int autoControl = true;

void loop()

谢谢!!昨晚想了一个晚上都没想出什么好方法,太久没编过程序了,原来可以通过设立变量来控制喔。
ps:第10行后面加上:autoControl = false; 程序就完美运行了~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-11 14:33:30 | 显示全部楼层
  1. #include <IRremote.h>
  2. const int irReceiverPin = 2;
  3. int a =100;     //此处需是环境基础亮度变量,请查看自己的亮度数值,
  4.                 //填写到此处数值要略大于所测得的数据但小于灯光下的数据
  5. IRrecv irrecv(irReceiverPin); // 设置irReceiverPin定义的端口为红外信号接收端口
  6. decode_results results;    // 定义results变量为红外结果存放位置
  7. int autoControl = true;   //决定自动、手动控制的变量
  8. void setup ()
  9. {
  10.   Serial.begin(9600);
  11.   pinMode(13,OUTPUT);
  12.   irrecv.enableIRIn();   // 启动红外解码
  13. }


  14. void loop()
  15. {
  16.         if (irrecv.decode(&results)) {   // 解码成功,把数据放入results变量中。
  17.                 if(results.value == 0xFF30CF) {
  18.                         autoControl = false;
  19.                         digitalWrite(13,HIGH);//按下1键时,手动亮起LED
  20.                 }
  21.                 if(results.value == 0xFF18E7) {
  22.                         autoControl = false;
  23.                         digitalWrite(13,LOW);//按下2键时,手动亮起LED
  24.                 }
  25.                 if(results.value == 0xFF7A85) { //按下3键时,光控自动控制LED
  26.                         autoControl = true;
  27.                 }
  28.                 irrecv.resume();    // 继续等待接收下一组信号
  29.         }

  30.         if (autoControl) {
  31.                 int n = analogRead(A0);            //读取模拟口A0数值
  32.                 if (n<= a ) {                  //对光线强度进行判断,如果比我们的预设值大 就点亮LED否则就关闭
  33.                         digitalWrite(13,HIGH);
  34.                 } else {
  35.                         digitalWrite(13,LOW);
  36.                 }
  37.         }
  38. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-4-12 13:45:22 | 显示全部楼层
用中断,设置中断向量
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-12 21:19 , Processed in 0.051134 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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