简单电路:红外遥控显示数字(0~9)-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6025|回复: 8

简单电路:红外遥控显示数字(0~9)

[复制链接]
发表于 2012-9-27 15:33 | 显示全部楼层 |阅读模式
      在网上找了几个红外遥控的例子,都大同小异。都是使用开源的红外接收发送程序,应用起来也非常简单。但是我试了一下“遥控直升机”和“盛大易宝”遥控器都无法识别。

      这次对显示数字的电路和程序简单做了修改,利用红外遥控控制数字的显示。

      简单说一下实现逻辑。按遥控器上的数字0到9,电路显示按下的对应数字;如果按下的不是数字键,则小数点闪一下,表示接受的输入但无法显示。

电路:
Snip20120927_4.png
      
演示视频:


程序:
[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
发表于 2012-9-27 23:42 | 显示全部楼层
顶一个·~
发表于 2012-9-29 10:44 | 显示全部楼层
再顶一个
发表于 2012-9-29 10:45 | 显示全部楼层
问一下楼主用什么软件图的电路图
 楼主| 发表于 2012-9-29 14:51 | 显示全部楼层
郭会强 发表于 2012-9-29 10:45
问一下楼主用什么软件图的电路图

《Fritzing》
发表于 2012-10-2 20:16 | 显示全部楼层
aclyyx 发表于 2012-9-29 14:51
《Fritzing》

谢谢,
发表于 2012-12-28 09:07 | 显示全部楼层
楼主电路图能解释下不、。。。
发表于 2013-2-3 10:25 | 显示全部楼层
电路图能解释下
发表于 2013-3-17 18:32 | 显示全部楼层
digitalWrite(map_led[i], map_table[num][i] ? HIGH : LOW);   请问怎么理解这句?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 15:42 , Processed in 0.209235 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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