Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 156|回复: 0

更新的IRremote库实例

[复制链接]
发表于 2023-1-23 10:52 | 显示全部楼层 |阅读模式
从3.1版本开始,用于发送的PWM的生成由软件完成,因此节省了硬件计时器,并启用了用于发送的任意输出引脚。如果您使用的(旧的)Arduino内核不使用-flto标志进行编译,那么如果在编译期间收到关于begin()的错误消息,您可以激活IRRemote.h中的#defineSUPPRESS_ERROR_MESSAGE_FOR_BEGIN行。
·                    现在有一个IRreceiver和IRsender对象,如众所周知的Arduino串行对象。
·                    只需删除程序中的行IRrecv IrReceiver(IR_RECEIVE_PIN);和/或IRsend IrSender;,并将所有出现的IRrecv.或irrecv.替换为IrReceiver,将所有IRsend或irsend替换为IrSender。
·                    由于解码的值现在在IrReceiver.decodedIRData中,而不再在results中,因此删除decode_resultsresults行或类似行。
·                    与串行对象一样,调用IrReceiver.begin(IR_RECEIVE_PIN,ENABLE_LED_FEEDBACK)或IrReceiver.begin(IR_RECEIVE_PIN,DISABLE_LED_FEEDBACK),而不是setup()中的IrReceiver.enableIRIn()或irrecv.enableIRIn()。对于发送,在setup()中调用IrSender.begin(IR_SEND_PIN,ENABLE_LED_FEEDBACK);或IrSender.begin(IR_SEND_PIN,DISABLE_LED_FEEDBACK);。
·                    旧的decode(decode_results*aResults)函数被简单的decode()替换。如果你有一个语句if(irrecv.decode(&results)),用if (IrReceiver.decode())替换它。
·                    解码结果现在在IrReceiver.decodedIRData中,不再在results中,因此将results.value和results.decode_type(以及类似的)的任何出现替换为IrReceiver.decodedIRData.decodedRawData和IrReceiver.decodedIRData.protocol。
·                    溢出、重复和其他标志现在位于IrReceiver.receivedIRData.flags。
·                    很少使用:results.rawbuf和results.rawlen必须替换为IrReceiver.decodedIRData.rawDataPtr->rawbuf和IrReceiver.decodedIRData.rawDataPtr->rawlen。
/*更新的IRremote库实例
  特别提示:
红外接收
解码结果在IrReceiver.decodedIRData结构中。
  例如,命令位于IrReceiver.decodedIRData.Command
  地址在IrReceiver.decodedIRData.Address
  原始数据(十六进制按键编码)IrReceiver.decodedIRData.decodedRawData中,高达32位的原始数据
  IrReceiver.printIRSendUsage(&Serial);
  if (IrReceiver.decodedIRData.protocol ==UNKNOWN) {
  我们这里有一个未知的协议,打印更多信息。
IrReceiver.printIRResultRawFormatted(&Serial, true);//打印原始数据
  if (IrReceiver.decodedIRData.decodedRawData== 0xBA45FF00){//接收到的原始数据(十六进制),并根据接收到的原始数据执行操作。
  if (IrReceiver.decodedIRData.command == 0x45){//接收到的命令数据,并根据接收到的命令执行操作。两种方法都可以控制
  ifswitch都可以用
*/
#include<IRremote.hpp>
#defineIR_RECEIVE_PIN2
int ledhong = 9;
int ledhuang = 10;
int ledlv = 11;
void setup()
{
  Serial.begin(115200);
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);//初始化红外接收器,接引脚2,接收数据时板载LED闪烁反馈
  pinMode(ledhong, OUTPUT);
  pinMode(ledhuang, OUTPUT);
  pinMode(ledlv,OUTPUT);
}
void loop(){
  if (IrReceiver.decode()){//红外接收器接收到的数据解码
    IrReceiver.printIRResultShort(&Serial);//打印接收的数据(命令(command),地址(Address),原始数据(十六进制)(decodedRawData))。
    IrReceiver.resume(); //允许接收下一个值。
    switch(IrReceiver.decodedIRData.command){//读取红外接收器接收到的数据的命令部分
      case 0x45://命令等于0x45时,执行操作
        digitalWrite(ledhong, HIGH);
        delay(2);
        break;
      case 0x46://命令等于0x46时,执行操作
        digitalWrite(ledhuang, HIGH);
        delay(2);
        break;
    case 0x47://命令等于0x47时,执行操作
        digitalWrite(ledlv, HIGH);
        delay(2);
        break;
    case 0x19://命令等于0x19时,执行操作
  digitalWrite(ledhong, LOW);
  digitalWrite(ledhuang, LOW);
  digitalWrite(ledlv, LOW);
        delay(2);
        break;
    }
  }
}
/*if(IrReceiver.decodedIRData.decodedRawData== 0xBA45FF00) {//红外接收器接收到的原始数据等于0xF20DFF00时,执行操作
   digitalWrite(ledhong, HIGH);
  }
  if(IrReceiver.decodedIRData.decodedRawData ==0xB946FF00) {//红外接收器接收到的原始数据等于0x0xBB44FF00时,执行操作
   digitalWrite(ledhuang, HIGH);
  }
  if(IrReceiver.decodedIRData.decodedRawData ==0xB847FF00) {//红外接收器接收到的原始数据等于0x0xBB44FF00时,执行操作
   digitalWrite(ledlv, HIGH);
  }
  if (IrReceiver.decodedIRData.decodedRawData== 0xE619FF00) {//红外接收器接收到的原始数据等于0x0xBB44FF00时,执行操作
  digitalWrite(ledhong, LOW);
  digitalWrite(ledhuang, LOW);
  digitalWrite(ledlv, LOW);
  }
  }
  }*/
红外发射实例:
/*更新的IRremote
  用红外发射器发送数据有两种方式,第一种,IrSender.sendNEC(sAddress,sCommand, sRepeats); 发射(地址码,命令,重复次数)
  发送uint16_t sAddress = 0xBF00;地址16uint8_tsCommand = 0xD;命令8uint8_tsRepeats = 1;发射重复次数8
  第二种:直接发送原始值,例如0xCB340102,则必须使用sendNECRaw()
  IrSender.sendNECRaw(0xCB340102, sRepeats);
*/
#include<IRremote.hpp>
#defineIR_SEND_PIN 3
intbutton = 8;
//int sAddress =0xBF00;
//int sCommand =0xD;
intsRepeats = 1;
void setup() {
  IrSender.begin(IR_SEND_PIN, ENABLE_LED_FEEDBACK); //指定发送引脚3并在默认反馈LED引脚处启用LED闪烁
  pinMode(button, INPUT);
}
void loop() {
  if (digitalRead(button) == 1) {
    delay(20);
    if (digitalRead(button)== 1) {
      /*按键抖动消失,首先采用 if(digitalRead(button)=1)检测高电平,如果高电平出现,延时20ms,再次检测是否是高电平,经过20ms的延时,如果还是高电平就说明按键的确被按下了。判断按键是否抬起,采用while(digitalRead(button)= 1)这样的一个循环语句判断按键是否释放,如果按键没有释放,引脚应该是高电平,那么就循环再次读取,直到引脚变成低电平,推出循环。*/
      //IrSender.sendNEC(sAddress, sCommand,sRepeats); //发射(地址码,命令,重复次数)发射数据两种方法都可以
      IrSender.sendNECRaw(0xBA45FF00, sRepeats);//直接发送原始值(16进制32),发射重复次数
      while (digitalRead(button)== 1);
    }
  }
}

红外发射和接收代码.zip

6.43 KB, 下载次数: 1

红外发射接收代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2023-1-28 21:00 , Processed in 0.072709 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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