目录
1. 项目简介
本项目基于 STM32ZET6 微控制器和 ASRPRO 语音模块,通过超声波传感器检测用户与屏幕之间的距离,结合语音模块的语音播报功能,实时监控用户的坐姿。当用户离屏幕太近或太远时,系统会通过语音模块提醒用户调整坐姿,并通过 LED 指示灯提供视觉反馈。
2. 硬件准备
-
STM32ZET6 开发板:主控制器,负责超声波传感器的数据采集和与语音模块的通信。
-
ASRPRO 语音模块:用于语音播报和唤醒词识别。
-
HC-SR04 超声波传感器:用于检测用户与屏幕之间的距离。
-
LED 指示灯:用于提供视觉反馈。
3. 软件设计
原理:通过超声波连接stm32测距,来发送信号给stm32,然后通过串口2发送信息给asrpro,asrpro端接收到stm32发过来的信息后语音播报。
3.1 超声波传感器初始化
首先,我们需要初始化超声波传感器,设置其触发引脚和回响引脚。
void HC_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOF, &GPIO_InitStruct);
Trig = 0;
}
3.2 超声波距离测量
通过触发超声波传感器并测量回响时间来计算距离。
u16 HC_Trig_Init(void)
{
Trig = 1;
delay_us(10);
Trig = 0;
Echo = 0;
while(Echo == 0);
TIM3_Start();
while(Echo == 1);
return TIM3_End();
}
3.3 串口通信初始化
初始化 USART2 用于与 ASRPRO 语音模块通信。
void USART2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART2_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStrue);
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStrue);
USART2_InitStrue.USART_BaudRate = 115200;
USART2_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART2_InitStrue.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART2_InitStrue.USART_Parity = USART_Parity_No;
USART2_InitStrue.USART_StopBits = USART_StopBits_1;
USART2_InitStrue.USART_WordLength = USART_WordLength_8b;
USART_Init(USART2, &USART2_InitStrue);
USART_Cmd(USART2, ENABLE);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
NVIC_InitStrue.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStrue);
}
3.4 主程序逻辑
在主程序中,我们通过超声波传感器检测距离,并根据距离发送相应的指令到语音模块。
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
#include "usart2.h"
#include "timer.h"
#include "HC.h"
u16 s;
int main()
{
int flag = 0; // ³õʼ»¯ flag
LED_Init(); // ³õʼ»¯ LED
delay_init(); // ³õʼ»¯ÑÓʱº¯Êý
uart_init(115200); // ³õʼ»¯ USART1£¬²¨ÌØÂÊ 115200
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // ÉèÖà NVIC ÖжϷÖ×é
USART2_Init(); // ³õʼ»¯ USART2
HC_Init();
timer3_init(4999,7199);
while (1)
{
s=HC_Trig_Init()*1.7;
printf("%d cm\r\n",s);
delay_ms(250);
if(s < 20)
{
flag = 1;
}
else if(s > 40)
{
flag = 2;
}
if (flag == 1)
{
Usart_SendString(USART2, "ON"); // ·¢ËÍ "ON" µ½ USART2
printf("Sent: ON\r\n"); // µ÷ÊÔÐÅÏ¢£º´òÓ¡·¢Ë͵ÄÄÚÈÝ
LED0 = !LED0; // Çл» LED0 ״̬
delay_ms(1000); // ÑÓʱ 500ms
flag = 0;
}
else if (flag == 2)
{
Usart_SendString(USART2, "OFF"); // ·¢ËÍ "OFF" µ½ USART2
printf("Sent: OFF\r\n"); // µ÷ÊÔÐÅÏ¢£º´òÓ¡·¢Ë͵ÄÄÚÈÝ
LED0 = 0; // ¹Ø±Õ LED0
delay_ms(1000); // ÑÓʱ 500ms
flag = 0;
}
printf("\r\n");
delay_ms(5000);
}
}
3.5 ASRPRO端
4. 实验效果
上电后,如果人距离超声波小于20cmasrpro会提醒太近;反正,超过40cmasrpro会提醒太远。
5. 总结
本项目通过 STM32F103ZET6 微控制器和 ASRPRO 语音模块实现了超声波坐姿检测功能。系统能够实时检测用户与屏幕之间的距离,并通过语音模块提醒用户调整坐姿。这种设计简单实用,能够有效帮助用户保持良好的坐姿习惯。