在网上找了几个红外遥控的例子,都大同小异。都是使用开源的红外接收发送程序,应用起来也非常简单。但是我试了一下“遥控直升机”和“盛大易宝”遥控器都无法识别。
这次对显示数字的电路和程序简单做了修改,利用红外遥控控制数字的显示。
简单说一下实现逻辑。按遥控器上的数字0到9,电路显示按下的对应数字;如果按下的不是数字键,则小数点闪一下,表示接受的输入但无法显示。
电路:
演示视频:
程序:
[mw_shl_code=cpp,true]#include <IRremote.h>
int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
/*
a b c d e f g dp
10 9 6 7 8 11 12 5
*/
int map_led [8] = {
10, 9, 6, 7, 8, 11, 12, 5
};
int map_table [10][8] = {
{0, 0, 0, 0, 0, 0, 1, 1}, // 0
{1, 0, 0, 1, 1, 1, 1, 1}, // 1
{0, 0, 1, 0, 0, 1, 0, 1}, // 2
{0, 0, 0, 0, 1, 1, 0, 1}, // 3
{1, 0, 0, 1, 1, 0, 0, 1}, // 4
{0, 1, 0, 0, 1, 0, 0, 1}, // 5
{0, 1, 0, 0, 0, 0, 0, 1}, // 6
{0, 0, 0, 1, 1, 1, 1, 1}, // 7
{0, 0, 0, 0, 0, 0, 0, 1}, // 8
{0, 0, 0, 0, 1, 0, 0, 1} // 9
};
long map_num [10] = {
0xFD30CF, 0x00FD08F7, 0x00FD8877, 0x00FD48B7, 0x00FD28D7,
0x00FDA857, 0x00FD6897, 0x00FD18E7, 0x00FD9867, 0x00FD58A7
};
int num;
void display() {
int i;
for (i = 0; i < 8; i++) {
digitalWrite(map_led, map_table[num] ? HIGH : LOW);
}
}
void displayNULL() {
int i;
for (i = 0; i < 10; i++) {
digitalWrite(map_led, HIGH);
}
}
void setup() {
pinMode(RECV_PIN, INPUT);
pinMode(8, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
int j;
for (j = 0; j < 8; j++) {
pinMode(map_led[j], OUTPUT);
}
displayNULL();
num = 0;
}
unsigned long last = millis();
void loop() {
int i;
// 刚刚开始数字闪动
for (i = 0; i < 10; i++) {
display();
num++;
delay(125);
}
// 清空显示
displayNULL();
num = -1;
while (1) {
if (irrecv.decode(&results)) {
// If it's been at least 1/4 second since the last
// IR received, toggle the relay
if (millis() - last > 200) {
Serial.println(results.value, HEX);
// 找找遥控器按下的是几
for (i = 0; i < 10; i++) {
if (map_num == results.value) {
num = i;
display();
}
}
// 按下的是非数字键,小数点闪一下
if (num == -1) {
displayNULL();
digitalWrite(map_led[7], LOW);
delay(150);
digitalWrite(map_led[7], HIGH);
}
// 复位
num = -1;
delay(50);
}
last = millis();
irrecv.resume(); // Receive the next value
}
}
}[/mw_shl_code]
f
|