自研STM32多源环境感知系统|双毫米波雷达+双超声波+温湿度+声音采集+蓝牙+微信小程序数据终端

该文章已生成可运行项目,

项目前言

这段时间自己独立从零画板、写代码、调通整套链路,完成了这款基于 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设计、底层驱动编写,到多传感器数据融合、蓝牙双向通信、自研微信小程序上位机,走完了完整的物联网项目开发流程。

相比只学单一模块的同学,这个项目让我吃透了硬件布局、干扰规避、多设备协同、数据处理、移动端对接的全套逻辑,不管是用来积累项目经验、复试面试展示,还是日常实操练手,都非常合适。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值