如何在循环结构中使用红外遥控暂停?
我结合光控电路和红外遥控搭建了这么一个电路。想用光控来自动控制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键,就一直保持亮的状态,不受光控的影响。我应该怎么怎样修改? 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);
}
}
}
贱客 发表于 2013-4-11 13:05 static/image/common/back.gif
int autoControl = true;
void loop()
谢谢!!昨晚想了一个晚上都没想出什么好方法,太久没编过程序了,原来可以通过设立变量来控制喔。
ps:第10行后面加上:autoControl = false; 程序就完美运行了~ #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);
}
}
} 用中断,设置中断向量
页:
[1]