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

 找回密码
 立即注册
查看: 4399|回复: 10

[技术探讨] 小白diy最简单便宜的蓝牙门磁

[复制链接]

33

主题

312

帖子

1855

积分

金牌会员

Rank: 6Rank: 6

积分
1855
金钱
1538
HASS币
40
发表于 2023-5-4 09:30:08 | 显示全部楼层 |阅读模式
本帖最后由 lione95678 于 2023-5-4 10:00 编辑

最近和门磁搞上了,因为不会用单片机,所以只能选择简单的思路,网上买了jdy-23蓝牙模块和jdy-25m蓝牙模块,配合esp32模块,制作简单的蓝牙门磁,这种门磁价格便宜,jdy-23大概5元,jdy-25m大概7元。
思路:1、多块jdy-25蓝牙模块,使用mesh组网模式,jdy-25m有mesh组网后当低功耗遥控器使用(门磁使用),1块jdy-25m通过串口连接esp32模块(作为接收端使用)。当门开或者门关后,作为门磁的jdy-25m会触发不同的2个按键,通过esp32收到的串口信息来判断门的状态。结果实验下来接受数据没有问题,但作为门磁的jdy-25m功耗太高,作为mesh组网的低功耗遥控器使用,待机电流在1ma左右(如果不是低功耗使用,mesh状态在4ma)。如需继续使用这种方式,要么通过单片机来触发,要么通过外围电路想办法。
2、直接简单点,用jdy-23或者jdy-25m模块作为ibeacon信标使用,使用干簧管或者微动开关作为开关,当门关着的时候,断开蓝牙模块的电源,门开着的时候打开蓝牙模块电源,这时蓝牙模块会自动广播蓝牙信号,按照说明书,信号包括蓝牙模块的MAC、 RSSI 、iBeacon UUID 、Major、 Minor这时只要使用esphome的ble组件和文本传感器组件,就能收到蓝牙的mac、rrsi和模块名称这3个信息。然后通过node-red判断每次收到的信息就可以。(比如2次收到同一模块的信息间隔时间在30秒之内就认为门开了,超过30秒就认为门关了)。而且jdy-23刷成ibeacon模式后,电流在10ua以下,完全满足门磁使用的低功耗条件。(这样最便宜,jdy-23模块5元,基本没有外围电路,不计算外壳的费用(3d打印),一个门磁不会超过7元(含sr2032电池),嘉立创打板不要钱)
3、因为esp32的ble组件扫描间隔等问题,如果node-red的判断时间短了,可能会造成误报,长了有造成判断延迟,如果判断延迟有要求,可以再用1片jdy-25m,刷成ibeacon探针模式后通过串口连接esp32模块,在用node-red判断收到信息的时间就会减少延迟,试下来就算判断时间是3秒也没有误报,但是每个房间都要放1片jdy-25m和esp32作为接收器使用。
4、个人比较倾向mesh组网模式,因为这样只需终端的jdy-25连接esp32使用,其余的信号薄弱点只需要增加1片jdy-25m(不需连接esp32,只要供电,电视机、机顶盒、手机充电器等usb接口都可以),可惜自己小白,不会用单片机,否则增加个stc15f104w或stc15w204s只要1、2元钱的事情。不知道群里的大侠们能否帮忙按照这个思路提供stc15w204s固件或者教程,思路是单片机的串口连接jdy-25m蓝牙模块的串口,1个针脚连接蓝牙模块的供电,1个针脚连接蓝牙模块的联网状态输出针脚,一个针脚连接干簧管或者微动开关。平时单片机处于休眠状态,当门开或者关时,因为高低电平变化,触发单片机接触休眠模式,并触发1个针脚输出高电平,以给蓝牙模块供电,然后检测蓝牙模块的联网状态输出针脚状态,当联网后就延时1s给连接了esp32串口的jdy-25模块发送串口数据(可以发送多次,防止未收到)。
5、下面是esphome的代码及node-red的流程:
1)esphome的蓝牙扫描及文本传感器(之所以使用文本传感器,是因为使用二进制传感器的话,esphome只有长时间没有收到才会进行判断5分钟以上,应该可以设置,但我没有测试,而且文本的话还能通过nodere-d干其他事情)
esp32_ble_tracker:

text_sensor:
  - platform: ble_scanner
    name: "BLE Devices Scanner"
    disabled_by_default: false
    internal: false
2)esphome的串口透传模式,注意,串口透传和蓝牙扫描尽量不要同时使用,我在同时使用时会出现警告或者错误,好像是数据溢出,串口透传详见github上oxanesphome-stream-serverhttps://github.com/oxan/esphome-stream-server
external_components:
  - source: github://oxan/esphome-stream-server

uart:
  tx_pin: GPIO19
  rx_pin: GPIO18
  baud_rate: 9600
  id: uart_bus1
   


stream_server:
   uart_id: uart_bus1
   port: 1234

binary_sensor:
  - platform: stream_server
    connected:
      name: Connected

sensor:
  - platform: stream_server
    connection_count:
      name: Number of connections
3)node-red的流程,简单的说就是读取homeassiatant中蓝牙文本传感器的内容,然后通过一个json节点将msg.payload的内容进行拆分,在用一个switch节点进行判断,后面用一个函数节点,把符合要求的蓝牙模块的当次触发时间保存为全局变量,后面通过每次蓝牙文本传感器的触发时间与保存的全局变量进行对比,当数字大于多少后msg.payload为off,小于多少后msg.payload为on,后面再加一个node-red虚拟的二进制传感器就可以了,这样homeassistant就能看到这个虚拟二进制传感器的状态了。
[
    {
        "id": "0446174ddff59de7",
        "type": "server-state-changed",
        "z": "a479b09bca78b004",
        "name": "sensor.ble_devices_scanner",
        "server": "9ba8ac3a.124df",
        "version": 4,
        "exposeToHomeAssistant": false,
        "haConfig": [
            {
                "property": "name",
                "value": ""
            },
            {
                "property": "icon",
                "value": ""
            }
        ],
        "entityidfilter": "sensor.ble_devices_scanner",
        "entityidfiltertype": "exact",
        "outputinitially": false,
        "state_type": "str",
        "haltifstate": "",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "outputs": 1,
        "output_only_on_state_change": true,
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": false,
        "ignoreCurrentStateUnavailable": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 160,
        "y": 2700,
        "wires": [
            [
                "6e5f33bf90c43980",
                "e593b1885b6b2234"
            ]
        ]
    },
    {
        "id": "0e5779ebf176611c",
        "type": "switch",
        "z": "a479b09bca78b004",
        "name": "",
        "property": "payload.name",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "JDY-23",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "HK1RBOX-X4",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "Mi Smart Band 6",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 3,
        "x": 530,
        "y": 2700,
        "wires": [
            [
                "b49c40ca02e61e60"
            ],
            [],
            []
        ]
    },
    {
        "id": "b49c40ca02e61e60",
        "type": "function",
        "z": "a479b09bca78b004",
        "name": "获取当前时间,并保存到 flow 里",
        "func": "//使用data对象的getTime方法获取开始时间,\n//并存到'startTime'里\n//flow.set就是设置全局变量\nflow.set('mc23chufashijian', new Date().getTime());\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 790,
        "y": 2700,
        "wires": [
            []
        ]
    },
    {
        "id": "6e5f33bf90c43980",
        "type": "json",
        "z": "a479b09bca78b004",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 390,
        "y": 2700,
        "wires": [
            [
                "0e5779ebf176611c"
            ]
        ]
    },
    {
        "id": "285681c8cd67c218",
        "type": "ha-binary-sensor",
        "z": "a479b09bca78b004",
        "name": "客厅大门开关状态",
        "entityConfig": "aed3403e58b00ac1",
        "version": 0,
        "state": "payload",
        "stateType": "msg",
        "attributes": [],
        "inputOverride": "allow",
        "outputProperties": [],
        "x": 790,
        "y": 2840,
        "wires": [
            []
        ]
    },
    {
        "id": "e593b1885b6b2234",
        "type": "function",
        "z": "a479b09bca78b004",
        "name": "计算出实际延时时间 = 当前时间-starttime",
        "func": "var currentTime = new Date().getTime();\n//获取当前时间\nvar stratTime = flow.get('mc23chufashijian', stratTime);\n//用flow.get获取之间节点储存的开始时间\n//flow.get,就是获取全局变量\nvar timeElapsed = (currentTime - stratTime) / 1000;\n//计算时间差并从毫秒转换为秒\nvar zhuangtai;\nif (timeElapsed > 20){\n    zhuangtai = 'off';\n}\nif (timeElapsed < 20) {\n    zhuangtai = 'on';\n}\nmsg.payload = zhuangtai;\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 480,
        "y": 2840,
        "wires": [
            [
                "285681c8cd67c218"
            ]
        ]
    },
    {
        "id": "9ba8ac3a.124df",
        "type": "server",
        "name": "hass_kt",
        "addon": false,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true,
        "heartbeat": false,
        "heartbeatInterval": "",
        "statusSeparator": "",
        "enableGlobalContextStore": false
    },
    {
        "id": "aed3403e58b00ac1",
        "type": "ha-entity-config",
        "server": "9ba8ac3a.124df",
        "deviceConfig": "434da9ebbf21b4f6",
        "name": "客厅大门开关状态",
        "version": "6",
        "entityType": "binary_sensor",
        "haConfig": [
            {
                "property": "name",
                "value": "客厅大门开关状态"
            },
            {
                "property": "icon",
                "value": ""
            },
            {
                "property": "entity_category",
                "value": ""
            },
            {
                "property": "device_class",
                "value": "door"
            }
        ],
        "resend": false,
        "debugEnabled": false
    },
    {
        "id": "434da9ebbf21b4f6",
        "type": "ha-device-config",
        "name": "客厅大门开关状态",
        "hwVersion": "",
        "manufacturer": "Node-RED",
        "model": "",
        "swVersion": ""
    }
]

注:买了jdy蓝牙模块后,网上又看到了安信可的pb、tg等蓝牙模块,好像自带mcu的,但是小白更加看不懂,网上的教程基本很少。普通51单片机的教程倒是方便找,只是小白没心思去学啊。如果你和我一样都是小白,不想用单片机的,只需要使用ibeacon模式的,那还有一个简单的办法,一个门磁使用2个jdy-23模块,1个rs2032电池给2个模块供电,使用行程限位开关,这种开关3个针脚,开关公共端针脚接电池电源正极,另外2个针脚分别接2个jdy23的电源正极,这样门无论开和关,只有1个蓝牙模块发送广播信号,用node-red判断,收到哪个信号是门开,收到另一个信号就是门关,这样一个门磁做下来比使用单片机大概贵2-3元。

评分

参与人数 1金钱 +20 HASS币 +10 收起 理由
+ 20 + 10 感谢楼主分享!

查看全部评分

回复

使用道具 举报

3

主题

154

帖子

1768

积分

金牌会员

Rank: 6Rank: 6

积分
1768
金钱
1614
HASS币
10
发表于 2023-5-5 11:06:42 | 显示全部楼层
我是使用ESP8266+433射频模块+锂电池+干簧管    配件费用在25-30左右
回复

使用道具 举报

3

主题

39

帖子

1062

积分

论坛DIY达人

积分
1062
金钱
1023
HASS币
0
发表于 2023-5-5 11:57:22 | 显示全部楼层
我来给你提供2个方案吧,我自己在用的,
1,433M射频:1 stc8单片机,2 射频发射模组(开关量发射或者远T1加EV1527), 3 干簧管或者超低功耗霍尔开关。
2,ESPNOW: 1 stc8单片机,2 esp8266, 3 干簧管或者超低功耗霍尔开关。
stc8g1k08a--1+元可以ch340烧录。
我用的霍尔开关,准确度更高。
前年8月安装的800mA锂电池,一直用到现在没冲过电
stc8单片机的作用就是当一个指挥中心,使用3个引脚,设置2个输入一个输出,且设置为掉电模式,干簧管动作后给stc8一个电平信号,stc8唤醒后控制pmos让下位上点,发射信号。当下级任务完成则返回给stc8一个电平信号表示完成,stc8进入掉电模式整体待机功耗5uA--10uA附近。我在用第二个ESPNOW模式,其实这个门磁的核心就是STC8.你若不会写代码可以交给ChatGPT。或者我私下给你代码。之所以不直接发出来  是因为某人删我帖!
回复

使用道具 举报

0

主题

6

帖子

78

积分

注册会员

Rank: 2

积分
78
金钱
72
HASS币
0
发表于 2023-5-5 12:36:33 | 显示全部楼层
henry2022 发表于 2023-5-5 11:57
我来给你提供2个方案吧,我自己在用的,
1,433M射频:1 stc8单片机,2 射频发射模组(开关量发射或者远T1 ...

espnow网关有现成的代码吗?还是自己写?
回复

使用道具 举报

33

主题

312

帖子

1855

积分

金牌会员

Rank: 6Rank: 6

积分
1855
金钱
1538
HASS币
40
 楼主| 发表于 2023-5-5 14:42:11 | 显示全部楼层
本帖最后由 lione95678 于 2023-5-5 14:53 编辑
henry2022 发表于 2023-5-5 11:57
我来给你提供2个方案吧,我自己在用的,
1,433M射频:1 stc8单片机,2 射频发射模组(开关量发射或者远T1 ...

刚知道espnow,请问门磁刷了espnow后,接收端也刷espnow吗?接收端如果刷成espnow后怎么和node-red或者homeassiatant之间传输信息?关于stc8g1k08a的代码,已私信联系你,多谢了
回复

使用道具 举报

26

主题

170

帖子

1026

积分

论坛技术达人

积分
1026
金钱
856
HASS币
20
发表于 2023-5-9 08:33:24 | 显示全部楼层
需要这么麻烦吗?一个ESP32全搞定 QQ截图20230509083235.png
QQ截图20230509083247.png

回复

使用道具 举报

0

主题

219

帖子

2567

积分

金牌会员

Rank: 6Rank: 6

积分
2567
金钱
2348
HASS币
0
发表于 2023-5-10 16:56:35 | 显示全部楼层
楼主还自称“小白”,真TM谦虚,那我等岂不是要称为“小小小…………(其中省略若干“小”)小白“
回复

使用道具 举报

0

主题

28

帖子

721

积分

高级会员

Rank: 4

积分
721
金钱
693
HASS币
0
发表于 2023-5-10 23:27:25 | 显示全部楼层
loog 发表于 2023-5-9 08:33
需要这么麻烦吗?一个ESP32全搞定

这是什么,大佬
回复

使用道具 举报

0

主题

50

帖子

159

积分

注册会员

Rank: 2

积分
159
金钱
109
HASS币
0
发表于 2023-5-11 00:41:41 | 显示全部楼层
高手,这是高手!
回复

使用道具 举报

25

主题

640

帖子

2913

积分

金牌会员

Rank: 6Rank: 6

积分
2913
金钱
2263
HASS币
40
发表于 2023-5-19 15:35:53 | 显示全部楼层
主要是成本吧?如果超过20还不如直接买成品
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-27 15:33 , Processed in 0.517691 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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