Reading view

There are new articles available, click to refresh the page.

打造可识别静态人体的人体传感器——使用效果


以下方法经本人验证通过,环境如下:

群晖 DS918+ DSM 6.2.4

mosquitto version 2.0.11

Home Assistant 0.91.4


前言:大部分人入门智能家居之处,最早接触的就是人体传感器,实现简单的如人来开灯,人走关灯的需求。我也不例外,家里各个房间布满了小米或绿米的人体传感器。

但市面上这类传感器因工作原理的原因,实际根本无法识别静态的人体。所以这类传感器只能叫人体移动传感器,算不上是真正意义上的人体存在传感器,导致在很多场景下具有天然的缺陷。

举例说明:人坐在书房看书,保持一段时间禁止后,就会被识别为无人状态,然后灯就关了!同理厕所蹲的时候也会有这种尴尬,人工智能变智障。

网上各种解决方案也有,但都治标不治本,不是我想要的完美方案。因此,我决定自己创造一个!

在之前的文章中,我描述了自己是如何构思设计,选择硬件并编码实现的,这篇文件简要介绍下实际是如何使用的

先上效果

第一步:连接本地网络和MQTT服务

首先,最终的人体传感器如下图所示,是一个小方盒子,尺寸是45mm * 47mm * 36mm 。盒子的正面(传感器一方)有状态指示灯的位置,我做了个小小的LOGO。一边的侧面是电源接口及重置按钮。

接入电源后,系统启动,首次使用时候,系统会自动生成一个WIFI热点,名称以FEEUS_开头,无密码。使用手机连接该WIFI后会打开设置页面。如果没有自动打开设置页面,也可以通过手机的浏览器,在地址栏输入 192.168.4.1 打开。打开后页面如下图所示

点击“网络设置”进入设置页面,如下图所示

页面上方会列出当前范围内可连接的WIFI,如果没有出现你需要连接的WIFI,可将人体传感器靠近家中的路由器后点击“刷新WIFI列表”即可

然后点选要连接的WIFI名称,该名称会自动填写到WIFI SSID处,输入该WIFI的密码

在下方的MQTT设置中,输入你的MQTT服务端地址,端口。如果你和我一样是支持匿名登陆的,用户名密码置空即可,否则,输入有效的用户名和密码。

最后,自定义设置你的主题,最好能标识该设备的位置,例如“study”或者“toilet”之类的。

设置完成后,点击保存按钮。系统会提示保存成功并重启。重启后系统会自动连接你设置的WIFI和MQTT服务。

如果因设置错误连接失败,或者你更改了网络环境需要重新配置,设备会闪灯提示网络连接异常。此时可长按(5秒)重置按钮,系统会清除原有设置,重新生成WIFI热点,再次连接后按上述方法重设即可。

第二步:如何配置HomeAssistant(可选)

在HomeAssistant配置文件中按如下配置即可

binary_sensor:
  - platform: mqtt
    name: "human_sensor_study"
    state_topic: "study"
    payload_on: "1"
    payload_off: "0"
  • name : 自定义一个名称
  • state_topic :这个要填写你在第一步中配置的“主题”

保存配置后重启服务,即可看到该二元传感器及状态

第三步:如何配置Node-Red(可选)

拖入一个mqtt输入节点,双击后可添加新的mqtt-broker节点

在编辑页面输入节点的名称,服务端地址,端口,如果不支持匿名登陆,则在安全选项卡中填入用户名密码

保存后选择刚刚添加的mqtt服务,填入主题,这个主题就是你在第一步配置的“主题”,例如“study”

保存后,即可看到连接状态,如果需要展示接收到的信息,添加一个debug输出即可。

第四步:Node-Red中常用的联动设置(可选)

这里我以最常用的控制灯光为例写了一个流,供参考

思路为:当收到传感器信息后,判断是有人还是无人,如果有人,开灯,同时将一个变量设置为有人;当收到传感器信息为无人时,先将变量改为无人,然后等待48秒(人离开时候,传感器确认无人约需1分12秒。设置为48秒的意思就是人离开2分钟后自动关灯),48秒后如果变量还是无人,那么就关灯。如果在等待过程中有人进入,那就触发了上一个流程,变量变为了有人,自然就不会关灯了。

  • 至此,我整个DIY人体存在传感器的过程就结束了,该小设备我放在书桌前已经稳定运行了3个月,从此再也不会出现静止看书的时候关灯的情况了
  • 如果你也有兴趣DIY一个,可参考我的文章,如果你不想自己花时间或设备不足,也可以直接使用我制作的成品,地址是:淘宝链接 感谢你的支持!

如果您喜欢这篇文章,或者它给您带来了帮助,您可以请我们喝一杯咖啡,我们将非常感谢您的支持!

打造可识别静态人体的人体传感器——硬件部分

前言:大部分人入门智能家居之处,最早接触的就是人体传感器,实现简单的如人来开灯,人走关灯的需求。我也不例外,家里各个房间布满了小米或绿米的人体传感器。

但市面上这类传感器因工作原理的原因,实际根本无法识别静态的人体。所以这类传感器只能叫人体移动传感器,算不上是真正意义上的人体存在传感器,导致在很多场景下具有天然的缺陷。

举例说明:人坐在书房看书,保持一段时间禁止后,就会被识别为无人状态,然后灯就关了!同理厕所蹲的时候也会有这种尴尬,人工智能变智障。

网上各种解决方案也有,但都治标不治本,不是我想要的完美方案。因此,我决定自己创造一个!

第一步: 硬件准备

在上一篇文章打造可识别静态人体的人体传感器——方案设计中,对所需硬件进行了分析,最终结合软件需求,选择了如下硬件模块:

  • 主传感器使用一块存在感应的微波雷达模块
  • MCU选择了满足需求下尺寸较小的ESP-01S
  • 供电模块使用 MICRO USB母座 转DIP2.54mm直插模块
  • 重置按钮选用一个6*6*5mm的微动开关

先来个合影:

从左到右:微波雷达模块,ESP,微动开关,MICRO USB模块

第二步:可行性测试验证

这一步主要是对微波雷达模块进行测试,依据厂家提供的产品规格说明书,我使用CP2012USB转串口模块连接电脑后进行了调试,确保该模块可达到对动态及静态人体的识别和通讯。由于不同的模块规格和协议不同,此处就不单独展开说明了。

此外,对ESP-01S、供电方案也进行了测试,确保该方案可行。

第三步:外壳设计建模

外壳上,按方案使用3D建模软件做成了小方盒的样式,对所有硬件进行简单建模后,进行摆放设置,由于自己使用的是一台入门的FDM 3D打印机,精度一般般,前前后后做了十几个版本,最终形成了一个基本达到要求的模型。

人体存在传感器外壳设计
人体存在传感器外壳设计
人体存在传感器外壳打印

第五部:愉快的手工环节

由于所有模块都是单独购买来DIY,所以免不了手工环节。作为一个老小孩,这个环节是我最喜欢的,万用表、焊台、热熔胶枪齐上阵

焊接模块

最终成品效果如下,虽然3D打印的效果无法达到完美,和工业生产确实有一定差距,但总体来说还是令我满意的:

完成效果
  • 下一篇就是磨人的编码和调试环节,感谢持续关注!

如果您喜欢这篇文章,或者它给您带来了帮助,您可以请我们喝一杯咖啡,我们将非常感谢您的支持!

打造可识别静态人体的人体传感器——方案设计

前言:大部分人入门智能家居之处,最早接触的就是人体传感器,实现简单的如人来开灯,人走关灯的需求。我也不例外,家里各个房间布满了小米或绿米的人体传感器。

但市面上这类传感器因工作原理的原因,实际根本无法识别静态的人体。所以这类传感器只能叫人体移动传感器,算不上是真正意义上的人体存在传感器,导致在很多场景下具有天然的缺陷。

举例说明:人坐在书房看书,保持一段时间禁止后,就会被识别为无人状态,然后灯就关了!同理厕所蹲的时候也会有这种尴尬,人工智能变智障。

网上各种解决方案也有,但都治标不治本,不是我想要的完美方案。因此,我决定自己创造一个!

一: 人体存在感应技术选型

要做这个存在传感器,最最核心的,自然就是如何判断人体存在(含静止状态),经过研究后,决定选择毫米波雷达传感技术的芯片

二:通讯协议的选择

获取到人体存在的信息后,如何通知家庭的智能中枢,以实现和其他设备的联动呢,蓝牙?还是Zigbee?显然都不如物联网通用的MQTT协议更优,配合WIFI,无论是Homeassistant、Node-red还是其他软件,都可轻松实现接入。

三:供电方案

考虑到芯片耗电量,采用电池供电会导致待机不足。加上传感器一般都是固定位置,没有太强的移动需求,因此最后决定使用电子设备通用的直流5V供电,接口采用比较常见的MICRO USB。这样随便一个常规的充电头加一根充电线即可给设备供电。

四:外壳设计

外壳初步考虑采用方形设计,以便于随处摆放。使用3D建模软件结合硬件设计后,使用3D打印机打印。

五:软件需求

软件方面需求就比较多了,简单梳理下来有如下几点

  • 应该支持支持AP模式,这样初始化的时候,可以通过手机直连设备的wifi,进行配置
  • 可配置的内容应该保存WIFI网络(ssid,密码),MQTT参数(包括服务地址,端口,用户,密码,以及用于发布是否有人状态的主题)应该支持MQTT的匿名登陆
  • 配置完毕后应该可存储在设备内,重启和断电后无须再次配置
  • 配置完毕后,会自动根据配置连接WIFI和MQTT服务
  • 设备启动后,会不断循环的监控人体存在的情况,状态变化时,通过MQTT服务发布消息
  • 如果网络环境发生了变化,应该可以重置之前的配置,并重新启动AP模式供更新配置
  • 如果当前网络无法连接或MQTT服务连接不上,可通过指示灯闪烁的方式进行提醒

整体方案如下:

Feeus人体存在传感器设计思维导图
  • 接下来结合方案选择硬件,进行初步的可行性测试后设计外壳

如果您喜欢这篇文章,或者它给您带来了帮助,您可以请我们喝一杯咖啡,我们将非常感谢您的支持!

Node-Red使用MQTT协议接收及发送消息到ESP32单片机


以下方法经本人验证通过,环境如下:

Node-RED V0.20.5

ESP32-CAM + HC-SR04 + Arduino IDE

mosquitto version 2.0.11

MatrixDB


前言:Node-RED 是构建物联网(IOT, Internet of Things)应用程序的一个强大工具,而MQTT则是当下使用广泛的物联网通信协议之一,为此我使用一块ESP-32单片机作为客户端,连接HC-SR04超声波测距模块做了两个简单的实验。

  • 实验一:获取物体距离数据,使用MQTT协议发送消息,并在Node-Red端进行接收,将数据保存在MatrixDB数据库中
  • 实验二:Node-Red使用MQTT协议发送消息,ESP32收到消息后对LED灯进行控制

实验中我使用了同一块ESP-32,实际应用中他们既可以是相同的物联网设备,当然也可以是不同的。实验目的是抛砖引玉,实际物联网中各类复杂场景都可以此为基础进行实现。

本实验的环境我在开篇已经列出,对于环境的准备,你可根据自己的情况参考下列文章做出调整:

第一步: 连接HC-SR04超声波测距模块

HC-SR04 有4个针脚,分别是Vcc, Trig, Echo, Gnd。Vcc接5V供电,Trig 和 Echo接IO口,Gnd自然就是接地。我将Trig连接到IO12,Echo连接到IO13,连接示意图如下:

第二步: 编写实验所需的程序,并烧录到ESP32

HC-SR04 的测距原理是向 Trig 口发一个10US 以上的高电平, 模块会发送8 个40khz 的方波并自动检测是否有信号返回,如有就通过 Echo 口输出一高电平,高电平持续的时间就是超声波从发射到返回的时间。

因此我们只需要将连接Trig口的 IO12 设置为OUTPUT,发一个持续时间为10US 的高电平,然后获取连接着Echo 口的 IO13 (设置为INPUT)高电平的持续时间,将取得的持续时间 *声速(340M/S)/2 就得到了距离。

实验中的LED为板载,使用的是IO4,将其设置为OUTPUT,通过高低电平即可控制开启和关闭

MQTT我使用的是PubSubClient库,如果你没安装,可通过库管理器进行安装加载

部分程序代码图如下:

引用的库和部分配置
连接wifi和群晖上的mosquittoMQTT服务
使用HC-SR04计算距离

代码编译通过后烧录到ESP32,上传烧录的方法在 win10利用arduino + esp32-cam搭建网络摄像头 文章中有写,不再啰嗦。

第三步: Node-Red 编写实验流程

实验一:拖入mqtt输入节点,双击,添加mqtt broke服务端

添加后选择该服务端,订阅主题。我在单片机上设置的发送的主题是Distance,因此这里也要输入主题为Distance

接着我们使用节点管理器安装node-red-contrib-postgresql,安装后将postgresql节点拖入

配置MatrixDB数据库

接着在Server中选择配置好的数据库,在Query中编写插入语句(我事前已经在数据库中添加了测试表MQTT_Test,包含payload,msg_time两个字段)

最后将两个节点连接起来,部署即可

实验二:这个比较简单,拖入两个inject节点,一个控制开启LED,一个控制关闭LED。开启的节点设置如下,内容为“ON”,这个是ESP32程序中我设置的命令,当接收到主题为LED的消息,且内容为ON时,开启LED。同理关闭设置内容为“OFF”

接着再拖入一个mqtt输出节点,将它与两个inject连接起来,该节点只需要配置好服务端和主题即可。配置如下:

至此流程编写完毕

导出的流程如下:

[{"id":"81d18949.9b6738","type":"mqtt in","z":"b8dd355c.40cd78","name":"","topic":"Distance","qos":"2","datatype":"auto","broker":"fcb81ef4.a2021","x":520,"y":320,"wires":[["14feeb2c.6dfff5"]]},{"id":"23f6b97e.a38776","type":"comment","z":"b8dd355c.40cd78","name":"实验一:接收MQTT消息,将数据写入数据库","info":"","x":630,"y":260,"wires":[]},{"id":"af6c9b1b.dab788","type":"mqtt out","z":"b8dd355c.40cd78","name":"","topic":"LED","qos":"","retain":"","broker":"fcb81ef4.a2021","x":760,"y":540,"wires":[],"inputLabels":["ON"]},{"id":"4718d956.78af68","type":"inject","z":"b8dd355c.40cd78","name":"开灯","topic":"Test 2.1","payload":"ON","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":530,"y":500,"wires":[["af6c9b1b.dab788"]]},{"id":"2fc63b12.cba2d4","type":"inject","z":"b8dd355c.40cd78","name":"关灯","topic":"Test 2.2","payload":"OFF","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":530,"y":580,"wires":[["af6c9b1b.dab788"]]},{"id":"c3cfd91.f709f28","type":"comment","z":"b8dd355c.40cd78","name":"实验二:发送MQTT消息,控制板载LED","info":"","x":610,"y":440,"wires":[]},{"id":"14feeb2c.6dfff5","type":"postgresql","z":"b8dd355c.40cd78","name":"保存收到消息","query":"INSERT INTO \"MQTT_Test\" (payload,msg_time) VALUES ( '{{{msg.payload}}}' ,now());","postgreSQLConfig":"8e100f3e.01c4b","split":false,"rowsPerMsg":"1","outputs":1,"x":789.1667709350586,"y":317.66671657562256,"wires":[[]]},{"id":"fcb81ef4.a2021","type":"mqtt-broker","z":"","name":"feeus","broker":"10.0.0.2","port":"18831","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"8e100f3e.01c4b","type":"postgreSQLConfig","z":"","name":"MatrixDB","host":"10.0.0.214","hostFieldType":"str","port":"5432","portFieldType":"num","database":"feeus","databaseFieldType":"str","ssl":"false","sslFieldType":"bool","max":"10","maxFieldType":"num","min":"1","minFieldType":"num","idle":"1000","idleFieldType":"num","connectionTimeout":"10000","connectionTimeoutFieldType":"num","user":"mxadmin","userFieldType":"str","password":"feeus.com","passwordFieldType":"str"}]

第四步:验证实验结果


如果您喜欢这篇文章,或者它给您带来了帮助,您可以请我们喝一杯咖啡,我们将非常感谢您的支持!

❌