『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 24076|回复: 38

[新奇玩法] DIY个多按键zigbee2mqtt zigbee 遥控器

[复制链接]

18

主题

202

帖子

1356

积分

论坛DIY达人

积分
1356
金钱
1129
HASS币
100
发表于 2021-7-26 11:33:59 | 显示全部楼层 |阅读模式
本帖最后由 zro22 于 2023-7-29 13:23 编辑

该遥控器免费送,邮费到付

家里各种设备都接入HA了。面对一大堆遥控器,能否大统一。之前搞了ESPHOME接收红外遥控器信号接入HA,地址不过遥控器需要对着红外接收头,基本只能在一个房间控制。
也搞过ESPHOME接收RF射频接入HA,地址 不过弄了半天反应不灵敏,不知道为何。
最近搞了zigbee2mqtt,翻网页发现老毛子有人做了一个20建zigbee遥控器地址
PIC20210726105620001.jpg
不过他这个遥控器感觉有点粗犷,并且按键还是不够多。
我想要一个可以用来控制我的N1 CE媒体播放的遥控器,另外可以遥控窗帘,灯,功放和投影。
这样一个遥控器搞定看片。
按照他这个思路,我只要找一个电视遥控器,然后把主控换成cc2530就可以了。
说干就干,先找一个便宜的遥控器
这个便宜,咸鱼几块钱,这个有7x7=49个键,不错就他了。
PIC20210726105909001.jpg PIC20210726110645001.jpg
先画原理图
PIC20210726094858001.jpg
然后做了一个PCB
PIC20210726110807001.jpg
回来发现问题了,锅仔片的地方我画错焊盘了。
后来想了想,我直接用他原来的PCB,只要把cc2530相应的GPIO连上就可以了
同时觉得这个中国电信遥控器实在做工太差了,继续寻找便宜做工好的遥控器,最后锁定HP的MCE遥控器,买。同样是7x7 49键。
PIC20210726111055001.jpg
拆 焊线,一气呵成,就成这样了,丑是丑了点,不过都会被外壳包住的。线粘好不乱跑就好。
PIC20210726111146001.jpg PIC20210726111153001.jpg
硬件完成,同时把dc dd rest拉线出来压到电池下面,好刷固件用。
硬件完成,接下来是软件。
先把开源固件源程序下载下来。
下载TI z-stack,以及IAR 10 就可以打开程序了,程序需要放到这个目录 Texas Instruments\Z-Stack 3.0.2\Projects\zstack\HomeAutomation\freepad-2.0.7
原本程序是20个按键的,先给修改到49个,程序超大了,编译不过,一顿修改,编译过了。
不过改完按钮就连不上z2m了。看来需要按照新器件来添加,总之折腾了好几天,没弄成功,放弃了这条路。
自定义设备走不通,那就再原设备基础上看看怎么把20个按键扩充到49个。
原设备EP有20个,对应每个按键,每个按键支持单击 双击 三击 四击 按住。
PIC20210726112117001.jpg
我的遥控器只需要单击功能,所以我可以把1-20对应单击,21-40对应双击,41-60对应三击。嗯,想法不错,去程序里面看看咋修改。
程序如下:对,那两句红色是我加的。
static void zclFreePadApp_SendKeys(byte keyCode, byte pressCount, bool isRelease) {
    byte button = zclFreePadApp_KeyCodeToButton(keyCode);
    pressCount = button/FREEPAD_BUTTONS_COUNT + 1;
    button = button%FREEPAD_BUTTONS_COUNT;
    uint8 endPoint = zclFreePadApp_SimpleDescs[button - 1].EndPoint;
    if (isRelease) {
        zclFreePadApp_SendButtonPress(endPoint, RELEASE_CODE);
    } else {
        zclFreePadApp_SendButtonPress(endPoint, pressCount);
    }
}


还需要修改hal_key.c.把原本只上报4x5 20个按键换成 上报7x7 49个按键,原本是这样上报的。key = (((row << 2) | col >> 1)) >> 1;
修改成,至于为什么不按照顺序来,是为了让key1 两个程序兼容。当然还需要修改 HAL_KEY_P0_GPIO_PINS HAL_KEY_P1_GPIO_PINS HAL_KEY_P0_INPUT_PINS HAL_KEY_P1_INPUT_PINS 的宏定义,把对应的GPIO打开。
if(row & 0x80)
          row2 = 6;
        else if(row & 0x40)
          row2 = 5;
        else if(row & 0x20)
          row2 = 4;
        else if(row & 0x10)
          row2 = 3;
        else if(row & 0x08)
          row2 = 2;
        else if(row & 0x04)
          row2 = 1;
        //else if(row & 0x02)
        //  row2 = 2;
        else if(row & 0x01)
          row2 = 7;
        else
          row2 = 0;

        if(col & 0x80)
          col2 = 6;
        else if(col & 0x40)
          col2 = 5;
        else if(col & 0x20)
          col2 = 4;
        else if(col & 0x10)
          col2 = 3;
        else if(col & 0x08)
          col2 = 2;
        else if(col & 0x04)
          col2 = 1;
        else if(col & 0x02)
          col2 = 7;
        else if(col & 0x01)
          col2 = 8;
        else
          col2 = 0;
        key = (row2 << 4) | col2;


然后再到zcl_freepadapp_data.c里面修改转换函数。
byte zclFreePadApp_KeyCodeToButton(byte key) {
#if defined(HAL_BOARD_FREEPAD)
  return ((key>>4)-1)*8 + (key&0xF);
#else


这里还有一个坑,cc2530的P1.0为高的时候不知道为什么P1.1也会为高,导致连接在这两个IO的按键分不开,所以可以看原理图,我没有使用P1.0这个IO。
改完后发现,快速按按键,会漏报,修改下面 200到50.这样间隔50ms的按键都可以捕捉到。
void HalKeyPoll(void) {
    uint8 keys = 0;

    keys = HalKeyRead();

    if (pHalKeyProcessFunction) {
        (pHalKeyProcessFunction)(keys, HAL_KEY_STATE_NORMAL);
    }

    if (keys != HAL_KEY_CODE_NOKEY) {
        osal_start_timerEx(Hal_TaskID, HAL_KEY_EVENT, 200);
    } else {
        halKeyTimerRunning = FALSE;
    }
}

编译,生成程序,配对。完成。
按下按键后命令在这个topic里面
zigbee2mqtt/<friendly_name>/action我把程序放到这里了https://github.com/almus2zhang/zb49remoter
gerber文件
Gerber_PCB_zbremote-0805.zip (184.45 KB, 下载次数: 6)


评分

参与人数 3金钱 +35 HASS币 +20 收起 理由
924215947 + 10
cym9007 + 5 感谢楼主分享!
+ 20 + 20 厉害了word楼主!

查看全部评分

回复

使用道具 举报

8

主题

158

帖子

1197

积分

金牌会员

Rank: 6Rank: 6

积分
1197
金钱
1039
HASS币
0
发表于 2021-7-26 11:37:01 | 显示全部楼层
牛人,我也打了个板
回复

使用道具 举报

18

主题

202

帖子

1356

积分

论坛DIY达人

积分
1356
金钱
1129
HASS币
100
 楼主| 发表于 2021-7-26 11:42:50 | 显示全部楼层
bluebaby 发表于 2021-7-26 11:37
牛人,我也打了个板

我的PCB白做了,用不上,直接用原来的板子还更方便
回复

使用道具 举报

18

主题

202

帖子

1356

积分

论坛DIY达人

积分
1356
金钱
1129
HASS币
100
 楼主| 发表于 2021-7-26 13:07:23 | 显示全部楼层
bluebaby 发表于 2021-7-26 11:37
牛人,我也打了个板

量了一下中国电信遥控器发现,没法用他的PCB,他的按键居然不是矩阵式结构,是网状结构的。晕了。
回复

使用道具 举报

32

主题

2005

帖子

5103

积分

论坛元老

Rank: 8Rank: 8

积分
5103
金钱
3098
HASS币
50
QQ
发表于 2021-7-26 13:37:01 | 显示全部楼层
大佬厉害。
我不生产技术,我只是技术的搬运工。
回复

使用道具 举报

6

主题

292

帖子

2087

积分

金牌会员

Rank: 6Rank: 6

积分
2087
金钱
1795
HASS币
0
QQ
发表于 2021-7-26 16:02:41 | 显示全部楼层
这个想法我之前也想过  不过遥控器不行啊  没办法做这个东西   然后楼主的代码在哪里找到的 我找了很久都没有找到  在哪里编译能不能发链接给我 谢谢
回复

使用道具 举报

4

主题

88

帖子

1930

积分

论坛技术达人

积分
1930
金钱
1837
HASS币
20
发表于 2021-7-26 16:30:21 | 显示全部楼层
向大佬学习
回复

使用道具 举报

18

主题

202

帖子

1356

积分

论坛DIY达人

积分
1356
金钱
1129
HASS币
100
 楼主| 发表于 2021-7-26 17:47:45 | 显示全部楼层
924215947 发表于 2021-7-26 16:02
这个想法我之前也想过  不过遥控器不行啊  没办法做这个东西   然后楼主的代码在哪里找到的 我找了很久都没 ...

程序地址
https://github.com/diyruz/freepad
然后去TI网站下载Z-stack3.0.2
然后下载IAR https://www.jb51.net/softs/537074.html
就可以编译了

回复

使用道具 举报

8

主题

158

帖子

1197

积分

金牌会员

Rank: 6Rank: 6

积分
1197
金钱
1039
HASS币
0
发表于 2021-7-27 08:42:29 | 显示全部楼层
zro22 发表于 2021-7-26 11:42
我的PCB白做了,用不上,直接用原来的板子还更方便

主要是捷配和嘉立创免费打板,就打了几个。
回复

使用道具 举报

6

主题

292

帖子

2087

积分

金牌会员

Rank: 6Rank: 6

积分
2087
金钱
1795
HASS币
0
QQ
发表于 2021-7-27 11:26:00 | 显示全部楼层
zro22 发表于 2021-7-26 17:47
程序地址
https://github.com/diyruz/freepad
然后去TI网站下载Z-stack3.0.2

好的 谢谢 不过看到这样样子  我也是不会编译程序的
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-2 08:35 , Processed in 0.060230 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表