基于Arduino红外遥控器控制数码管显示

功能


  1. 通过74HC595芯片控制数码管显示,减少arduino数字针脚使用;

  2. 红外遥控器控制数码管显示。

硬件

1. arduino uno r3开发板

blob.png

2. 红外遥控器

blob.png

3. 红外接收器

blob.png

4. 74HC595芯片

blob.png

5. 一位7段数码管

blob.png

6. 10K电阻8个

blob.png

7. 面包板

blob.png

8. 跳线若干

blob.png

接线图

blob.png

实物连接

blob.png

代码

#include <IRremote.h>
int RECV_PIN = 11;
int data = 2;//74HC595的14脚 数据输入引脚SI
int clocks = 5;//74hc595的11脚 时钟线 SCK
int latch = 4;//74hc595的12脚 输出存储器锁存线RCK
long on1  = 0x00FF30CF;
long on0 = 0x00FF6897;
long on2 = 0x00FF18E7;
long on3 = 0x00FF7A85;
long on4 = 0x00FF10EF;
long on5 = 0x00FF38C7;
long on6 = 0x00FF5AA5;
long on7 = 0x00FF42BD;
long on8 = 0x00FF4AB5;
long on9 = 0x00FF52AD;
int on = 1;
unsigned long last = millis();
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
  pinMode(RECV_PIN, INPUT);
  pinMode(data, OUTPUT);
  pinMode(clocks, OUTPUT);
  pinMode(latch, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}
void loop()
{
  if (irrecv.decode(&results))
  {
    // If it's been at least 1/4 second since the last
    // IR received, toggle the relay
    if (millis() - last > 250)
    {
      on = !on;
      //       digitalWrite(8, on ? HIGH : LOW);
      digitalWrite(13, on ? HIGH : LOW);
      dump(&results);
    }
    if (results.value == on0 ) showchar('0');
    if (results.value == on1 ) showchar('1');
    if (results.value == on2 ) showchar('2');
    if (results.value == on3 ) showchar('3');
    if (results.value == on4 ) showchar('4');
    if (results.value == on5 ) showchar('5');
    if (results.value == on6 ) showchar('6');
    if (results.value == on7 ) showchar('7');
    if (results.value == on8 ) showchar('8');
    if (results.value == on9 ) showchar('9');
    last = millis();
    irrecv.resume(); // Receive the next value
  }
}
void showchar(word s) {
  switch (s) {
    case '0':
      updateLEDs(250);
      break;
    case '1':
      updateLEDs(96);
      break;
    case '2':
      updateLEDs(220);
      break;
    case '3':
      updateLEDs(244);
      break;
    case '4':
      updateLEDs(102);
      break;
    case '5':
      updateLEDs(182);
      break;
    case '6':
      updateLEDs(190);
      break;
    case '7':
      updateLEDs(224);
      break;
    case '8':
      updateLEDs(254);
      break;
    case '9':
      updateLEDs(246);//9
      break;
    case 'F':
      updateLEDs(142);//F
      break;
    case 'E':
      updateLEDs(158);//E
      break;
    case 'P':
      updateLEDs(206);//P
      break;
    case 'C':
      updateLEDs(154);//C
      break;
    case 'o':
      updateLEDs(60);//o
      break;
    case 'A':
      updateLEDs(238);//A
      break;
    case 'H':
      updateLEDs(110);//H
      break;
    case 'b':
      updateLEDs(62);//b
      break;
    default:
      updateLEDs(1);//
  }
}
void updateLEDs(int value)
{
  digitalWrite(latch, LOW);//
  shiftOut(data, clocks, LSBFIRST, ~value);//串行数据输出,高位在先
  digitalWrite(latch, HIGH);//锁存
}
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN)
  {
    Serial.println("Could not decode message");
  }
  else
  {
    if (results->decode_type == NEC)
    {
      Serial.print("Decoded NEC: ");
    }
    else if (results->decode_type == SONY)
    {
      Serial.print("Decoded SONY: ");
    }
    else if (results->decode_type == RC5)
    {
      Serial.print("Decoded RC5: ");
    }
    else if (results->decode_type == RC6)
    {
      Serial.print("Decoded RC6: ");
    }
    Serial.print(results->value, HEX);
    Serial.print(" (");
    Serial.print(results->bits, DEC);
    Serial.println(" bits)");
  }
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");
  for (int i = 0; i < count; i++)
  {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    }
    else
    {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}

附件

IRremote.zip

红外遥控收发所需库文件,解压后将IRremote文件夹放在Arduino IDE 安装文件夹的libraries/下。