|
本帖最后由 zly188 于 2021-10-21 13:18 编辑
一、概述
433M/315M的无线在现实生活中使用很广泛,尤其是一些小家电里的无线遥控,比如遥控车库门、遥控晾衣架、无线开关、无线窗帘电机等。
无线遥控器常用的编码方式有两种类型,即固定码与滚动码两种,滚动码是固定码的升级换代产品,目前凡有保密性要求的场合,都使用滚动编码方式。而固定码目前常用的有编码格式有2262、1527等,还有一些私有协议,比如宁波杜亚电机协议。
本扩展库为通过单片机来实现1527、2262、杜亚电机等的编码,驱动无线模块发送无线信号来控制对应的设备。
扩展库后续还会添加无线解码功能,用来解码无线编码数据。
二、硬件连接方式
测试用的无线模块为433.92频率的模块,具体参数如下
点击链接购买
三、库的函数功能和说明
1.1527编码说明
如上图,包含一个同步头,20位地址码,4位开关码
同步头高电平和低电平脉宽比为1:31;
数据1高电平和低电平脉宽比为3:1;
数据0高电平和低电平脉宽比为1:3;
4LCK脉宽范围300-500us之间,常用的有350us,公牛面板为400us。
无线信号容易受到扰乱,尤其第一帧,所以数据至少需要连续发送3次以上。
库里默认为重复发送10次,如需修改,请看下面关于BlueRFLink基类的说明。
扩展库为使用C++编写,rf1527类包含初始化和发送两部分,继承至BlueRFLink基类
- class rf1527:public BlueRFLink
- {
- public:
- rf1527(uint8_t tx_pin, timer_base_t timer):BlueRFLink(tx_pin,timer)
- {
- setProtocol(13);//默认使用公牛的协议,这样公牛面板和其他厂家的面板都能兼容,公牛面板只支持这个。
- };
- void send(uint32_t address, uint8_t data);
- };
复制代码
- rf1527(uint8_t tx_pin, timer_base_t timer)
复制代码 初始化参数,第一个为发送的引脚;第二个为调用的定时器:ASR有TIMER0-3 4个定时器可以调用,注意不要和其他库同时调用同一个定时器,造成冲突;
- void rf1527::send(uint32_t address, uint8_t data)
复制代码 发送参数,第一个为C0-C19的20位地址,一般为出厂统一设置,程序上可以用EEPROM或者FLASH来存储;第二个为D0-D3的数据,包含(0~15)16种开关;
注意有些设备会有特殊的设置,比如官方提供的无线插座,数据位需要大于1。
2.2262编码说明
如上图,
同步头:高电平和低电平脉宽比为1:31;
数据0: 1 Pulse High + 3 Pulses Low + 1 Pulse High + 3 Pulses Low
数据1: 3 Pulses High + 1 Pulse Low + 3 Pulses High + 1 Pulse Low
数据F: 1 Pulse High + 3 Pulses Low + 3 Pulses High + 1 Pulse Low
包含最大12位地址,其中有6位数据和地址共用。
我们从2262的脉冲时序来看,可以发现和1527编码类似,都是24位+同步,所以程序上,底层和1527一样,调用的是同一个函数。
扩展库为使用C++编写,rf2262类包含初始化和发送两部分,继承至BlueRFLink基类
- class rf2262:public BlueRFLink
- {
- public:
- rf2262(uint8_t tx_pin, timer_base_t timer):BlueRFLink(tx_pin,timer){setProtocol(1);};
- void sendTriState(const char* sCodeWord);
- };
复制代码
- rf2262(uint8_t tx_pin, timer_base_t timer)
复制代码 初始化参数,第一个为发送的引脚;第二个为调用的定时器:ASR有TIMER0-3 4个定时器可以调用,注意不要和其他库同时调用同一个定时器,造成冲突;
- /**
- * @brief 2262三态数据发送
- * @param sCodeWord 三态字符串("0000011111FF")
- */
- void rf2262::sendTriState(const char* sCodeWord)
复制代码
3.杜亚电机编码说明
宁波杜亚是全球最大的一家门窗电机制造商,目前市面上的智能窗帘电机大部分都是出自他家,不是他家的,里面的通讯协议也会兼容他的,所以他的电机私有协议,已经默认为行业协议。不过网上有关电机的无线遥控部分的协议资料很少,通过不断的分析得到如下协议。
同步+28 Bit ID(地址) + 4 Bit CH (通道)+ 8 Bit CMD(命令)
同步 _|——————————————|________|
时间 _|————11.95T———————|__3.9T__|
DATA(H)_|————————|__|
_|——1.75T———|1T|
DATA(L)_|——|____________|
_|1T |——1.75T———|
CH=0 群控,最大15
CMD=0x11 开;CMD=0x55 停;CMD=0x33 关;MD=0xCC 对码;CMD=0x1E 固定点动开;CMD=0x3C 固定点动关;
*/
扩展库为使用C++编写,dooya类包含初始化和电机控制等部分,继承至BlueRFLink基类
- class dooya:public BlueRFLink
- {
- public:
- dooya(uint8_t tx_pin, timer_base_t timer):BlueRFLink(tx_pin,timer)
- {
- setProtocol(14);
- setChannel(1);
- setAddress(0xfffffff);
- };
- void motorCW();
- void motorCCW();
- void motorStop();
- void motorInchingCW();
- void motorInchingCCW();
- void matchCode();
- void setAddress(uint32_t addr);
- void setChannel(uint8_t ch);
- void sendCmd(uint8_t cmd);
- private:
- uint32_t _address;
- uint8_t _ch;
- };
复制代码
- dooya(uint8_t tx_pin, timer_base_t timer)
复制代码 初始化参数,第一个为发送的引脚;第二个为调用的定时器:ASR有TIMER0-3 4个定时器可以调用,注意不要和其他库同时调用同一个定时器,造成冲突;
- /**
- * @brief 设置出厂地址
- * @param addr 地址
- */
- void dooya::setAddress(uint32_t addr)
- /**
- * @brief 设置通道
- * @param ch 通道,0为群控,最大15
- */
- void dooya::setChannel(uint8_t ch)
复制代码 设置地址,长度为28位,一般为出厂统一设置,程序上可以用EEPROM或者FLASH来存储
设置通道,0为群控,最大15
和电机配对的时候,需要发送这个命令。
- void dooya::motorCW()
- void dooya::motorCCW()
- void dooya::motorStop()
- void dooya::motorInchingCW()
- void dooya::motorInchingCCW()
复制代码 设置电机不同的状态,点动控制有些设备不支持。
- /**
- * @brief 发送自定义命令
- * 还有开关灯等其他命令,根据实际情况自己设置
- */
- void dooya::sendCmd(uint8_t cmd)
复制代码 有些遥控还有照明按键,目前还没分析对应的命令码,开放接口给用户自己处理,后期会更新。
4.BlueRFLink基类说明
- class BlueRFLink
- {
- public:
- BlueRFLink(uint8_t tx_pin, timer_base_t timer);
- struct HighLow {
- uint8_t high_pulse;
- uint8_t low_pulse;
- };
- struct Protocol {
- /** base pulse length in microseconds, e.g. 350 */
- uint16_t pulseLength;//最小脉宽
- HighLow sync;//同步头的高低脉宽比例因子
复制代码- static const BlueRFLink::Protocol proto[]=
- {
- { 350, { 1, 31 }, { 1, 3 }, { 3, 1 }, false }, // protocol 1
- { 650, { 1, 10 }, { 1, 2 }, { 2, 1 }, false }, // protocol 2
- { 100, { 30, 71 }, { 4, 11 }, { 9, 6 }, false }, // protocol 3
- { 380, { 1, 6 }, { 1, 3 }, { 3, 1 }, false }, // protocol 4
- { 500, { 6, 14 }, { 1, 2 }, { 2, 1 }, false }, // protocol 5
- { 450, { 23, 1 }, { 1, 2 }, { 2, 1 }, true }, // protocol 6 (HT6P20B)
- { 150, { 2, 62 }, { 1, 6 }, { 6, 1 }, false }, // protocol 7 (HS2303-PT, i. e. used in AUKEY Remote)
- { 200, { 3, 130}, { 7, 16 }, { 3, 16}, false}, // protocol 8 Conrad RS-200 RX
- { 200, { 130, 7 }, { 16, 7 }, { 16, 3 }, true}, // protocol 9 Conrad RS-200 TX
- { 365, { 18, 1 }, { 3, 1 }, { 1, 3 }, true }, // protocol 10 (1ByOne Doorbell)
- { 270, { 36, 1 }, { 1, 2 }, { 2, 1 }, true }, // protocol 11 (HT12E)
- { 320, { 36, 1 }, { 1, 2 }, { 2, 1 }, true }, // protocol 12 (SM5212)
- { 400, { 1, 31 }, { 1, 3 }, { 3, 1 }, false }, // protocol 13 公牛无线开关
- { 20, { 239, 78}, { 20, 35 }, { 35, 20 }, false} // protocol 14 Dooya DC1600
- };
复制代码
四、综合案例
1.语音控制公牛无线面板
公牛无线开关面板
配对操作说明:
长按面板直到发出“嘀”一声,绿色指示灯闪烁,对着天问ASR说,打开灯光,会发送无线信号,面板配对成功会发出“嘀”一声,绿色指示灯常亮。
取消配对操作说明:
长按面板直到发出“嘀嘀”两声。
更多说明,请查看配套说明书。
天问定制无线开关面板
点击链接购买
先唤醒语音识别,长按主开关按键3秒,听到“滴”的一声松手,此时对着天问ASR说,打开灯光,会发送无线信号,主开关会同时发出滴一声,即配对成功。配对成功后,发配对的相同指令,如果原来开的那就关灯了,如果关灯的那就开灯。(二开,三开以此方法依次配对使用)
有没有开指令控制开灯,关指令控制关灯呢。这时就要用分别学习开和关指令的方法来控制灯了。
学习开灯指令:长按主开关按键5秒,听到“滴滴”的两声松手,此时对着天问ASR说,打开灯光,即可实现此功能。
学习关灯指令:长按智能开关7秒,听到“滴滴滴”的三声松手,此时对着天问ASR说,关闭灯光,即可实现此功能。(注意这里程序上要和打开灯光的命令不同)
取消配对:长按智能开关10秒,听到“滴滴滴滴”的四声松手,即可清除配对。
注意:在“滴滴”声后,1-2秒里,就应该发送学习的无线指令。不然学习无效。请注意控制时间。
更多说明,请查看配套说明书。
天问定制无线插座
点击链接购买
配对操作说明:
把插座插上电源孔里,在插座开关,关闭状态下,长按按钮直到指示灯红色快速闪送后,松开按钮,指示灯慢闪,进入配对模式,对着天问ASR说,打开插座,会发送无线信号,插座红色指示灯会闪烁几下,确认配置成功。
更多说明,请查看配套说明书。
程序编写说明:
指示灯为红色的版本,发送同一条无线命令,可以在“开”、“关”两种状态之间来回切换。
指示灯为蓝色的版本,“开”:状态对应一条指令;“关”:状态对应另外一条指令;两条指令的区别是数据位的最高位为1表示开,为0表示关。
如上图的数据位9(1001)为开、数据位1(0001)为关。
2.用天问ASR+433M无线发射模块控制窗帘
点击链接购买窗帘电机
恢复出厂模式
长按电机设置键 10 秒,指示灯绿灯闪烁 5 次松手,恢复出厂设置成功,清除所有用户
设置并将电机恢复至默认状态。
对码

更多说明,请查看配套说明书。
语音控制窗帘和灯光
语音控制晾衣架
|
|