基于STM32的智能手环设计与实现(上)+https://developer.aliyun.com/article/1627372
4.2.8 蜂鸣器报警电路设计
按键我们可以用于设置心率体温上限,血氧下限,当参数不在范围内蜂鸣器进行声光报警提醒。
蜂鸣器是一种蜂鸣元器件,供电时就进行蜂鸣,操作非常简单。市场上有很多蜂鸣器,我们选择提供5V电源的蜂鸣器被认为是实用的。当我们使用蜂鸣器时,我们有一个小技巧。如果我们觉得蜂鸣器不够响,我们可以把蜂鸣器顶部的纸去掉。在本次设计中,当检测到温度或者烟雾浓度高于报警上限时,蜂鸣器报警。蜂鸣器电路如图3.6所示,由3部分组成,一部分是一个1k的电阻,第二部分是一个PNP三极管,最后一部分就是蜂鸣器。三极管采用NPN三极管,其主要功能是放大电流和电平特性,因为单片机电路的电路非常小,无法提供蜂鸣器所需的电流,经过三极管放大驱动电流后,电流放大200倍,驱动蜂鸣器报警。
4.2.9 GPS定位模块电路设计
GPS接收模块通过它的接收天线获取卫星信号,经过变频、放大、滤波、相关、混频等一系列处理,可以实现对天线视界内卫星的跟踪、锁定和测量。在获取了卫星的位置信息和测算出卫星信号传播时间之后,即可计算出天线位置。用户通过输入输出接口,与GPS接收模块进行信息交换,实现功能。GPS接收模块内部结构如图所示。
该设计中GPS信号接收模块所选用的是VK2828U7接收模块,该模块是由美国瑟孚科技有限公司所生产。主要使用到的引脚如下图所示。该模块具有12通道并行接收能力,所接收的GPS信号属于民用频段的L1信号(1575.42MHz),在没有SA干扰的情况下平均定位误差为10米,动态速度误差为0.1米/秒,信号灵敏度达到-142dBm,冷启动定位时间为42秒,热启动时间为38秒,重新定位时间仅仅需要8秒。
4.2.10 蓝牙模块电路设计
本次设计采用的无线通信模块为HC05。HC05模块是主从一体的,而且性能较高,可以与PDA、手机、电脑等具有蓝牙功能的设备实现配对,该模块所支持的波特率范围非常大,为4800~1382400,而且该模块和3.3V或5V的单片机系统相兼容,极其方便、灵活。
五、软件编程设计
完整的控制系统由硬件系统和软件系统组成,前一章主要阐述了系统的硬件电路的设计方案,若要充分发挥系统的设计功能,则需要支持硬件平台的软件程序,即烧写到单片机内部的程序。本设计利用STM32为控制中心,采用的的是STM32F103C8T6芯片,开发环境是Keil uVision5 by ARM软件,这款开发环境是目前STM32单片机系统的主流软件,使用的非常频繁。程序的烧录使用的是STLINKV2下载器进行烧录程序。
5.1软件整体流程图设计
主程序模块:系统上电后,我们需要配置个个传感器的引脚,然后初始化IIC 让oled进行液晶显示和ADXL345进行数据采集,采集完成后蓝牙串口初始化等待发送数据,DS18B20进行温度采集,心率传感器通过获取当前心率值,时钟显示当前的时间,最后把数据通过蓝牙发送到手机端,控制OLED显示当前采集到的数据,最后进入按键扫描判断按键是否按下如果按下则处理按键扫描函数。
如下图所示,是整个系统的主程序流程图:
5.2 心率程序设计
本次设计采用的是MAX30102芯片对人体心率或者血氧进行采集,我们此次是用来做心率采集,MAX30102我们采用的是IIC进行通信首先我们需要在程序里面配置IIC数据传输的引脚分别进行配置,然后对IIC进行初始化bsp_InitI2C()
; MAX30102写寄存器函数maxim_max30102_write_reg(uint8_t uch_addr, uint8_t uch_data);
MAX30102读寄存器函数maxim_max30102_read_reg(uint8_t uch_addr, uint8_t *puch_data);
MAX30102初始化maxim_max30102_init(); MAX30102读缓冲器FIFO maxim_max30102_read_fifo(uint32_t *pun_red_led, uint32_t *pun_ir_led);
计算心率,通过检测PPG (photoplethysmographic,光电容积脉搏波描记法)周期的峰值和相应的红/红外信号的AC/DC,计算出心率值
maxim_heart_rate_and_oxygen_saturation(uint32_t *pun_ir_buffer, int32_t n_ir_buffer_length, uint32_t *pun_red_buffer, int32_t *pn_spo2, int8_t *pch_spo2_valid, int32_t *pn_heart_rate, int8_t *pch_hr_valid);
5.3 液晶显示程序设计
要让液晶显示屏正常工作,首先写入命令控制字,然后在写入需要显示的数据。写入命令控制字之前,必须用指令来查看液晶是否正在工作。如果正在工作,那就必须等待,直到液晶发出工作完成的信号时,才能够写入控制字和数据。液晶显示模块程序流程图如下图所示。
5.4 按键程序设计
按键电路有四个引脚。其中两两相同。我们在连接电路的时候只需要连接2个引脚就可以了。工作原理其实就是一个对信号的高低电平检测。在我们按键被按下时,单片机引脚的IO口就会检测为低电平。这些IO口电平特性的改变就会程执行相应的功能操作。判断按键是否按下if(K10){while(K10)去延时,数值加;if(K20){delay_key()延迟,然后while(K20);是否按下如果按下,数值减。单独按第三个按键就是清零流程图如下图所示:
5.5 DS18B20温度采集程序设计
从DS18B20中读取温度的过程是:首先获取DS18B20中的温度值,该温度值为BCD码形式,然后通过转换,以十进制形式输出温度值,且此时输出的温度值含有两位小数,但输出时没有小数点,输出的温度值是实际温度的一百倍。它的步骤如下:
(1)初始化函数
(2)读取温度传感器的温度
(3)计算实际温度值
如果测得的温度大于0,只要将测到的数值乘以0.0625即可得到实际温度;如果温度小于0,测到的数值需要取反加1再乘以0.0625才能得到实际温度。
5.6 DS1302时钟程序设计
5.7 蜂鸣器报警程序设计
蜂鸣器的正极性的一端联接到三极管上,为了防止三极管直接被导通我们加一个1K的限流电阻,通过单片机iO口来输出高点电平,当管脚为高电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。当管脚为低电平时,三极管截至,蜂鸣器不发出声音。其电路如图所示。
流程图如下:
5.8 ADXL345三轴传感器程序设计
本次设计采用的是ADXL345三轴传感器来检测当前行走的步数,ADXL345有2种通信方式,我们采用的是IIC进行数据传输。首先我们需要在程序里面配置IIC数据传输的引脚分别为SCL对应A6 ,SDL对应A7,然后对ADXL345进行初始化Init_ADXL345();
写入开始信号和停止信号。void ADXL345_Start();void ADXL345_Stop();
接收应答信号:bit ADXL345_RecvACK(),
ADXL345开始读取采集到的数据BYTE ADXL345_RecvByte();
读取ADXL345的加速度值,从而判断是否发生位移void Multiple_read_ADXL345(void);
如果读取到的数据为0XE5表示发生位移行走。devid=Single_Read_ADXL345(0X00); if(devid!=0XE5)
5.9 GPS程序设计流程图
先是STM32单片机对串口的引脚进行配置,配置完成后我们选择需要用到的串口引脚进行初始化,引脚初始化完成后我们选择相对应的波特率来进行串口通信,延迟一段时间后开始获取采集信息,本次设计使用了串口3,4G模块 – USART1,GPS – USART2,BLE – USART3,DEBUG – UART4GPS
。接下来进行串口时钟使能,RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
然后是GPIO端口模式设置,GPS数据采集部分流程图如下图所示:
5.10 蓝牙程序流程图设计
本次设计使用HC-05蓝牙模块作为单片机和手机间的的通信工具。首先给蓝牙透传模块上电,此时led闪烁。单片机上的蓝牙模块也上电工作,蓝牙主要是通过串口进行数据传输,初始化显示内容为uchar code Init1[]="WELCOME: ";延迟void HC-05 delay(uint z);
写入命令void RART_com(uchar com);
写数据void write_data(uchar date);
初始化void HC-05(void)读取字节for(i=0;i<8;i++) {write_data(Init1[i]);}
最后我们通过手机点击“搜索位于有效范围内的设备”,系统将搜索蓝牙设备,默认设备名称“CH-05”,双击或者点击右键选择“添加蓝牙设备”, 输入配对密码(默认为“1234”)。点击“下一步”,如果密码正确,则单片机和手机之间则建立通信,在手机选择波特率9600,在手机上显示经纬度信息和时间。下图是HC-05蓝牙通信模块流程图:
六、实物视频及图片
这里经纬度和手机指南针做一下对比,手机经纬度如下:
测试结果还是比较准确的。
手机APP设计:
视频如下:
基于STM32的智能手环设计