使用STM32F103T微控制器与萤火工场CEM5861G-M11毫米波雷达模块实现人体检测亮灯功能,通过UART串口通信,模块检测数据,并驱动LED灯响应人体存在状态。
一、硬件连接
STM32F103T与CEM5861G-M11连接
UART接口:STM32的USART引脚TX、RX分别是PA9,P10连接至CEM5861G-M11的对应引脚RX TX,实现串口通信。
电源CEM5861G-M11工作电压为3.3V,STM32的电源引脚,VCC提供稳定电压,并与雷达模块共地GND,这里接开发板上的排针G上。
LED驱动电路
将LED正极通过限流电阻连接至STM32的GPIO引脚,负极接地。根据GPIO输出电平控制LED亮灭。 这里使用开发板上LED1,LED2,LED3.

二、软件设计
UART通信配置
初始化USART:设置波特率为115200,8位数据位,无校验位,1位停止位,启用接收中断。
数据接收处理:在中断服务函数中读取雷达模块发送的数据帧,解析目标状态、距离及信号强度。
代码
void USART1_IRQHandler(void) {
if (USART_GetITStatus(USART1, USART_IT_RXNE)) {
uint8_t data = USART_ReceiveData(USART1);
// 解析数据帧,判断人体存在状态
if (data == 0x55 && rx_buffer_index == 0) { // 帧头检测
rx_buffer_index = 0;
}
rx_buffer[rx_buffer_index++] = data;
if (rx_buffer_index >= 18) { // 完整帧接收完成
parse_radar_data(rx_buffer);
rx_buffer_index = 0;
}
}
}
雷达数据解析
帧结构分析:CEM5861G-M11主动上报的数据帧包含帧头(0x55 0xA5)、数据长度、功能码(0x03表示主动上报)、命令码、目标状态(0x01为运动,0x00为静止)、距离、信号强度及校验和。
关键信息提取:根据目标状态和距离阈值判断是否触发亮灯。例如,当检测到运动目标且距离小于2米时,点亮LED。
LED控制逻辑
状态机设计:
无人状态:LED熄灭,持续监测雷达数据。
有人运动:LED点亮,延时一段时间后自动熄灭(可通过定时器实现)。
有人静止:根据应用场景调整亮灯策略(如持续亮灯或低亮度模式)。
代码:
void control_led(uint8_t motion_status, uint16_t distance) {
if (motion_status == 0x01 && distance < 200) { // 运动且距离<2米
GPIO_SetBits(GPIOA, GPIO_Pin_0); // 点亮LED
delay_ms(5000); // 延时5秒
GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 熄灭LED
} else if (motion_status == 0x00) { // 静止状态
//
}
}
三,实现效果

我这里为了方便演示,把程序调整了一下,人在的时候就会一直流水灯,没有人的时候就会熄灭。
全部评论