2021爱智先行者—人体存在传感器
【本文正在参与"2021爱智先行者-征文大赛"活动】https://mp.weixin.qq.com/s/I2s99dZpbP0QpMiKFneYJA
上次说了在 智能灯光开关 的我说了在憋大招,那肯定不会只有这点东西,那么今天我们就来继续!之前 智能灯光开关和光照传感器 已经简单的完成了一个小场景的设备搭建,但是这么好玩的点子怎么就只做这么简单的东西呢?那当然不行了啊,得搞事情!搞大事情!
之前的场景仅仅具备检查有没有关灯,并且远程关灯的功能,家里有没有其他人在家,是没办法感知到的,还是不够智能。摄像头又太复杂太贵,于是我准备寻找一个好使的传感器来感知,人的存在。
硬件选择
首先,就是翼辉的 边缘计算机 Spirit 1 边缘计算机,这套环境都是建立在这个玩意的基础上。
还有祖传的安信可 ESP32S 。
人体存在传感器
人体存在传感器方面困扰了我好一阵子,所以准备专门讲一下这个传感器,我尝试了市面上很多人体传感器,常见的大都是CW多普勒体制+类似bis0001芯片 把信号放大进行检测,要么是青蛙眼,只能检测到运动,而且是大幅度运动(具体点:2米距离我甩手没用,得晃动身体。淘宝买到贼贵的那种 );要么是误报率极高,判断难度很高。都没办法简单的满足我的需求,我在打游戏的时候传感器检测不到我,把我灯关了岂不是很尴尬?
不过最后我还是找到了一个好东西:阶跃时进的 HS2BC3A 这是一个毫米波传感器。这玩意可有意思了,采用类似雷达的原理,向检测区域发射 24GHz 的 FMCW 无线电波,并接收区域内 的所有运动、微动、极弱微动的目标反射的无线电波,经传感器系统中的毫米波 MMIC 电路转换为电信号,并由数字信号算法处理单元进行信号处理(呼吸信号 提取算法),解算出目标信息(存在、微动、运动、静止等状态)。
这玩意实际上也是一个青蛙眼,也是通过检测到运动来判断,但是他精度能检测到人呼吸产生的运动,众所周知,人不呼吸就会死,所以这个问题也就不复存在了,而且不只是呼吸,包括人的很多大小动作也能被他准确的捕捉到(呼吸都能捕捉到,别说动动手指什么的了),而且还可以通过串口配置很多参数。我实际用起来效果非常棒。
HS2BC3A 可以说是老少皆宜, 有简单的IO数字量输出满足基本使用需求,还有串口可以进行复杂的配置和详细数据输出,串口详细输出甚至能追踪最多8个目标,报告目标的数量距离与信噪比(与数据可靠性相关)。还可以修改模块探测距离,灵敏度,输出模式,输出延时时间(确定目标延时与目标丢失延时),主动获取数据等功能,需要注意的一点是,串口的配置不影响IO口输出,关闭了串口上的主动上报并不会影响IO口输出。
因为这个模块太过敏感(HS2BC3A 探测范围是100°×100°,近距离探测范围还会更大一些),在测试和调试的时候,建议将灵敏度和探测距离调整到最低,然后将输出延时时间设置为最短,将模块放置到高于头顶的位置,方便调试代码,要不然会一直检测到调试人员的存在,加上默认持续15S检测不到信号才会判断没人,导致我测试的时候一直没办法切换到无人状态,一度让我怀疑,是不是设备坏了 。

实际使用的时候官方默认配置就挺好用(我安装在天花板上,大概2-3米高),一个传感器完全可以覆盖主卧和客厅这些位置。手册上写最远7米,设置最多可以到9米,但是远距离探测角度会变窄。
不过官方手册上说因为是检测人体活动和呼吸,如果环境中有干扰源可以通过减少灵敏度规避,或者通过详细串口获取详细数据:点云目标输出 $JYRPO ,这个信息包含了目标序号,目标距离,目标信噪比等信息其中信噪比和可靠性有关,信噪比越大,代表当前检测到的目标可靠性越高,方便手动对数据进行筛选。

代码解析
获取代码
为了方便讲解逻辑,我会打乱代码的顺序可能还会进行裁剪,要是想直接拿代码跑的朋友可以直接去 灵感桌面的秘密宝库 获取代码,或者直接 clone:
https://gitee.com/inspiration-desktop/DEV-lib-arduino.git
这次受限于篇幅,我就不在赘述代码获取了,代码在 human_body_induction 文件夹里面,如果有不会使用的朋友,可以参考上一篇文档:2021爱智先行者—智能灯光开关-CSDN社区
设备控制命令:
通过 Spirit 1 的应用程序或者调试工具 嗅探器 向传感器设备发送的命令:
{
"method": "get",
"obj": ["rtgy"]
}
设备和协议初始化流程:
基于官方 demo 写的不需要做什么修改,主要是设备初始化,管脚配置,和协议初始化部分。
/*
* 初始化传感器
*/
void sensor_init()
{
// 初始化 GOIP 口为输入模式,接收传感器发送的信息
pinMode(sensor_in,INPUT);
// 创建传感器任务,周期性传感器的数据并发送给 EdgerOS
xTaskCreate(periodic_sensor_task, "periodic_sensor_task", ESP_TASK_STACK_SIZE, NULL, ESP_TASK_PRIO, NULL);
}
void setup() {
byte mac[6];
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println();
// 初始化传感器
sensor_init();
// 清除一下按键状态机的状态
button.reset();
// 创建按键扫描线程,长按 IO0 按键,松开后ESP32 将会进入 SmartConfig 模式
sddc_printf("长按按键进入 Smartconfig...\n");
button.attachLongPressStop(esp_io0_key_task);
xTaskCreate(esp_tick_task, "button_tick", ESP_TASK_STACK_SIZE, NULL, ESP_TASK_PRIO, NULL);
// 启动 WiFi 并且连接网络
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
// 获取并打印 IP 地址
Serial.println("");
Serial.println("WiFi connected");
Serial.print("'ip :");
Serial.print(WiFi.localIP());
Serial.println("' to connect");
// sddc协议初始化
sddc_lib_main(&sys_cfg);
// 获取并打印网卡 mac 地址
WiFi.macAddress(mac);
sddc_printf("MAC addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
mac[5], mac[4], mac[3], mac[2], mac[1], mac[0]);
// 使用网卡 mac 地址设置设备唯一标识 UID
sddc_set_uid(G_sddc, mac);
}
void loop() {
// 运行 SDDC 协议循环
while (1)
{
sddc_printf("SDDC running...\n");
sddc_run(G_sddc);
sddc_printf("SDDC quit!\n");
}
// 销毁 SDDC 协议
sddc_destroy(G_sddc);
}
配置设备信息
这部分代码可以配置 WiFi 名字和 WiFi 密码,要使用的引脚,并且配置设备在 Spirit 1 上显示的信息:
#define SDDC_CFG_PORT 680U // SDDC 协议使用的端口号
#define PIN_INPUT 0 // 选择 IO0 进行控制
#define ESP_TASK_STACK_SIZE 4096
#define ESP_TASK_PRIO 25
static const int sensor_in = 34; // 数据输入引脚
static const char* ssid = "EOS-Tenda"; // WiFi 名
static const char* password = "1234567890"; // WiFi 密码
static int rtgy_state = 1;
static int xTicksToDelay = 1000; // 周期延时时间
OneButton button(PIN_INPUT, true);
/*
* 系统对象状态获取注册
*/
DEV_STATE_GET dev_state_get_reg[] = {
{"rtgy", DEV_IO_TYPE, get_sensor_state},
};
/*
* 当前设备的信息定义
*/
DEV_INFO dev_info = {
.name = "人体感应模块",
.type = "device.rtgy",
.excl = SDDC_FALSE,
.desc = "ESP-32S",
.model = "IDRTGY01B",
.vendor = "inspiration-desktop",
};
/*
* 系统注册对象汇聚
*/
SDDC_CONFIG_INFO sys_cfg = {
.token = "1234567890", // 设备密码
.devinfo = &dev_info,
.io_dev_reg = io_dev,
.io_dev_reg_num = ARRAY_SIZE(io_dev),
.num_dev_reg = num_dev,
.num_dev_reg_num = ARRAY_SIZE(num_dev),
.state_get_reg = dev_state_get_reg,
.state_get_reg_num = ARRAY_SIZE(dev_state_get_reg),
.dis_dev_reg = dis_dev,
.dis_dev_num = ARRAY_SIZE(dis_dev),
};
回调函数注册
这是收到命令后回调函数注册的位置,在这里注册的函数才能被 SDK 正确的调用,执行正确的动作。
具体 SDK 的解析可以参考 同人逼死官方系列!基于sddc 协议的SDK框架 sddc_sdk_lib 解析 和 同人逼死官方系列!从 DDC 嗅探器到 sddc_sdk_lib 的数据解析
/*
* 数字量设备对象函数与处理方法注册
*/
NUM_DEV_REGINFO num_dev[] = {
// {"set_num_demo", demo}, // 字符串为输入命令,demo为命令处理函数
};
/*
* 显示设备对象函数与处理方法注册
*/
DIS_DEV_REGINFO dis_dev[] = {
// {"set_dis_demo", demo}, // 字符串为输入命令,demo为命令处理函数
};
/*
* IO设备对象设置函数与处理方法注册
*/
IO_DEV_REGINFO io_dev[] = {
// {"set_io_demo", demo}, // 字符串为输入命令,demo为命令处理函数
{"SW_ctrl", SW_ctrl},
};
/*
* 系统对象状态获取注册
*/
DEV_STATE_GET dev_state_get_reg[] = {
// {"demo", DEV_NUM_TYPE, num_get_demo}, // demo为输入命令,字符串为命令处理函数
// {"demo", DEV_IO_TYPE, io_get_demo},
// {"demo", DEV_DISPLAY_TYPE, dis_get_demo},
{"rtgy", DEV_IO_TYPE, get_sensor_state},
};
数据获取与上报流程
这里是我们自己编写的处理流程 ,可以根据你的需求自己更改,收到 set 或者 get 后根据前面的注册的函数,进入对应的处理函数。
/*
* 周期上报函数
*/
static void periodic_sensor_task(void *arg)
{
int newval = 0;
int oldval = 0;
int i = 0;
// 监控锁开启和关闭状态
while(1)
{
newval = digitalRead(sensor_in);
if (newval == 0) {
i++;
} else {
i = 0;
rtgy_state = 1;
}
if( i > 15)
{
if (rtgy_state != 0){
rtgy_state = 0;
report_sensor_state();
}
i = 0;
}
// 任务创建之后,设定延时周期
delay(xTicksToDelay);
}
}
/*
* 主动数据上报函数
*/
static void report_sensor_state()
{
int sensorValue = 0;
cJSON *value;
cJSON *root;
char *msg;
value = cJSON_CreateArray();
root = cJSON_CreateObject();
sddc_return_if_fail(value);
sddc_return_if_fail(root);
sddc_return_if_fail(value);
// 获取传感器数据
cJSON_AddItemToArray(value, cJSON_CreateString("rtgy")); // 这里的字符串要和系统对象状态获取注册结构体里的对应
cJSON_AddItemToObject(root, "obj", value);
// 发送数据给 EdgerOS
msg = cJSON_Print(root);
printf("触发上报: %s\n",msg);
object_report(root);
cJSON_Delete(value);
cJSON_free(msg);
}
/*
* 单次获取数据
*/
sddc_bool_t get_sensor_state(char *objvalue, int value_len)
{
if(rtgy_state)
{
strncpy(objvalue, "ON", value_len);
}else
{
strncpy(objvalue, "OFF", value_len);
}
return SDDC_TRUE;
}
总结
这只是最简单的通过读的应用,本来考虑使用串口进行配置与获取详细数据的,但是在具体实现的时候遇到一点BUG,就先用IO凑合一下,之后有时间再把复杂功能完善。
相关推荐
无人机手势控制数据集46176张VOC+YOLO格式.zip
数据集格式:VOC格式+YOLO格式 压缩包内含:3个文件夹,分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计:46176 Annotations文件夹中xml文件总计:46176 labels文件夹中txt文件总计:46176 标签种类数:8 标签名称:["follow","follow_hand","land","land_hand","null","object","takeoff","takeoff-hand"] 每个标签的框数(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准): follow 框数 = 22056 follow_hand 框数 = 4038 land 框数 = 7609 land_hand 框数 = 3300 null 框数 = 2642 object 框数 = 2 takeoff 框数 = 3494 takeoff-hand 框数 = 3645 总框数:46786 图片清晰度(分辨率:像素):清晰 图片是否增强:否 标签形状:矩形框,用于目标检测识别 重要说明:暂无 特别声明:本数据集不对训练的模型或者权重文件精度作任何保证,数据集只提供准确且合理标注
三相光伏发电系统中MPPT和并网控制策略的研究(Simulink仿真实现)
内容概要:本文系统研究了三相光伏发电系统中的最大功率点跟踪(MPPT)与并网控制策略,深入分析光伏阵列在不同光照和温度条件下的输出特性,设计并实现了基于Simulink的完整仿真模型。该模型涵盖光伏阵列、DC-DC变换器、MPPT控制器、逆变器及锁相环等关键模块,重点验证了系统在动态环境变化下实现高效能量转换的能力,并确保并网电流符合电能质量标准。研究对比了多种MPPT算法的动态响应与稳定性表现,优化了并网控制策略以提升整体系统性能,为光伏系统的设计与控制提供了理论依据与仿真支持。; 适合人群:具备电力电子、自动控制或新能源发电基础知识的高校研究生、科研人员及从事光伏系统设计与仿真的工程技术人员。; 使用场景及目标:①用于教学与科研中深入理解光伏发电系统的MPPT原理与并网控制机制;②指导实际工程项目中光伏逆变器控制策略的设计与仿真验证;③为撰写相关学术论文或完成课程设计提供可复现的Simulink模型与理论支持。; 阅读建议:建议读者结合文中提供的Simulink仿真文件,逐步搭建系统模型,调试MPPT与并网控制参数,观察关键波形如光伏电压、电流、功率及并网电流的变化,加深对控制逻辑的理解。同时可尝试改进算法以进一步提升系统动态响应与鲁棒性。
无人驾驶网约车服务:全球市场规模、竞争格局与未来发展趋势.docx
无人驾驶网约车服务:全球市场规模、竞争格局与未来发展趋势
开绕组永磁同步电机模型FOC矢量控制SVPWM仿真Simulink模型
内容概要:本文系统解读了一套完整的多机器人路径规划(MAPF)MATLAB代码库,聚焦于优先级规划算法的工程实现。该框架采用四层架构设计(几何、拓扑、调度与呈现),实现了从地图解析、Petri网建模、基于动态边权膨胀的路径规划,到时间同步冲突消解及动画可视化的全流程。核心创新包括动态边权膨胀机制、节点预留历史查表优化、几何惩罚驱动的局部同步策略以及Petri网双阶段优化方法,有效提升了大规模场景下的求解效率与可行性。文章详细阐述了各模块之间的接口契约与不变量,对比分析了三种时间同步策略的适用场景,并强调了信息前移、模块解耦与可维护性设计的重要性,为MAPF的研究与教学提供了可复现、可批判的参考文本。; 适合人群:具备一定MATLAB编程基础,从事机器人路径规划、智能调度、自动化控制等相关领域的科研人员与研究生。; 使用场景及目标:① 学习并复现多机器人路径规划中的优先级规划算法及其工程实现细节;② 深入理解动态边权膨胀、节点预留历史、局部同步等核心机制的设计原理与性能优化策略;③ 掌握Petri网建模与整数规划在路径调度中的应用,以及多智能体系统冲突消解与可视化的方法。; 阅读建议:此资源以工程化框架形式呈现,不仅关注算法逻辑,更重视模块化设计与系统集成。建议读者按照数据流顺序逐步学习,结合代码调试理解各层交互,并尝试替换不同同步策略以评估其对效率与解质量的影响,从而深入掌握大规模MAPF问题的求解范式。
高校技术转移办公室人员如何高效完成科技成果评价与推介?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。


