Yoyo 发表于 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键,就一直保持亮的状态,不受光控的影响。我应该怎么怎样修改?

贱客 发表于 2013-4-11 13:05:26

int autoControl = true;

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

        if (autoControl) {
                int n = analogRead(A0);            //读取模拟口A0数值
                if (n<= a ) {                  //对光线强度进行判断,如果比我们的预设值大 就点亮LED否则就关闭
                        digitalWrite(13,HIGH);
                } else {
                        digitalWrite(13,LOW);
                }
        }
}

Yoyo 发表于 2013-4-11 14:25:54

贱客 发表于 2013-4-11 13:05 static/image/common/back.gif
int autoControl = true;

void loop()


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

Yoyo 发表于 2013-4-11 14:33:30

#include <IRremote.h>
const int irReceiverPin = 2;
int a =100;   //此处需是环境基础亮度变量,请查看自己的亮度数值,
                //填写到此处数值要略大于所测得的数据但小于灯光下的数据
IRrecv irrecv(irReceiverPin); // 设置irReceiverPin定义的端口为红外信号接收端口
decode_results results;    // 定义results变量为红外结果存放位置
int autoControl = true;   //决定自动、手动控制的变量
void setup ()
{
Serial.begin(9600);
pinMode(13,OUTPUT);
irrecv.enableIRIn();   // 启动红外解码
}


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

      if (autoControl) {
                int n = analogRead(A0);            //读取模拟口A0数值
                if (n<= a ) {                  //对光线强度进行判断,如果比我们的预设值大 就点亮LED否则就关闭
                        digitalWrite(13,HIGH);
                } else {
                        digitalWrite(13,LOW);
                }
      }
}

qptimus 发表于 2013-4-12 13:45:22

用中断,设置中断向量
页: [1]
查看完整版本: 如何在循环结构中使用红外遥控暂停?