8266红外接收/发送

红外功能

硬件

  • 8266 D1 Mini
  • 红外发射、接收器
  • 杜绑线

代码

  • arduino工具
    通过接收代码代码采集控制器的控制信号,再通过发射代码控制空调。后续可使用云平台或局域网实现 手动/自动 控制。
  • 发射
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>

//定义发射管所在针脚
const uint16_t kIrLed = D6;

//实例对象
IRsend irsend(kIrLed);

//之前采集到的rawData 数据(音量+)  on
uint16_t ir_data[199] = {};

void setup() {
  Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
  
  //如果串口尚未准备好,就等50毫秒后,再次检查
  while (!Serial)
    delay(50);
  
  //做一些准备工作
  irsend.begin();
}

void loop() {
  
  /**
   * 注意,除了直接发送Raw原始数据之外,也可以发送指定格式
   * 代码为:irsend.sendNEC(0x00FFE01FUL);
   * 其他的指令可查阅文档:
   * https://crankyoldgit.github.io/IRremoteESP8266/doxygen/html/classIRsend.html
   * 实验时使用空调,发射raw data控制失败,最终发射coolix数据
   */ 
   
  //发送音量+的质量,以38kHz的频率 
//  irsend.sendRaw(ir_data, 199, 38);
  irsend.sendCOOLIX(0xB2BFD0);    // 空调开

  //等待1秒
  delay(3000);

  //发送音量-的指令
//  irsend.sendRaw(voice_down, 199, 38);
  irsend.sendCOOLIX(0xB27BE0);    // 空调关
  delay(3000);
}

  • 接收
#include <Arduino.h>
//#include <assert.h>
#include <IRrecv.h>
#include <IRremoteESP8266.h>
#include <IRac.h>
#include <IRtext.h>
#include <IRutils.h>



const uint16_t kRecvPin = 14; //使用D5引脚

const uint32_t kBaudRate = 115200;

const uint16_t kCaptureBufferSize = 1024;    // 缓冲区尺寸,需要足够放下控制命令。实测时美的空调长度199

#if DECODE_AC
const uint8_t kTimeout = 50;
#else   
const uint8_t kTimeout = 15;
#endif

const uint16_t kMinUnknownSize = 12;

//匹配信号协议的误差,默认是25%,一般不需要修改这个值
const uint8_t kTolerancePercentage = kTolerance;

#define LEGACY_TIMING_INFO false

// 创建捕获信号的对象
IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, true);
decode_results results;  // 保存采集到的编码结果

void setup() {
  Serial.begin(kBaudRate, SERIAL_8N1, SERIAL_TX_ONLY);
  
  //如果串口尚未准备好,就等50毫秒后,再次检查
  while (!Serial)
    delay(50);
    
//  串口输出一个准备开始的信息
  Serial.printf("\n" D_STR_IRRECVDUMP_STARTUP "\n", kRecvPin);
#if DECODE_HASH
  // 忽略打开或关闭脉冲小于最小值的消息
  irrecv.setUnknownThreshold(kMinUnknownSize);
#endif  // DECODE_HASH
  irrecv.setTolerance(kTolerancePercentage);  // 覆盖缺省设置
  irrecv.enableIRIn();  // 开始采集

}

void loop() {
  revice();
}

void revice(){
  
  // 如果采集到了数据
  if (irrecv.decode(&results)) {
    // 显示当前的时间戳(单片机启动至今的毫秒数)
    uint32_t now = millis();
    /*
     * printf() 也是打印输出的函数,支持内容的格式化
     * D_STR_TIMESTAMP 应该是一个库内部定义的常量,输出字符串"Timestamp"
     * %06u 和 %03u 定义数据类型为"无符号的整数" 06 和 03 分别是固定了输出的位数
     * (now/1000 将毫秒转为秒, now%1000 转为秒之后的余数,也就是毫秒数)
     */
    Serial.printf(D_STR_TIMESTAMP " : %06u.%03u\n", now / 1000, now % 1000);
    
    // 如果收到了一个超出缓冲区大小的数据
    if (results.overflow)
      Serial.printf(D_WARN_BUFFERFULL "\n", kCaptureBufferSize);
    
    // 显示代码的版本
    Serial.println(D_STR_LIBRARY "   : v" _IRREMOTEESP8266_VERSION_STR "\n");
    
    // 如果修改过公差值,则显示修改后的值
    if (kTolerancePercentage != kTolerance)
      Serial.printf(D_STR_TOLERANCE " : %d%%\n", kTolerancePercentage);
    
    // 输出基本信息(协议和代码)
    Serial.print(resultToHumanReadableBasic(&results));
    
    // 如果是AC设备,显示我们采集到的所有扩展信息
    String description = IRAcUtils::resultAcToString(&results);
    if (description.length()) 
      Serial.println(D_STR_MESGDESC ": " + description);
    yield();  // "生成器" 在较长延迟中加一个,可以避免一些BUG

    // 输出原始结果,rawData 的部分
    Serial.println(resultToSourceCode(&results));
    Serial.println();    // 输出一个空行(作为和下一组数据的间隔)
    yield();
  }
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值