ESPHome实现松下LED灯遥控

松下(Panasonic)的LED灯,遥控器型号HK9811,使用ESP32-S3接入HomeAssistant实现总控。

一般红外遥控协议使用NEC协议的比较多,松下的资料比较少。踩了不少坑记录一下。

关于Panasonic协议,似乎是一种AEHA协议的实现,两者的时序非常相似

AEHA协议时序如下

  • T = 350~500μs (425μs typ.)

引用:http://elm-chan.org/docs/ir_format.html

通过使用红外接收器分析遥控器信号,以及网上查找的资料,确定遥控器编码如下,这款遥控器采用的不是Panasonic标准的48位编码,而是40位编码

CommandChannel 1Channel 2Channel 3
on0x344A90B4240x344A90AC3C0x344A90BC2C
full0x344A9034A40x344A902CBC0x344A903CAC
night0x344A9074E40x344A906CFC0x344A907CEC
high0x344A9054C40x344A904CDC0x344A905CCC
low0x344A90D4440x344A90CC5C0x344A90DC4C
off0x344A90F4640x344A90EC7C0x344A90FC6C

引用:https://github.com/crankyoldgit/IRremoteESP8266/issues/1976#issuecomment-1531687356

之后是编辑EPSHome的yaml文件(硬件采用ESP32-S3开发板,以Channel2的on为例)

红外发送器引脚

红外发送器ESP32S3
VCC5V
GNDGND
DAT

GPIO10

由于ESPHome提供的Panasonic信号为48位的,所以不能使用自带的transmit_panasonic发送,而是通过raw进行发送

esphome.yaml

esphome:
  name: esp32s3-dev-1
  friendly_name: ESP32S3-Dev-1

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: arduino

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxx"

ota:
  - platform: esphome
    password: "xxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: true

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32S3-Dev-1 Fallback Hotspot"
    password: "xxxxxxxxxx"

captive_portal:

# 发送器配置
remote_transmitter:
  pin: GPIO10
  carrier_duty_percent: 33%

button:
  - platform: template
    name: "IR Send Test"
    on_press:
      - remote_transmitter.transmit_raw:
          carrier_frequency: 38kHz
          code: [
            3480, -1740,  # Leader (8T, 4T)
            # 地址码 0x344A = 0011 0100 0100 1010 (16位)
            435, -435,    # 0
            435, -435,    # 0
            435, -1305,   # 1 
            435, -1305,   # 0
            
            435, -435,    # 0 
            435, -1305,   # 1
            435, -435,    # 0
            435, -435,    # 0
            
            435, -435,    # 0 
            435, -1305,   # 1
            435, -435,    # 0
            435, -435,    # 0
            
            435, -1305,   # 1
            435, -435,    # 0
            435, -1305,   # 1
            435, -435,    # 0
            
            # 命令码 0x90AC3C = 1001 0000 1010 1100 0011 1100 (24位)
            435, -1305,   # 1
            435, -435,    # 0
            435, -435,    # 0
            435, -1305,   # 1
            
            435, -435,    # 0
            435, -435,    # 0
            435, -435,    # 0
            435, -435,    # 0
            
            435, -1305,   # 1
            435, -435,    # 0
            435, -1305,   # 1
            435, -435,    # 0
            
            435, -1305,   # 1
            435, -1305,   # 1
            435, -435,    # 0
            435, -435,    # 0
            
            435, -435,    # 0
            435, -435,    # 0
            435, -1305,   # 1
            435, -1305,   # 1
            
            435, -1305,   # 1
            435, -1305,   # 1
            435, -435,    # 0
            435, -435,    # 0
            
            435          # 结束位 (1T高电平)
          ]
          repeat:
            times: 2
            wait_time: 15ms

最后踩的一个坑就是买的这个红外发送模块的功率实在太小,标称距离1.3米左右,实测也就半米左右才能有效,而且似乎板子上VCC引脚是空的,接不接5V供电效果都是一样的,应该是使用ESP32提供的电流进行工作的

 

在STM32CubeIDE中配置松下按键(如PN532)控制LED亮,首先你需要完成以下步骤: 1. **环境设置**: - 确保安装了STM32CubeMX工具,用于生成HAL库配置文件和启动代码。 - 安装并配置STM32CubeIDE集成开发环境。 2. **硬件连接**: - 连接松下PN532模块到STM32的GPIO引脚,通常需要数字输入输出线和中断线。 - 将LED接到另一个GPIO引脚作为输出。 3. **软件配置**: - 在STM32CubeMX中创建新项目,选择合适的STM32芯片。 - 配置PINMUX,将GPIO端口映射到松下按键和LED上,并设置相应的功能(输入捕获或推挽输出等)。 - 在HAL库初始化阶段,开启相关的GPIO功能和中断支持。 4. **编写代码**: a. 创建`main.c`文件,添加对GPIO和中断服务函数的初始化代码。 b. 编写一个处理按键中断的服务程序,在这个函数里读取按键的状态,例如检查是否有按下事件。 c. 根据按键状态,通过`HAL_GPIO_WritePin()`控制LED的开关。 5. **中断管理**: - 在中断服务函数中,当按键检测到改变时,调用相应的回调函数,比如`HAL_GPIO_EXTI_IRQHandler()` - 在回调函数中处理按键动作(如点亮、熄灭LED),更新GPIO状态。 ```c void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志 if (GPIO_ReadPin(GPIOB, GPIO_Pin_0) == GPIO_PIN_SET) { // 按键按下 HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); // LED亮起 } else { HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET); // LED熄灭 } } } ``` 6. **构建和下载**: - 在STM32CubeIDE中编译工程,然后烧录到STM32板子上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值