项目前言
这段时间自己独立从零画板、写代码、调通整套链路,完成了这款基于 STM32F103C8T6 的多传感器融合环境感知终端。
之前做项目的时候发现,单一传感器的局限性真的太大了:要么只能测距离,要么只能检测人体,误判多、数据单一,也没有方便的移动端看数据。所以我干脆自己整合常用感知模块,做了一块集成度很高的通用感知PCB。板子集成了两款不同定位的毫米波雷达、双路超声波、DHT11温湿度、声音采集拓展,搭配大夏龙雀BT311蓝牙模块,最后自己写了微信小程序上位机,实现所有环境数据实时无线上传、手机可视化查看、远程设备控制。
整套项目从画原理图、PCB布局、硬件焊接调试,到底层驱动、数据融合逻辑、蓝牙通信、小程序对接,全部自己一手落地,非常适合用来做嵌入式实训、智能家居监测、室内简易安防,干货拉满。
硬件配置清单
板子上所有核心配置讲清楚,方便大家参考学习:
-
主控芯片:STM32F103C8T6
-
双毫米波雷达组合:海凌科 LD1040 + LD2402(一静一动互补,解决单雷达检测盲区)
-
测距模块:双路 HC-SR04 超声波
-
环境检测:DHT11 温湿度传感器,实时采集室内温湿度数据
-
声学采集:预留声音传感器排针,可外接麦克风,采集环境音量、突发异响
-
无线通信:大夏龙雀 BT311 蓝牙模块,负责和手机小程序双向透传数据
-
拓展性:板上预留大量闲置IO和外设接口,后期随便加功能、改玩法
布局上我做了模块化分区,电源、主控、雷达、超声、采集、通信全部分区排布,互不干扰,运行稳定性很不错。
硬件功能讲解
1. 电源供电电路

整机采用最通用的Type-C 5V供电,搭配AMS1117-3.3V稳压芯片,把5V转成3.3V给主控、雷达、蓝牙、传感器供电。电源部分我特意加了大小电容组合滤波,有效抑制电源纹波,避免出现传感器数据乱跳、串口乱码、板子偶然死机的问题。同时板载电源指示灯,上电就能看出来供电是否正常,调试排查问题特别方便。
2. STM32最小系统

经典F103最小系统,搭配8M外部晶振、复位电路、BOOT默认接地。支持SWD调试,平时烧程序、在线调参、抓变量都很方便,是整个板子的控制核心,所有数据采集、算法运算、蓝牙通信全靠它调度。
3. 双毫米波雷达
为什么要用两个雷达?因为单雷达真的有短板,我直接用两款互补,直接拉满检测精度:
-
LD2402:主打静态人体存在检测,它厉害的地方是能感知人体呼吸、微弱微动,哪怕人坐着不动、躺着休息也能检测到。而且抗干扰很强,不怕光线变化、不怕窗帘晃动、不怕小宠物乱动,适合大范围室内人体常驻监测。
-
LD1040:主打近距离动态微动检测,响应速度快,人走动、抬手、小幅动作都能精准捕捉,负责近距离区域的动态预警。
两路雷达都做了电平转换,完美适配3.3V主控,独立串口通信互不冲突。我在程序里做了简单的融合逻辑:远距离用LD2402预判有人,近距离用LD1040确认动态,双重校验,极大降低误判概率。
4. 双路HC-SR04超声波测距

板子引出了两路独立超声波接口,可以同时测两个方向的距离。主要作用是校准监测区域、识别障碍物。配合雷达使用,能过滤掉远距离无效信号、窗外晃动杂物等干扰,精准锁定有效监测范围,让整套设备的检测逻辑更严谨。
5. DHT11温湿度采集
经典的单总线温湿度传感器,使用简单、稳定够用。设备可以实时采集室内温度、湿度,不仅能单纯看环境数据,我还预留了阈值判断逻辑,后期可以根据温湿度自动调整设备灵敏度,适配不同季节的使用场景。
6. 环境声音采集拓展

板上预留了声音传感器的专用排针和信号调理电路,插上麦克风模块就能采集环境音量、捕捉突发异响。后续可以搭配雷达做双重判断:只有检测到有人+出现异常响动时,才判定为异常情况,安防预警的准确率会高很多。
7. BT311蓝牙通信

选用大夏龙雀BT311蓝牙串口模块,稳定性和性价比都很不错。全程串口透传,主要实现双向通信:
-
上行:把温湿度、双路测距、双雷达状态、环境音量等所有数据,实时打包上传手机;
-
下行:手机可以直接发指令,修改设备灵敏度、触发阈值、切换工作模式,不用插线调试,非常方便。
💻 核心源码解析(均已实际验证)
一、全局宏定义 + 硬件引脚配置
所有传感器、蓝牙、LED 的引脚统一宏定义,修改硬件直接改这里,模块化极强:
#include "stm32f10x.h"
#include <string.h>
#include <stdio.h>
#include "delay.h"
#include "dht11.h"
/* 硬件引脚定义 */
// 左超声波模块
#define LEFT_TRIG_PIN GPIO_Pin_0 // Trig -> PB0
#define LEFT_TRIG_PORT GPIOB
#define LEFT_ECHO_PIN GPIO_Pin_6 // Echo -> PA6 (TIM3_CH1)
#define LEFT_ECHO_PORT GPIOA
#define LEFT_EN_PIN GPIO_Pin_5 // 使能 -> PA5
#define LEFT_EN_PORT GPIOA
// 右超声波模块
#define RIGHT_TRIG_PIN GPIO_Pin_1 // Trig -> PB1
#define RIGHT_TRIG_PORT GPIOB
#define RIGHT_ECHO_PIN GPIO_Pin_7 // Echo -> PA7 (TIM3_CH2)
#define RIGHT_ECHO_PORT GPIOA
#define RIGHT_EN_PIN GPIO_Pin_4 // 使能 -> PA4
#define RIGHT_EN_PORT GPIOA
// 雷达使能引脚
#define RADAR1_EN_PIN GPIO_Pin_8 // 1号雷达使能 -> PB8
#define RADAR1_EN_PORT GPIOB
#define RADAR2_EN_PIN GPIO_Pin_1 // 2号雷达使能 -> PA1
#define RADAR2_EN_PORT GPIOA
// 目标检测输入引脚(下拉输入)
#define TARGET1_DET_PIN GPIO_Pin_5 // 目标检测1 -> PB5
#define TARGET1_DET_PORT GPIOB
#define TARGET2_DET_PIN GPIO_Pin_7 // 目标检测2 -> PB7
#define TARGET2_DET_PORT GPIOB
// 激光使能引脚
#define LASER_EN_PIN GPIO_Pin_0 // 激光使能 -> PA0
#define LASER_EN_PORT GPIOA
// LED引脚定义(PB13/PB14,高电平点亮)
#define LED1_PIN GPIO_Pin_13 // PB5触发的LED -> PB13
#define LED1_PORT GPIOB
#define LED2_PIN GPIO_Pin_14 // PB7触发的LED -> PB14
#define LED2_PORT GPIOB
/* 控制指令定义 */
#define CMD_LEFT_EN 0xA1
#define CMD_LEFT_DIS 0xA2
#define CMD_RIGHT_EN 0xB1
#define CMD_RIGHT_DIS 0xB2
#define CMD_RADAR1_EN 0xD1
#define CMD_RADAR1_DIS 0xD2
#define CMD_RADAR2_EN 0xD3
#define CMD_RADAR2_DIS 0xD4
#define CMD_LASER_EN 0xC1
#define CMD_LASER_DIS 0xC2
二、外设初始化代码(GPIO + 双串口 + 定时器)
初始化双串口(USART1 调试 / USART2 接蓝牙 BT311)、GPIO、定时器,是整个程序的基础:
/* 全局变量 */
uint8_t LeftSensorEn = 1;
uint8_t RightSensorEn = 1;
float LeftDistance = 0.0;
float RightDistance = 0.0;
uint8_t Radar1En=0,Radar2En=0,LaserEn=0;
uint8_t DHT11_Temp=0,DHT11_Humi=0;
// GPIO初始化
void GPIO_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
// 超声波/雷达/LED/激光 引脚初始化(完整代码见前文)
}
// 定时器3初始化(超声波计时专用)
void TIM3_Config(void) {
TIM_TimeBaseInitTypeDef TIM_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_InitStructure.TIM_Period = 0xFFFF;
TIM_InitStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseInit(TIM3, &TIM_InitStructure);
TIM_Cmd(TIM3, DISABLE);
}
// 串口1初始化(调试输出)
void USART1_Config(void);
// 串口2初始化(BT311蓝牙通信)
void USART2_Config(void);
三、核心驱动:双超声波滤波测距
为了避免数据抖动,我写了多次测量滤波算法,测距更稳定:
// 单次测距 + 滤波测距函数
float LeftUltrasonic_GetSingleDistance(void);
float RightUltrasonic_GetSingleDistance(void);
// 滤波测距(核心:3次测量取平均值)
float LeftUltrasonic_GetFilteredDistance(void){
float distances[3];
float sum = 0.0;
int valid_count = 0;
for(int i=0;i<3;i++){
distances[i] = LeftUltrasonic_GetSingleDistance();
if(distances[i] != -1){
sum += distances[i];
valid_count++;
}
delay_ms(60);
}
return valid_count>1 ? sum/valid_count : -1.0f;
}
// 右侧超声波滤波逻辑同上
四、蓝牙指令控制逻辑
手机微信小程序通过蓝牙发送指令,远程控制雷达、超声波、激光开关:
// 串口指令处理(小程序/蓝牙下发指令控制设备)
void USART_ProcessCmd(uint8_t cmd) {
switch(cmd) {
case CMD_RADAR1_EN: Radar1En=1; GPIO_SetBits(GPIOB,GPIO_Pin_8); break;
case CMD_RADAR1_DIS: Radar1En=0; GPIO_ResetBits(GPIOB,GPIO_Pin_8); break;
case CMD_RADAR2_EN: Radar2En=1; GPIO_SetBits(GPIOA,GPIO_Pin_1); break;
case CMD_RADAR2_DIS: Radar2En=0; GPIO_ResetBits(GPIOA,GPIO_Pin_1); break;
case CMD_LASER_EN: LaserEn=1; GPIO_SetBits(GPIOA,GPIO_Pin_0); break;
case CMD_LASER_DIS: LaserEn=0; GPIO_ResetBits(GPIOA,GPIO_Pin_0); break;
// 超声波开关控制逻辑同上
}
}
// 双串口中断:蓝牙数据转发到调试串口
void USART2_IRQHandler(void){
uint8_t data = USART_ReceiveData(USART2);
USART_SendData(USART1,data);
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}
五、主函数逻辑(多传感器融合)
主循环实现测距 + 雷达检测 + 温湿度上报 + LED 联动,所有功能一站式运行:
int main(void) {
SystemInit();
delay_init(72);
GPIO_Config();
TIM3_Config();
USART1_Config();
USART2_Config(); // 蓝牙串口初始化
DHT11_Init(); // 温湿度初始化
while(1) {
// 1. 双超声波测距
LeftDistance = LeftUltrasonic_GetFilteredDistance();
RightDistance = RightUltrasonic_GetFilteredDistance();
// 2. 雷达目标检测 + LED闪烁
TargetDetect_CheckAndSend();
// 3. DHT11 10秒上报一次温湿度
if(DHT11_Timer >= 3000){
DHT11_ReadAndSendData();
DHT11_Timer=0;
}
// 4. 数据通过蓝牙上传微信小程序
delay_ms(200);
}
}
项目核心功能
1. 双雷达融合,全天候低误判人体检测
摒弃传统红外、单雷达的短板,动静结合检测。不管是人静止久坐,还是来回走动,都能稳定识别,不受光照、温度、杂物干扰,适合室内24小时值守监测。
2. 多维度环境数据一站式采集
一块板子搞定:温度、湿度、双向距离、人体静态存在、人体动态微动、环境音量六项数据采集,算是一个小型全能的室内环境感知终端,日常做数据监测、记录、统计完全够用。
3. 人体+异响双鉴安防预警逻辑
我在程序里写了双重校验逻辑:单纯有人走动、或者单纯环境噪音,不会触发预警。只有同时检测到人体闯入+突发异响,才判定为异常。后续外接蜂鸣器、继电器就能做成简易安防报警器,相比普通单传感器报警,误报率低太多了。
4. 自研微信小程序实时数据可视化
这是我这个项目最实用的亮点。专门配套写了微信小程序上位机,手机不用装第三方调试APP,打开微信就能用。
所有传感器数据、设备工作状态都会实时刷新显示,数据直观清晰,支持长期查看环境变化。同时支持远程下发控制指令,随时随地调整设备参数,轻量化、零成本、超级方便。
5. 超高二次开发自由度
板子冗余接口很多,可玩性极强。可以随便拓展继电器、蜂鸣器、存储模块、其他传感器,后续可以改成智能灯光控制、环境数据记录仪、家用安防终端,迭代空间很大。
设计思路与小细节
作为自己一手画的板,分享几个我刻意优化的点:
1. 电源优先走线:电源线路加粗,稳压芯片就近放置滤波电容,最大程度减少压降和干扰,保证整机供电稳定;
2. 模数分区布局:把声音采集这类模拟弱信号电路,和蓝牙、晶振这类数字高频电路分开摆放,避免信号串扰,提升采集精度;
3. 模块化规整布局:所有功能区域划分清晰,排针全部放在板边,接线、调试、检修都很方便;
4. 高性价比设计:采用单面板,打样成本低,没有多余冗余电路,每一部分电路都是实打实的功能落地,非常适合学生学习复刻。
实际应用场景
1. 居家智能环境监测:放在家里、宿舍,实时监测温湿度、人体活动状态,微信随时查看环境数据;
2. 轻量化室内安防:依靠双雷达+异响双重校验,实现低误报的室内闯入预警;
3. 嵌入式全套实训项目:覆盖PCB绘制、传感器驱动、数据融合、蓝牙通信、小程序开发,一套吃透软硬结合开发流程;
4. 小型物联网采集终端:可长期采集室内环境数据,满足个人学习、小型场景数据监测需求。
扩展方向
1. 硬件层面:后续可以加上TP4056充电电路,搭配电池实现脱机便携使用;预留WiFi模块位置,可升级为远程物联网上传,摆脱蓝牙近距离限制;
2. 算法层面:加入滑动平均、卡尔曼滤波,进一步解决数据小幅抖动问题,让数据更平稳;
3. 小程序层面:后续可以增加数据曲线、历史记录、数据导出、超限弹窗提醒,让上位机功能更完善。
项目总结
整体看下来,这是一个完全独立、含金量很高的个人嵌入式实战项目。没有套用现成模板,没有冗余功能,所有模块都是我根据实际使用需求整合的。从硬件PCB设计、底层驱动编写,到多传感器数据融合、蓝牙双向通信、自研微信小程序上位机,走完了完整的物联网项目开发流程。
相比只学单一模块的同学,这个项目让我吃透了硬件布局、干扰规避、多设备协同、数据处理、移动端对接的全套逻辑,不管是用来积累项目经验、复试面试展示,还是日常实操练手,都非常合适。

1112

被折叠的 条评论
为什么被折叠?



