专栏名称: 安信可科技
全球领先的联网模组、智能家居等物联网硬件方案提供商。
目录
相关文章推荐
元素和同位素地球化学  ·  这一轮科技爆发缘何并非由院士、杰青、长江学者 ... ·  昨天  
元素和同位素地球化学  ·  这一轮科技爆发缘何并非由院士、杰青、长江学者 ... ·  昨天  
冷眼局中人  ·  解构DeepSeek-R1:一场AI效率革命 ... ·  昨天  
冷眼局中人  ·  解构DeepSeek-R1:一场AI效率革命 ... ·  昨天  
51好读  ›  专栏  ›  安信可科技

用 M61模组做一个红外空调遥控器

安信可科技  · 公众号  · 硬件 科技自媒体  · 2024-08-16 19:31

主要观点总结

本文介绍了使用安信可社区用户WildboarG制作的空调遥控器制作过程和原理。该遥控器通过连接wifi订阅MQTT服务,使用M61板子和简易红外发射模块来制作。文章详细解释了红外编码的获取方式、PWM配置和发送红外信号的方法。还介绍了如何将空调遥控器的RawData以数组形式存放,并烧录接入HOMEASSISTANT,包括在HACS中下载Lovelace Thermostat组件的配置方法。最后,作者提供了相关链接供读者查阅和进一步了解。

关键观点总结

关键观点1: 制作原理与过程

使用M61板子和简易红外发射模块,连接wifi订阅MQTT服务,通过PWM控制红外发射管的亮灭来发送编码信号。

关键观点2: 红外编码的获取

使用esp8266+红外接收模块获取红外编码,通过Arduino示例代码读取原始数据。

关键观点3: PWM配置

配置PWM输出38Khz频率,使用定时器配置和PWM配置来实现。

关键观点4: 接入HOMEASSISTANT

在HACS中下载Lovelace Thermostat组件,修改configuration.yaml文件,添加设备发现,更新配置并添加UI卡片。

关键观点5: 注意事项

定时器模拟载波已更新为PWM控制更精确;提供了WB2版本的复刻方法。


正文


本作品由安信可社区用户

WildboarG制作




使用

连接 wifi

订阅 MQTT 服务

接入 HOMEASSISTANT



材料准备
M61 板子一块
简易的红外发射模块一个
杜邦线3 根
数据线



红外发射模块原理图



原理

空调遥控器简单来讲就是通过红外发射管的亮灭来承载编码信息,对应的空调设备上有一个接收管,它接收到发射管的光信号来解析协议获取数据,然后对空调进行对应指令的控制

例如:将温度设置为 16° 冷风 风速 1 级

既然要控制灯的亮灭,那么就只需要一个 IO 口控制就可以了(除去 VCC 和 GND),手上刚好有一个

M61 板子刚好用上了。一般的控制红外遥控器使用的 38KHZ 频率,所以只要模拟 GPIO 产生 38KHZ 的高低电平就可以控制红外发射管发送数据了。


红外编码

借助 esp8266+ 红外接收模块,用你的遥控器怼着接收模块按键,读取红外发射的原始数据,arduino 有对应的示例代码(IRremoteESP8266/IRrecvDumpV2.ino),连接好线,刷入示例程序,手动按你的遥控器,从串口读取 rawData 数组。

获取的数据大概是这样的:


uint16_t rawData[279] = { 9000, 4442, 608, 1624, 584, 494, 610, 496, 608, 1600, 608, 1602, 608, 494, 608, 496, 608, 496, 608, 496, 608, 494, 610, 520, 584, 1624, 586, 498, 606, 518, 586, 496, 608, 518, 586, 496, 608, 494, 610, 494, 610, 496, 608, 518, 586, 1624, 586, 494, 610, 494, 610, 496, 606, 498, 608, 496, 608, 498, 606, 1600, 610, 520, 584, 1624, 584, 496, 608, 496, 608, 1602, 608, 518, 638, 20150, 606, 496, 608, 496, 608, 496, 608, 496, 608, 1602, 606, 494, 610, 518, 586, 494, 610, 494, 610, 518, 586, 518, 586, 496, 608, 494, 610, 1602, 608, 494, 608, 496, 608, 494, 610, 520, 584, 496, 608, 498, 606, 496, 608, 498, 606, 496, 608, 518, 586, 518, 586, 496, 608, 494, 610, 494, 610, 494, 610, 1600, 608, 1600, 608, 1602, 660, 40406, 9158, 4440, 610, 1602, 608, 496, 608, 496, 608, 1602, 608, 1600, 608, 494, 610, 494, 610, 494, 610, 496, 608, 518, 584, 496, 608, 1602, 608, 518, 584, 496, 608, 496, 608, 496, 608, 496, 608, 496, 608, 496, 608, 494, 610, 498, 606, 1600, 610, 494, 610, 518, 586, 494, 610, 518, 586, 494, 610, 496, 608, 1600, 608, 1600, 608, 1624, 584, 496, 608, 520, 584, 1600, 608, 520, 664, 20150, 608, 518, 584, 496, 608, 496, 608, 496, 608, 520, 584, 496, 608, 496, 608, 494, 610, 518, 586, 496, 608, 496, 608, 498, 606, 496, 608, 494, 610, 496, 608, 496, 608, 494, 610, 496, 608, 496, 606, 496, 608, 1624, 584, 496, 608, 496, 608, 520, 584, 496, 608, 496, 608, 498, 606, 496, 608, 520, 584, 494, 610, 1602, 608, 1600, 608 }; // 24 度


只需要借助 GPIO 连接的红外灯亮灭对应的时长就将数据发送出去了。具体的协议高低电平起始不同,以我的格力空调为例子,它的起始数据是高电平 第一个数据是 9000 也就是说 需要我的 GPIO 输出 9000us 的高电平,(这里说的高电平不是真正的高电平 1,而是需要以 38KHZ 载波的高电平,也就是说需要用 38khz 频率一直高低翻转的电平),而第二个数据是 4442,这就需要真正的低电平延时 4442us,以此类推奇数需要电平反转,偶数需要真正的低电平。直到将这 279 个数据发送完。就完成了控制部分。

参考了zzbinfo 的这篇帖子用 Ai-M61 实现物联网开发(2)---实现远程开机、无线控制、红外遥控"

和 wxlinus 的这篇帖子Ai-M61-32S-Kit 开发板 mqtt 调试


逻辑实现

采用 pwm 输出 38Khz 频率。

pwm 配置:

#if 0      // 定时器配置    struct bflb_timer_config_s cfg0;    cfg0.counter_mode = TIMER_COUNTER_MODE_PROLOAD;     cfg0.clock_source = TIMER_CLKSRC_XTAL;//外部时钟为40M    cfg0.clock_div = 39;   //预分频后 1M    cfg0.trigger_comp_id = TIMER_COMP_ID_0;    cfg0.comp0_val = 13;   //计数13us 约等于38kHz    cfg0.preload_val = 0;          timer0 = bflb_device_get_by_name("timer0");    bflb_timer_init(timer0, &cfg0);    bflb_irq_attach(timer0->irq_num, timer0_isr, NULL);    bflb_irq_enable(timer0->irq_num);
#endif // PWM配置 pwm = bflb_device_get_by_name("pwm_v2_0"); //给外设接口赋名pwm_v2_0
/* period = .XCLK / .clk_div / .period = 40MHz / 7 / 150 ≈ 38KHz */
struct bflb_pwm_v2_config_s cfg = { .clk_source = BFLB_SYSTEM_XCLK, .clk_div = 7, .period = 150, }; //设置PWM的频率,选择时钟,分频,和周期。根据上面的公式算出最终的频率。
/*初始化PWM输出*/ bflb_pwm_v2_init(pwm, &cfg); bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0,0, 75); //占空比50%


发送配置:

void Send_IR(uint16_t *buf,uint8_t len){   // printf("Sending IR code...\n");      bflb_pwm_v2_channel_positive_start(pwm, PWM_CH0);   //开启正向通道    for (uint16_t i = 0; i < len; i++) {        if (i%2==0) {            //bflb_timer_start(timer0);     // 启用38kHz载波的定时器                  bflb_pwm_v2_start(pwm);          //开启pwm            bflb_mtimer_delay_us(buf[i]); // 高电平(脉冲时间)            //bflb_timer_stop(timer0);      // 停止38kHz载波                  bflb_pwm_v2_start(pwm);          //关闭pwm
} else { bflb_gpio_reset(gpio, IR); bflb_mtimer_delay_us(buf[i]); // 低电平(空闲时间) } }}


使用
  • 克隆仓库AirCondition

  • 首先需要获取你家空调遥控对应的红外编码(上边给了两种方法)

  • 修改本例程

    • 配置 wifi ,mqtt 订阅主题 (/state/user_state.h)

    • 获取空调遥控器的 RawData 以数组的形式存放 user_aric.c 目录下

  • 烧录

使用

  • 克隆仓库AirCondition

  • 首先需要获取你家空调遥控对应的红外编码(上边给了两种方法)

  • 修改本例程

    • 配置 wifi ,mqtt 订阅主题 (/state/user_state.h)

    • 获取空调遥控器的 RawData 以数组的形式存放 user_aric.c 目录下

  • 烧录


接入 HOMEASSISTANT

1.在 HACS 中下载 Lovelace Thermostat 组件,按照说明配置

2.修改 configuration.yaml 文件

3.添加设备发现


mqtt:   - climate:       name: AC       temperature_command_topic: "home/ac"       precision: 1.0


代码

4.然后更新配置,再到概览中添加 UI 卡片,类型为恒温器



备注

1.定时器模拟载波已经更新为 PWM 控制更准确

2.更新了 WB2 版本的,在同一仓库下

帖子链接:【DIY 电子作品】WB2 复刻一个空调遥控器

下载:

git clone -b wb2  https://github.com/WildboarG/AirCondition.git

上图:

获取红外编码的 esp8266+ 淘宝不知名的红外接收模块


以前画的一个红外发射模块,淘宝买的没有三极管放大,距离太近了





视频演示












请到「今天看啥」查看全文

推荐文章
魔鬼心理学  ·  12星座这样表现时,证明ta受伤了!
7 年前
财经旗舰  ·  2017.05.11 绵绵阴跌何时休?
7 年前