【电子DIY作品】空调遥控器 M61+红外

[复制链接]
查看295 | 回复8 | 2024-7-29 13:03:54 | 显示全部楼层 |阅读模式

本帖最后由 WildboarG 于 2024-8-15 11:11 编辑

本帖最后由 WildboarG 于 2024-8-13 19:46 编辑

AirCondition

Make a simple air-conditioning remote control with Ai-M61-32S-kit


使用


  1. 连接wifi
  2. 订阅MQTT服务
  3. 接入HOMEASSISTANT

材料准备:


  • M61板子一块
  • 一个简易的红外发射模块
  • 杜邦线3根
  • 数据线 红外发射模块原理图

image.png

原理


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

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

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

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

红外编码:

如何获取红外编码?

  1. 手动分析编码协议。没有逻辑分析仪
  2. 借助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调试

逻辑实现:

通过定时器来模拟38KHZ频率反转GPIO来控制红外发射管发送数据(已弃用)

采用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]); // 低电平(空闲时间)
        }
    }
}

食用


  1. 克隆仓库AirCondition
  2. 首先需要获取你家空调遥控对应的红外编码(上边给了两种方法)
  3. 修改本例程
    • 配置wifi ,mqtt订阅主题 (/state/user_state.h)
    • 获取空调遥控器的RawData 以数组的形式存放user_aric.c 目录下
  4. 烧录

接入HOMEASSISTANT


假设你已经有了HA基础

  1. 在HACS中下载 Lovelace Thermostat组件,按照说明配置
  2. 修改 configuration.yaml文件
  3. 添加设备发现
    mqtt:
       - climate:
           name: AC
           temperature_command_topic: "home/ac"
           precision: 1.0
  4. 然后更新配置,再到概览中添加UI 卡片,类型为恒温器

image.png

备注


  1. 定时器模拟载波已经更新为PWM控制更准确
  2. 更新了WB2版本的,在同一仓库下

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

下载:

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

上图:

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

image.png

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

image.png

还有个演示视频,等会传到bilibili

<iframe src="https://player.bilibili.com/player.html?isOutside=true&aid=112868032778077&bvid=BV1nevPefE5E&cid=500001631075224&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>

回复

使用道具 举报

WildboarG | 2024-7-29 13:15:41 | 显示全部楼层
回复 支持 反对

使用道具 举报

WT_0213 | 2024-7-29 13:42:09 | 显示全部楼层
回复

使用道具 举报

爱笑 | 2024-7-29 13:54:38 | 显示全部楼层
不错不错,帖子排版很美观!
用心做好保姆工作
回复 支持 反对

使用道具 举报

bzhou830 | 2024-7-29 14:54:32 | 显示全部楼层
厉害,很棒
选择去发光,而不是被照亮
回复

使用道具 举报

lhs_hfs | 2024-7-29 17:38:12 | 显示全部楼层
回复

使用道具 举报

King6688 | 2024-7-30 18:07:07 | 显示全部楼层
回复

使用道具 举报

小小鸟 | 2024-7-31 11:26:17 | 显示全部楼层
厉害
回复

使用道具 举报

粉肠 | 2024-8-1 00:01:15 | 显示全部楼层
好强
回复

使用道具 举报

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

本版积分规则