首页 > 其他 > 详细

解码红外遥控信号——使用遥控器的按键来调节LED的亮度

时间:2017-01-13 23:41:14      阅读:296      评论:0      收藏:0      [点我收藏+]

程序开始时,提示遥控键0~4的代码,然后程序通过设置LED的亮度来对被按下的按钮作出响应,以0关闭LED,1~4提供增加的亮度。

代码如下:(需要使用IRremote库,可在库管理中搜索该库进行下载后即可使用)

#include <IRremote.h>

const int irReceiverPin = 2;
const int ledPin = 9;

const int numberOfKeys = 5;
long irKeyCodes[numberOfKeys];

IRrecv irrecv(irReceiverPin);
decode_results results;

void setup()
{
    Serial.begin(9600);
    pinMode(irReceiverPin, INPUT);
    pinMode(ledPin, OUTPUT);
    irrecv.enableIRIn();
    learnKeycodes();
    Serial.println("Press a remote key");
}

void loop()
{
    long key;
    int brightness;

    if(irrecv.decode(&results))
    {
        // 如果接收到数据
        irrecv.resume();
        key = convertCodeToKey(results.value);
        if(key >= 0)
        {
            Serial.print("Got key ");
            Serial.println(key);
            brightness = map(key, 0, numberOfKeys-1, 0, 255);
            analogWrite(ledPin, brightness);
        }
    }
}

// 获取遥控编码
void learnKeycodes()
{
    while(irrecv.decode(&results))
        // 清空缓冲区
        irrecv.resume();
    Serial.println("Ready to learn remote codes");
    long prevValue = -1;
    int i = 0;
    while( i < numberOfKeys){
        Serial.print("press remote key");
        Serial.print(i);
        while(true){
            if(irrecv.decode(&results)){
                if(results.value != -1 && results.value != prevValue){
                showReceivedData();
                irKeyCodes[i] = results.value;
                i++;
                prevValue = results.value;
                irrecv.resume();    // 接收下一个值
                break;
            }
            irrecv.resume();        // 接收下一个值
            }   
        }
    }
    Serial.println("Learning complete");
}

// 将一个遥控协议代码转为逻辑键码,如果没有收到代码返回 -1
int convertCodeToKey(long code)
{
    for(int i=0; i<numberOfKeys; i++){
        if(code == irKeyCodes[i]){
            return i;       // 找到键值返回
        }
    }
    return -1;
}

void showReceivedData()
{
    if(results.decode_type == UNKNOWN){
        Serial.println("-Could not decode message");
    }else{
        if(results.decode_type == NEC) {
            Serial.print("- decode NEC:");
        }else if(results.decode_type == SONY){
            Serial.print("- decode SONY:");
        }else if(results.decode_type == RC5){
            Serial.print("- decode RC5:");
        }
        Serial.print("hex value = ");
        Serial.println(results.value, HEX);
    }
}

也可以永久的保存按键编码的值,这样就可以不需要每次程序启动时去学习。用以下代码更换irKeyCodes的声明来初始化每个键的值。

改变这些值使之遥控器的值相吻合(当你按下键时 learnKeyCodes函数会把它们显示在串行监视器中)。

long irKeyCodes[numberOfKeys] = {
    0x18E758A7, // 0 键
    0X18E708F7, // 1 键
    0X18E78877, // 2 键
    0X18E748B7, // 3 键
    0X18E7C837, // 4 键
}

 

解码红外遥控信号——使用遥控器的按键来调节LED的亮度

原文:http://www.cnblogs.com/hersion/p/6284313.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!