1、项目简介
- 系统构成:本设计由STM32单片机电路+心率血氧采集电路+DS18B20温度采集电路+蜂鸣器报警电路+ 按键检测电路+wifi电路+美锐-MR628 TTS语音播报电路+LED指示灯电路+OLED显示电路+电源电路组成。
1.1 系统功能
- 功能介绍:
- (1)使用 DS18B20 温度传感器采集温度信息,使用人体特征检测传感器检测血氧、心率信息并显示在OLED屏幕上。
- (2)通过按键可修改温度、血氧报警阈值,超出设置的阈值,蜂鸣器报警,LED点亮。
- (3)通过WIFi模块将设备与手机APP连接,手机APP可以查看温度、血氧、心率信息。
- (4)通过语音播报模块,可以播报血氧、心率、温度信息。
1.2 演示视频
2、部分电路设计
2.1 STM32单片机核心板电路设计
- 基于 ARM Cortex-M3内核的STM32F1系列单片机属于主流STM32单片机,其中增强型STM32F103子系列单片机的CPU 主频高达72MHz,片内Flash容量高达1MB,芯片引脚数量多达144个,有 QFN、LQFP、CSP、BGA 等多种芯片封装形式,并具有多种片内外设、USB接口和CAN 接口。根据STM32F103单片机片内Flash容量的不同,ST 公司将其分为小容量(16-32KB)、中等容量(64-128KB)、大容量(256KB-1MB)3种。
- 电源电路:为单片机提供稳定的工作电压,通常采用3.3V电源供电。电源电路的设计要保证单片机在不同工作条件下都能获得稳定的电压输出,以确保单片机的正常工作。
- 晶振电路:提供单片机工作所需的时钟信号。晶振电路通过晶振和电容组成,为单片机提供稳定的工作脉冲,确保单片机的定时和同步需求。
- 复位电路:实现单片机的复位功能,类似于电脑的重启。复位电路通过电容和电阻的配合,实现单片机在上电启动时的自动复位,以及通过手动按键实现复位功能,保证单片机在程序跑飞或异常情况下能够重新开始执行程序。
STM32单片机是一种功能强大、易于使用、灵活且可靠的32位微控制器,基于ARM Cortex™-M内核。其主要功能特点包括:
- 高性能和低功耗:STM32系列单片机提供多种内核选择,如Cortex-M0、Cortex-M3、Cortex-M4等,满足不同应用场景对性能的需求,同时保持低功耗特性。
- 多种通信和外设接口:STM32单片机具备广泛的通信和外设接口,如I2C、SPI、USART、USB等,便于开发者实现各种复杂功能。
- 易于开发和调试:STM32单片机提供了丰富的软件和硬件工具,如HAL库、CubeMX等,帮助开发者快速创建和调试嵌入式系统。
- 高集成度和设计灵活性:STM32系列单片机全系列产品共用大部分引脚、软件和外设,优异的兼容性为开发人员带来最大的设计灵活性
单片机最小系统原理图如下图所示:
实物图:
2.2 ESP8266 WIFI无线通信电路设计
- ESP8266-01s是由安信可科技开发的Wi-Fi模块,其核心处理器是ESP8266,这款处理器在较小的尺寸封装中集成了业界领先的Tensilica L106 超低功耗 32 位微型 MCU,支持 80 MHz 和 160 MHz 的主频,并带有 16 位精简模式。ESP8266-01s 支持RTOS,集成Wi-Fi MAC/BB/RF/PA/LNA,支持标准的IEEE802.11 b/g/n协议和完整的TCP/IP协议栈。这使得用户可以为现有设备添加联网功能,或者构建独立的网络控制器。
- ESP8266-01s 以其高性能和低成本的特性,为Wi-Fi功能的嵌入提供了无限可能,特别适用于物联网和智能家居等应用场景
其具体电路原理图如下图所示:
2.3 DS18B20温度采集电路
- DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。
- DS18B20温度传感器可编程的分辨率为9~12位,温度转换为12位数字格式最大值为750毫秒,用户可定义的非易失性温度报警设置,应用范围包括恒温控制、工业系统、消费电子产品温度计、或任何热敏感系统。试验证明DS18B20温度传感器满足本设计要求。
- DS18B20温度传感器封装一般有2种,使用上都是一样的。可以根据使用环境随意选择。第一种是直接是裸露的芯片,主要用于空气温度检测。第2种是不锈钢钢管封装好的,防水,一般用于水温灯液体温度检测。
实物图如下:
其具体电路原理图如下图所示:
2.4、OLED显示电路设计
- OLED显示屏是一款无需背景光源,自发光式的显示模块。模块采用蓝色背景,显示尺寸控制在0.96英寸,采用OLED专用驱动芯片SSD1306控制。该模块支持通过I2C接口与控制器通信,支持高传输速率,能够实现60Hz的刷新频率。
其具体电路原理图如下图所示:
实物图:
2.5、美锐-MR628 TTS语音播报电路设计
- MR628 是一款高性价的语音合成模块,使用串口通信方式,发送简单的指令即可实现文本到语音的转换,同时支持中文、英文(按字母朗读)、数字的朗读,每次合成的文本量最多可达250 字节,可同时进行文本解析和语音播放,实现连续无间隔的语音合成。内置音频功放,可直接驱动0.5W 8R 或者3W 4R 的喇叭。
电路原理图:
3、单片机代码展示
3.1 系统初始化
void HardWare_Init(void)
{
#if 1
#if ENABLE_MBK0805
Usart1_Init(115200); //串口1 连接MBK0805模块,发送命令与接收数据;同时还兼任系统打印调试信息
#else
Usart1_Init(38400); //串口1 连接体征检测模块,发送命令与接收数据;同时还兼任系统打印调试信息
#endif
Usart2_Init(9600); //串口2,语音播报模块
Usart3_Init(115200); //串口3初始化 连接wifi
Beep_Init(); //蜂鸣器初始化
KEY_Init(); //按键初始化
OLED_Init(); //OLED初始化
#if !ENABLE_MBK0805
ShengMingTeZhengInit();
#endif
WIF_ESP8266_AP_INIT(); //esp8266初始化为ap模式
//清除数据
memset(&sample_data, 0, sizeof(SampleData));
memset(&show_data, 0, sizeof(ShowDataStr));
//初始化数据
sample_data.temp_threshold = 27; //温度上限
sample_data.xinlv_l_threshold = 60; //心率下限
sample_data.xinlv_h_threshold = 100; //心率上限
sample_data.spo2_threshold = 50; //血氧下限
#endif
}
3.2 DS18B20温度采集电路
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); // ds1820 start convert
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0xbe);// convert
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0;//温度为负
}
else
{
temp=1;//温度为正
}
tem=TH; //获得高八位
tem<<=8;
tem+=TL;//获得底八位
tem=(float)tem*0.625;//转换
if(temp)
{
return tem; //返回温度值
}
else
{
return -tem;
}
}
3.3 OLED显示程序
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//size1:选择字体 6x8/6x12/8x16/12x24
//mode:0,反色显示;1,正常显示
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode)
{
u8 i,m,temp,size2,chr1;
u8 x0=x,y0=y;
if(size1==8)size2=6;
else size2=(size1/8+((size1%8)?1:0))*(size1/2); //得到字体一个字符对应点阵集所占的字节数
chr1=chr-' '; //计算偏移后的值
for(i=0;i<size2;i++)
{
// if(size1==8)
// {temp=asc2_0806[chr1][i];} //调用0806字体
// else if(size1==12)
// {temp=asc2_1206[chr1][i];} //调用1206字体
// else if(size1==16)
// {temp=asc2_1608[chr1][i];} //调用1608字体
// else if(size1==24)
// {temp=asc2_2412[chr1][i];} //调用2412字体
// else return;
temp=asc2_1206[chr1][i];
for(m=0;m<8;m++)
{
if(temp&0x01)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp>>=1;
y++;
}
x++;
if((size1!=8)&&((x-x0)==size1/2))
{x=x0;y0=y0+8;}
y=y0;
}
}
//显示字符串
//x,y:起点坐标
//size1:字体大小
//*chr:字符串起始地址
//mode:0,反色显示;1,正常显示
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode)
{
while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符!
{
OLED_ShowChar(x,y,*chr,size1,mode);
if(size1==8)x+=6;
else x+=size1/2;
chr++;
}
}
3.4、ESP8266 WIFI模块初始化
void ESP8266_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//ESP8266复位引脚
GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Initure.GPIO_Pin = GPIO_Pin_1; //GPIOC14-复位
GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_Initure);
GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);
delay_ms(250);
GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
delay_ms(500);
ESP8266_Clear();
UsartPrintf(USART_DEBUG, "1. AT\r\n");
while(ESP8266_SendCmd("AT\r\n", "OK"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "2. CWMODE\r\n");
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "3. AT+CWDHCP\r\n");
while(ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "4. CWJAP\r\n");
while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
delay_ms(500);
UsartPrintf(USART_DEBUG, "5. ESP8266 Init OK\r\n");
}