文章目录

  • 前言
  • 一,IRext简介
  • 二,IRext的使用
    • 2.1 使用思路
    • 2.2 获取二进制文件
      • 2.2.1控制台下载
      • 2.2.2 Web API下载
    • 2.3 解码
      • 2.3.1 文件系统下的解码
      • 2.3.2 加载到内存解码
  • 三,基于esp32的irext
    • 3.1 整体思路
    • 3.1 将irext解码仓库添加到工程
    • 3.2 将二进制文件烧录进spiffs文件系统
    • 3.3 文件系统解码
  • 四,小结
    • 电器类型代号

前言

注意,该码库仅供学习和研究,请勿用于商业用途,irext官网

想快速上手万能遥控器的同学可直接看第三节,前面是对irext的详细讲解,关于esp32如何发射/接收红外遥控信号,参考我另一篇文章:https://blog.csdn.net/weixin_44821644/article/details/108592858

一,IRext简介

支持红外遥控的设备,一般都会有自己的一套红外编码协议,而这个协议一般的厂家是不开源的。例如格力空调就有大约40套的编码协议。开发者如果要开发一个红外遥控器,就需要知道这些协议才能发射特定的信号。

网上的码库基本都需要公司进行合作,这对个人开发者不友好,irext就是一个开源的红外码库,他提供了多种电器,不同品牌的红外协议,把这些协议打包成二进制文件,并提供解码API,使开发者能解码打包的二进制代码,根据解码出的数据进行红外发射。该码库仅供学习和研究,请勿用于商业用途.

二,IRext的使用

2.1 使用思路

本文以esp32为例介绍irext的简单使用。首先需要获得二进制文件,并使用irext提供的解码API将其解码,解码会得到一个数组,这个数组保存的数据就是红外发射所需的脉冲序列。

例如:解析格力空调的二进制码库得到的数组如下:

[8967,4499,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,1671,598,598,598,598,598,1671,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,1671,598,598,598,598,598,598,598,598,598,598,598,598,598,1671,598,598,598,1671,598,598,598,598,598,1671,598,598,598,19984,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,1671,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,1671,598,598,598,1671,598,598,598,40150,8967,4499,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,1671,598,598,598,598,598,1671,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,1671,598,598,598,598,598,598,598,598,598,598,598,598,598,1671,598,1671,598,1671,598,598,598,598,598,1671,598,598,598,19984,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,1671,598,1671,598,598,598,598,598]

第一个数据8969表示的是一个持续时间为8967us的电平,第二个数据表示持续时间为4499us的电平,熟悉主流红外协议的同学马上就知道,这两个数据组成了红外协议的起时码。
有了这个数组,我们就能在自己的设备上产生特定的脉冲序列。

2.2 获取二进制文件

IRext提供了多种方式获取二进制文件,具体如下:

2.2.1控制台下载

直接下载指定的二进制文件到电脑,或者点我下载码库二进制文件包
优点是简单暴力,但是需要再烧录到嵌入式设备中。

2.2.2 Web API下载

IRext支持Web API ,用户可以通过公有云发起http连接,获取电器分类,电器品牌以及具体的电器品牌下所有的红外编码二进制文件等。

具体的API可以查看其文档https://cc.irext.net/doc/

2.3 解码

解码方式有在线解码与离线解码,在线解码使用的是Web API,具体参考文档,本文主要介绍离线解码。

离线解码需要使用解码仓库:https://irext.tech/irext/core

2.3.1 文件系统下的解码

设备有文件系统下,以下代码实现了将my_ir_code_file.bin文件解码,解码出的数组存放在user_data中,decode_len是数组的长度。category是电器类型代号,sub_category命令类编码的样本类型。(电器类型代号在文末)

ir_file_open(category, sub_category, "/path/my_ir_code_file.bin");
uint16_t decode_len=ir_decode(key_code, user_data, ac_status, 0);
ir_close();

这里重点介绍一下ac_status,通过对ac_status的成员赋值,可以产生对应数组。例如以下的代码,产生的是,制冷模式,打开,26℃,开启扫风的红外命令数组。

ac_status.ac_mode = AC_MODE_COOL;ac_status.ac_power = AC_POWER_OFF;ac_status.ac_temp = AC_TEMP_26;ac_status.ac_wind_dir = AC_SWING_ON;ac_status.ac_wind_speed = AC_WS_LOW;

2.3.2 加载到内存解码

使用ir_binary_open()代替ir_file_open(),其他的内容与文件系统下的操作一样。

ir_binary_open(category, sub_category, buffer, buffer_length);

三,基于esp32的irext

使用esp32进行红外发射的实现,我以前的博客讲过,ESP32 红外遥控 发射与接收的实现 IR_TX IR_RX 基于idf3.3,接下来就在这个博客的基础上,用irext解析出来的数组来构建item

3.1 整体思路

首先将irext_core解码仓库添加进项目,然后将二进制文件烧录进esp32的文件系统,最后在代码中解码出数组,使用数组构建item

3.1 将irext解码仓库添加到工程

github上下载该仓库 https://github.com/irext/core,如果速度太慢,解决办法:提升github下载速度最新解决方案

然后添加到项目文件夹下,记得修改CMakeLists.txt的内容。

在main.c中添加,ir_decode.h是irext解码的接口。是我们需要使用的唯一头文件。

#include "ir_decode.h"

3.2 将二进制文件烧录进spiffs文件系统

如何烧录spiffs文件系统请参考:三分钟上马 ESP32 spiffs文件系统
例如将xxx.bin放入根目录下的xxx文件夹,然后烧录进esp32,使用时路径名称:

char *filepath = "/spiffs/xxx/xxx.bin";

3.3 文件系统解码

以下是一个示例的流程,具体逻辑看注释。

uint16_t decoded[1024] = { 0 };     //二进制文件解码的数据t_remote_ac_status ac_status;   //编码红外的状态(用于开关温度调节)
void demo()
{char *filepath = "/spiffs/xxx/xxx.bin";ac_status.ac_mode = AC_MODE_COOL;ac_status.ac_power = AC_POWER_OFF;ac_status.ac_temp = AC_TEMP_26;ac_status.ac_wind_dir = AC_SWING_ON;ac_status.ac_wind_speed = AC_WS_LOW;ir_file_open(1,0,filepath);       //打开文件。空调代号1uint16_t decode_len = ir_decode(KEY_AC_POWER, decoded, &ac_status, 0); //获得编码数组ir_close(); //关闭文件//格力的代码会发送两帧一模一样的数据,这里我只取第一帧if(decode_len > 200){decode_len = (decode_len + 1) / 2;}item_num = (decode_len / 2); //item数量是数组长度的一半size = (sizeof(rmt_item32_t) * item_num);item = (rmt_item32_t *)malloc(size);irext_build(item, item_num); //根据数组构建itemrmt_write_items(tx_channel, item, item_num, true); //将item集合写入通道对应的RAM并进入阻塞rmt_wait_tx_done(tx_channel, portMAX_DELAY); //等待发送完成 进入阻塞free(item);
}

主要的是irext_build()函数,nec_fill_item_level()在之前的文章也提过了。

/** irext_build* brief:通过irext构建item 使用全局变量*/
static void irext_build(rmt_item32_t* item,size_t item_num)
{int i = 0;nec_fill_item_level(item, decoded[0], decoded[1]);for (i = 1; i < item_num;i++){item++;nec_fill_item_level(item, decoded[2*i], decoded[2*i + 1]);}
}

nec_fill_item_level()接收的参数是单位是us,所以我直接将数组里的数据放进去就行

/** @brief 填充item的电平和电平时间 需要将时间转换成计数器的计数值 /10*RMT_TICK_10_US*/
static inline void nec_fill_item_level(rmt_item32_t* item, int high_us, int low_us)
{item->level0 = 1;item->duration0 = (high_us) / 10 * RMT_TICK_10_US;item->level1 = 0;item->duration1 = (low_us) / 10 * RMT_TICK_10_US;
}

四,小结

本文的例子只展示了如何在esp32上使用irext,其他设备也是可以的,irext支持的平台很多。
irext可能是唯一一个开源的红外码库,使用也方便,对开发者还是非常友好的,但是网上的相关资料有点少,希望你点个赞,让更多使用红外的开发者能发现这个宝库。

电器类型代号

        {"id": 1,"name": "空调","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 2,"name": "电视机","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 3,"name": "机顶盒","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 4,"name": "网络盒子","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 5,"name": "IPTV","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 6,"name": "DVD","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 7,"name": "风扇","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 8,"name": "投影仪","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 9,"name": "音响","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 10,"name": "灯","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 11,"name": "机顶盒","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 12,"name": "扫地机器人","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 13,"name": "空气净化器","status": 1,"updateTime": "2016-11-27 11:00:00"},{"id": 14,"name": "Dyson","status": 1,"updateTime": "2017-01-20"}

esp32实现万能红外遥控器 基于开源红外码库IREXT相关推荐

  1. 学习型红外遥控器设计(2) 红外遥控学习方案设计

    学习型红外遥控器设计(0) 摘要   (1) 绪论  (2) 方案设计   (3) 遥控解码   (4) 编码还原  (5) 硬件实现   (6) 总结展望 2.1  设计目标及要求 本文设计的万能学 ...

  2. 学习型红外遥控器设计(3) 红外遥控解码学习

    学习型红外遥控器设计(0) 摘要   (1) 绪论  (2) 方案设计   (3) 遥控解码   (4) 编码还原  (5) 硬件实现   (6) 总结展望 如方案设计所述,制作红外接收解码装置,该装 ...

  3. 学习型红外遥控器设计(4) 红外遥控编码还原

    学习型红外遥控器设计(0) 摘要   (1) 绪论  (2) 方案设计   (3) 遥控解码   (4) 编码还原  (5) 硬件实现   (6) 总结展望 如方案设计所述,制作红外编码发射装置,该装 ...

  4. 基于ESP8266和SU-03T的离线语音红外遥控器设计

    一. 系统设计及框图 之前设计了基于ESP32模块的智能红外遥控器,具体功能见以下CSDN链接: 智能红外遥控器(一):功能简介_远望创客学堂的博客-CSDN博客 上面这款智能红外遥控器可以实现红外的 ...

  5. 学习型红外遥控器设计(5) 万能学习型红外遥控器实现

    学习型红外遥控器设计(0) 摘要   (1) 绪论  (2) 方案设计   (3) 遥控解码   (4) 编码还原  (5) 硬件实现   (6) 总结展望 如方案设计所述,制作万能学习型红外遥控器, ...

  6. 基于Arduino的红外遥控器控制MP3播放

    基于Arduino的红外遥控器控制MP3播放(MP3音乐模块.红外接收模块.红外遥控器) ✨通过红外遥控器来控制音乐播放

  7. 【物联网毕设基础】单片机:NEC 协议红外遥控器

    文章目录 NEC 协议红外遥控器 NEC 协议红外遥控器 家电遥控器通信距离往往要求不高,而红外的成本比其它无线设备要低的多,所以家电遥控器应用中红外始终占据着一席之地.遥控器的基带通信协议很多,大概 ...

  8. 和12岁小同志搞创客开发:如何驱动红外遥控器?

    目录 1.红外遥控器通信原理 2.NEC协议 3.实践 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_3810 ...

  9. 【字符设备驱动】 -- NEC红外通信原理|红外协议|红外驱动|红外编解码|红外遥控器...

    目录 1. 红外基本介绍: 红外线的特点 红外线发射和接收 2.NEC协议介绍: NEC的数据格式: NEC协议中数据(DATA)段编码: NEC协议典型脉冲链: NEC载波调制: NEC载波解调: ...

  10. 基于STM32的万能红外遥控器

    本博客介绍一种基于STM32的可学习和存储已有红外发射设备的万能红外遥控器的设计思路. 一.首先需要了解设计一款这功能的遥控器需要什么硬件设备支持. 1.3.3V,5V电源模块,用作给系统模块供电和单 ...

最新文章

  1. “含光”剑出,谁与争锋?阿里重磅发布首颗AI芯片含光800
  2. Cannot set property 'render' of undefined
  3. Spring学习(8)--- @Autowired注解(一)
  4. 计算机模拟多孔碳,多孔碳材料分子设计的三种方法
  5. Jackson 注解 -- 使用构造器
  6. postfix+squirrelmail - rhat 5.4
  7. 将图片转存为其它颜色格式(GDI+)
  8. 网站设计好怎么上传到服务器的,虚拟主机上传到网站的几个步骤
  9. Android 8.0 EditText 焦点无法移动到其他控件
  10. 数字蝶变,离不开云原生“苍穹”
  11. 有效利用ASP.NET用户控件的事件委托
  12. 如何在 Apple TV 上更快地打开您喜爱的应用?
  13. mysql:Cannot load driver class: com.mysql.jdbc.Driver
  14. 实验一:JDK下载与安装、 Eclipse下载与使用
  15. 八天学会Ansys命令流
  16. java+ElementUI前后端分离旅游项目第二天 旅游管理和自由行
  17. python量化分析
  18. 互联网快讯:瑞幸回应价格异常;极米H3S、极米Z6X Pro受用户青睐;知网回应被中科院停用
  19. Android的WebView如何播放视频和全屏视频(腾讯X5内核)
  20. 无固定公网IP,群晖动态解析域名到动态公网IP

热门文章

  1. Halcon基础操作
  2. centos文件锁定解锁_解锁后轻松替换锁定的文件
  3. java 上位机_java实现上位机与下位机串口通信
  4. java笔画数_Java调用setStroke()方法设置笔画属性的语法 原创
  5. 用Python转码恢复乱码中文
  6. 曼切斯特编码波特率和比特率的关系
  7. java实现屏幕截图
  8. Android下载PDF文件
  9. java pdf 转tif_JAVA中 PDF文件转成TIFF文件的2种方式
  10. 软件测试项目实战(web+app+h5+小程序)