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

 找回密码
 立即注册
查看: 107388|回复: 139

[经验分享] 【DIY】廉价人体存在解决方案,区域人数统计

  [复制链接]

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2019-1-22 17:50:13 | 显示全部楼层 |阅读模式
本帖最后由 neroxps 于 2019-1-23 10:55 编辑

感谢群里 Huex 大神提供传感器信息,感谢群内各位电子电路大佬帮助。

snipaste20190122_174847.jpg


ezgif-5-cae53469f255.gif


视频展示

VL53L0X



红外对管



流程原理

目前设定一个门,两个传感器,分别叫 A、B 传感器。安装在门的两侧,这个需要装修加持,经我测试,两个传感器之间的间距尽量大于等于10CM,在这距离上会得到比较满意的效果。(这个距离或许后期可以修改固件代码,以固件中的时间为准来判断先后,我只是个新手·····强撸 Arduino····已经灰飞烟灭中·····)

前置需求

  • Node-RED 安装 start-up-trigger 作用是 nodered 启动时候可以运行一次  sensor_list 的设置
  • 建议修改 Node-RED 的 setting.js 文件中 contextStorage 的选项,将其修改为本地存储,防止重启后丢失人数。
    contextStorage: {
        default: {
            module: "localfilesystem"
        }
    }

适用范围

本流程支持所有二元传感器,安装于区域边界处,人经过两个传感器产生时间差,利用时间差来判断人行动的方向,从而达到计数的目的。

距离传感器可以通过设定阀值(threshold)来区分二元状态。距离低于阀值是ON,距离高于阀值是OFF。

我尝试过的传感器有

AM312

  • 优点:范围广,容易触发
  • 缺点:因封锁时间3秒,人进入区域后至少3秒才能亮灯所以放弃使用,不能无视宠物

红外对管

IMG_8621.JPG

  • 优点:准确性很高,速度很快。
  • 缺点:安装麻烦,必须门框开洞,对安装高度也有要求。

VL53L0X

IMG_8866.JPG

  • 优点:仅需安装在顶部,传感器体积小,功耗低,最快检测速度极快20ms每次,如果侧装间距可以最少3CM间距。可以无视宠物。
  • 缺点:检测范围比较小,只能在传感器正面的地方才能检测)

情况模拟

人从 A 区域走向 B区域,A B 传感器的触发顺序应该是这样的。

# 第一种可能:
Sensor A:---ON---OFF---
Sensor B:------ON---OFF---

# 第二种可能:
Sensor A:---ON---OFF------------
Sensor B:------------ON---OFF---

人从 A 区域走向 B 区域,再折返,最后走回 A 区域离开,A B 传感器的触发顺序应该是这样的。

# 第一种可能:
Sensor A:---ON-----------OFF---
Sensor B:------ON---OFF--------

# 第二种可能:
Sensor A:---ON-------OFF----ON-----OFF----
Sensor B:------------ON---OFF-------------
  1. A传感器先 ON,触发流程,流程《02-保留传感器时间》,根据发送过来的 mqtt topic 来确定传感器名称,传感器方向(是外面的传感器,还是里面的传感器),同时也将当前发送过来的传感器 payload和触发时间存到全局 Flow 上下文中,方便后方循环流程调用。
  2. 来到《03-流程控制》,将 Flow 全局上下文中的 sensor.[传感器名字].flow_states.states 设置为 true 声明整个识别流程开始,当流程触发之后,同一组的传感器变化不会再向下触发,除非这组传感器的状态是 false
  3. 来到《04-人数确定流程》,这个流程是一个循环流程,一直循环检查 flow 全局上下文中的传感器状态分为三个状态。
    1. Wait ON 状态:该状态是指触发者ON之后,等待另外一个传感器也为ON,因为当两个传感器都ON之后,才算人越过区域边界,如果在wait ON 状态下 wait_on_timeout(4秒) 后,还没等来另外一个传感器 ON,那么代表可能传感器误触,或者是人在门口路过。
    2. Wait OFF 状态:该状态是指两个传感器都曾经ON过,注意是曾经,而不是同时ON,因为有可能两个传感器安装的距离相对远,触发的传感器OFF后,另一个传感器还没来得及ON,我叫这个叫 ALL ON 状态,确保 ALL ON 状态存在,才能判断人的方向。而 Wait OFF状态 就是为了防止人一直站在门口,只有在传感器都OFF的情况下(ALL OFF 状态),才进行方向判断。
  4. 当满足 ALL ON 状态ALL OFF 状态 之后,再根据最后一次的 OFF 时间来判断,谁最晚OFF,代表人从哪个方向离开。

使用方法

1. Mqtt Topic 格式规范

这里规定所有的mqtt格式必须为:类别/传感器名字最好用地理表示/传感器方向

例如:

类别 传感器名称 传感器方向
VL53L0X sufang_vl53l0x sensor2
VL53L0X sufang_vl53l0x sensor1

2. 全局变量 sensor_list 编写说明

传感器名字必须为mqtt的第二个横杠名字一样,例如 VL53LX/dating_vl53l0x/sensor1

  • sensor_name: 传感器名称
    • in: 进入区域对象
    • direction_sensor: 进入方向传感器(例如:"POWER1")
    • ppl_name: 进入区域后增加人数的计数器变量名(例如:"dating_zone_ppl_num")
    • out: 离开区域对象
    • direction_sensor: 出口方向传感器(例如:"POWER2")
    • ppl_name: 进入区域后减少人数的计数器变量名(例如:"fanting_zone_ppl_num")
    • threshold:阀值 (参考配置:2000),此选项根据自己的安装高度决定大小,距离低于阀值是ON,距离高于阀值是OFF。
const sensor_list = {
    // 传感器名字必须为mqtt的第二个横杠名字一样,例如 VL53LX/dating_duishe/POWER1
    "dating_duishe":{
        "in":{
            "direction_sensor":"POWER1",
            "ppl_name":"dating_zone_ppl_num"
        },
        "out":{
            "direction_sensor":"POWER2",
            "ppl_name":"fanting_zone_ppl_num"
        }
    },
    "dating_vl53l0x":{
        "in":{
            "direction_sensor":"sensor2",
            "ppl_name":"dating_zone_ppl_num"
        },
        "out":{
            "direction_sensor":"sensor1",
            "ppl_name":"fanting_zone_ppl_num"
        },
        "threshold":2000 // 设置区分 ON 还是 OFF 的阀值,VL53L0X特有
    },
    "sufang_vl53l0x":{
        "in":{
            "direction_sensor":"sensor2",
            "ppl_name":"book_zone_ppl_num"
        },
        "out":{
            "direction_sensor":"sensor1",
            "ppl_name":"fanting_zone_ppl_num"
        },
        "threshold":2000    // 设置区分 ON 还是 OFF 的阀值,VL53L0X特有
    }
}

3. 其他参数设置

日志参数(log_setting)

  • level:
    • debug:输出所有日志。
    • info:输出系统运行信息如当前人数,none:不输出日志。
  • log_dir:设置日志在nodered中的输出路径,如果是hassio,请设置 /config 作为路径开头以方便持久化
  • log_file_out_pin: 设置 file_out 节点在本节点的哪一个输出口
const log_setting = {
    "level":"debug",
    "log_dir":"/config/rensu_log/",
    "log_file_out_pin":2
}

子流程《人数变更》

说明

每0.2秒检查一次 Global context 的 number 对象,当对象发生变化时向 outpu 发送变化的计数器对象。

参数说明

  • topic: 计数器名字
  • last_number: 之前的值
  • payload: 当前值

VL53L0X 接线图

接线图.png
固件代码内XSHUT端口请按照自己 8266 连接修改GPIO。默认是 GPIO 2 和 GPIO 16

Home-Assistant 配置文件

input_number:
  book_zone_ppl_num:
    name: 'book_zone_ppl_num'
    initial: 0
    min: 0
    max: 10
    step: 1
  fanting_zone_ppl_num:
    name: 'fanting_zone_ppl_num'
    initial: 0
    min: 0
    max: 10
    step: 1
  dating_zone_ppl_num:
    name: 'dating_zone_ppl_num'
    initial: 0
    min: 0
    max: 10
    step: 1

homeassistant:
  customize:
    input_number.fanting_zone_ppl_num:
      friendly_name: '饭厅人数'
      homebridge_hidden: false
      icon: mdi:run
    input_number.book_zone_ppl_num:
      friendly_name: '书房人数'
      homebridge_hidden: false
      icon: mdi:run
    input_number.dating_zone_ppl_num:
      friendly_name: '大厅人数'
      homebridge_hidden: false
      icon: mdi:run

group:
  zone_ppl_num:
    view: yes
    name: '人数检测'
    entities:
      - input_number.book_zone_ppl_num
      - input_number.fanting_zone_ppl_num
      - input_number.dating_zone_ppl_num
      - light.book_room_008ca801
      - light.chufang
      - light.dt_light_008c3a69_ch1
      - light.dt_light_008c3a69_ch2
      - light.dt_light_008c3a69_ch3

Changelog

[0.0.2] - 2019年1月23日

Fixed

  • 修复人数变更子流程只输出一个变更对象的bug
  • 修复应用例子中,无function版本的书房灯节点的对象构建路径错误问题

[0.0.1] - 2019年1月22日

Added

  • 初始版本


人数监测-v0.0.2.zip (445.21 KB, 下载次数: 212)




评分

参与人数 11金钱 +136 HASS币 +20 收起 理由
flame2104 + 5 如果装在顶上,有测过两个传感器的最小距离.
dizherui + 1 关门的动作会不会误判?
bilubin + 10 在下对你的景仰犹如滔滔长江之水,连绵不绝.
咸味土豆 + 10 还能再骚一点不。。。
eric + 10 感谢楼主分享!
windgo + 10 大神666!
huex + 10 大神666!
antsunzj + 20 厉害了word楼主!吊炸天
+ 20 + 20 终于实现了我多年以来的构想~
charley + 20 大神666!
FrankLv + 20 大神666!

查看全部评分

Nero
回复

使用道具 举报

3

主题

286

帖子

2603

积分

版主

懵懂的小白

Rank: 7Rank: 7Rank: 7

积分
2603
金钱
2317
HASS币
0
发表于 2019-1-22 17:59:01 | 显示全部楼层
小白来学习
回复

使用道具 举报

11

主题

359

帖子

2408

积分

金牌会员

Rank: 6Rank: 6

积分
2408
金钱
2049
HASS币
0
发表于 2019-1-22 18:19:56 | 显示全部楼层
厉害。。。。。
回复

使用道具 举报

0

主题

129

帖子

911

积分

高级会员

Rank: 4

积分
911
金钱
782
HASS币
0
发表于 2019-1-22 18:28:58 | 显示全部楼层
非常厉害,感谢分享。
回复

使用道具 举报

26

主题

2096

帖子

8508

积分

论坛元老

Rank: 8Rank: 8

积分
8508
金钱
6407
HASS币
30

论坛元老

发表于 2019-1-22 18:47:33 | 显示全部楼层
好东西,顶一下
回复

使用道具 举报

74

主题

1942

帖子

7885

积分

元老级技术达人

积分
7885
金钱
5893
HASS币
430

活跃会员教程狂人

发表于 2019-1-22 18:59:35 | 显示全部楼层
厉害,学不来。。
所有过往,皆为序章。
回复

使用道具 举报

8

主题

863

帖子

5124

积分

论坛元老

Rank: 8Rank: 8

积分
5124
金钱
4261
HASS币
0
发表于 2019-1-22 19:41:01 | 显示全部楼层
大神6666666
回复

使用道具 举报

8

主题

149

帖子

2694

积分

金牌会员

Rank: 6Rank: 6

积分
2694
金钱
2540
HASS币
30
发表于 2019-1-22 22:55:56 | 显示全部楼层
大神厉害666
回复

使用道具 举报

7

主题

1975

帖子

5663

积分

论坛元老

流水无味

Rank: 8Rank: 8

积分
5663
金钱
3688
HASS币
145

灌水之王

发表于 2019-1-23 08:38:59 | 显示全部楼层
这复杂程度可以干翻99%看此帖的人!!     学习学习下
回复

使用道具 举报

12

主题

545

帖子

2035

积分

金牌会员

Rank: 6Rank: 6

积分
2035
金钱
1490
HASS币
0
发表于 2019-1-23 08:59:47 | 显示全部楼层
大神,请收下我的膝盖。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-26 08:55 , Processed in 0.181615 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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