基于STM32的智能手环wifi连接手机APP
本次设计主要组成是STM32单片机电路、ADXL345加速度传感器、心率检测电路、OLED液晶显示电路、电源电路、时钟DS1302和DS18B20温度传感器组成。通过ADXL345测量重力加速度,是用来判断人体状态,根据状态的数值变化进行计步功能。通过心率传感器测试,通过手指脉动放大经过比较器处理后发送给单片机进行心率采集。并将步数、心率,温度、时间等信息显示在液晶OLED上,当跌倒或者数据异常时
需要原理图工程,源码,PCB工程的朋友收藏,这篇文章关注我,私我吧!!!
请先阅读此部分,再读正文:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!说明:本次设计是在原有的STM32智能手环设计与实现的基础上进行了改进,改进如下:加入ESPwifi模块,替换掉蓝牙模块来实现手机APP的连接,删掉了原手环中的GSP经纬度定位功能,加入了血氧监测功能。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
对应源码文件下载链接:源码及所有文件资料
正文:
摘要
本次设计主要组成是STM32单片机电路、ADXL345加速度传感器、心率检测电路、OLED液晶显示电路、电源电路、时钟DS1302和DS18B20温度传感器组成。通过ADXL345测量重力加速度,是用来判断人体状态,根据状态的数值变化进行计步功能。通过心率传感器测试,通过手指脉动放大经过比较器处理后发送给单片机进行心率采集。并将步数、心率,温度、时间等信息显示在液晶OLED上,当跌倒或者数据异常时蜂鸣器报警并且我们也可以通过蓝牙模块把当前的数据发生到手机端进行提醒,本次设计功能比较全面,具有良好的市场前景。
一、研究背景及意义
随着科技与时代不断进步,电子感应与加速计技术出现,取代了以前的技术,因此电子计步器随之而来。电子计数器,振动传感器是目前电子计步器比较重要的两大组成部分。心率是指一般人心脏在安静状态下每分钟跳动的次数,因为年龄或则性别等因素,存在着差异性。这是检验人体健康标准的一大指标,也是本次设计较为突出的一大重点。并且我们还通过温度传感器显示当前温度和时钟芯片显示当前时间便于训练。
在这个大环境的发展格局下,想设计一款集合计步功能和心率体温计时跌倒报警定位检测功能于一身的智能运动手环。
从而达到以下目的:
(1) 有利于社会公共交通安全;
(2) 提高人们法律意识;
(3) 使之便捷、安全、准确、高效,便于提高人体日常红外运动的普及化;
二、实现功能
- 以STM32单片机为数据处理中心,通过DS18B20采集当前温度,MAX30102传感器采集当前人体心率值;
- 通过DS1302时钟芯片可以方便时刻观察时间;
- 通过ADXL345进行计步里程,并且通过OLED液晶显示屏显示当前信息;
- 采用按键可以进行修改非常方便快捷;
- 通过GPS对当前运动者进行定位如果发生意外情况通过蓝牙模块发送蓝牙进行提醒;
- 时钟具有掉电行走功能,重新上电后无需校准;
三、系统方案设计
系统方案设计框图
3.1 单片机芯片选择
方案一:选择ST公司的STC89C52单片机作为主控制器,STC89S52主要是低功耗、高性能器件,具有良好的存储功能。该单片机价格低,功能比较全面, 功耗小,但它是个8位存储器,不能达到实现本次设计的需求,故而因此放弃。
方案二:STM32单片机是一款超低功耗的32位器件,功能性比较丰富,模电数电集中到一个芯片上,可以较好地解决很多问题,实用性比较强。STM32F103C8T6是该系列应用较为广泛的一款控制芯片,该芯片运行在32位系统、支持精简指令集、超低功耗的混合型单片机,具有高可靠性、低功耗、易扩展、体积小、性价比高、电路简单等优势,在精密仪器上被广泛应用,以及很多智能化产品中,提高产品质量,提升经济价值,已成为众多单片机系列中一颗耀眼的新星。因此选择方案二。
3.2 显示器方案设计
方案一 :LED数码管,这种数码管的最大优势是价格较低,性能稳定,可以非常简便的和单片机相连。主要是用于数字显示上,实用性较高。但是数码管显示的数字有限,本次设计涉及数字较多,因此达不到设计的要求,此方案放弃。
方案二: 选择OLED液晶显示,常和单片机配合使用,他可以显示大量的数据,文字等等,显示的位数也比较多,外观较好,清晰,并且它的程序编写起来比较简单。经济方面价格也比较低廉,其中OLED液晶显示屏随是比较有特色的一款,很适用于本次设计,综合下来选择此方案。 故选择方案二。
3.3 倾角传感器设计
方案一 :选用陀螺仪来检测位置的信息,功能比较强,精度准确,稳定性强,但是此器件精度要求高,控制起来较为复杂,不适用于本次设计。
方案二:选用ADI公司的倾角传感器ADXL345模块来检测位置的信息,ADXL345功能比较全面,有很多存储空间,其成本预算较低,便于控制。因此选择方案二。
3.4心率检测传感器设计
方案一 :选用压力传感器收集心率血氧数据,但其抗干扰能力较差,会对设计测量产生偏差,且测量的难度相对较大,很难达到本次设计的预期目的,所以排除此方案。
方案二 :选用MAX30102红外模块采集心率信号,此模块对管心率信号采集较为稳定,其抗干扰能力较强,测量的数值比较准确,波形稳定,相对于本次设计是一个很好的选择。故选择方案二。
3.5 温度传感器设计
DS18B20温度传感器是美国达拉斯(DALLAS)半导体公司推出的应用单总线技术的数字温度传感器。该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。温度传感器之所以选择单线数字器件DS18B20,是在经过多方面比较和考虑后决定的,此传感器不但可以防水温度检测的范围比较广,价格低廉而且使用起来也比较方便。
3.6 无线数据传输设计
方案一 :选择采用NRF24L01模块进行传输,但是传输过程中需要只是2快板子分为主从才可以进行无线通信。
方案二: 选用HC05蓝牙模块,我们只需要通过此模块进行串口通信在手机端下载厂家提供的APP就可以完成数据的传输和显示,价格也比较便宜传输数据稳定。故选择方案二。
3.7 时钟模块设计
方案一 :选择单片机内部时钟,通过程序来显示当前的信息和参数,不需要外接传感器,但是内部时钟精度较差,非常容易产生积累误差并且无法掉电行走。
方案二 :选用DS1302时钟芯片,此芯片价格便宜,是专门用来处理万年历方面的信息,精准度较高,并且数据可以通过电子进行掉电行走,上电后无需重新设置。故选择方案二。
四、硬件电路设计
4.1 STM32单片机介绍
单片机的最小系统应能让单片机正常工作并且能够正常的发挥其功能的一个集成在一块芯片上的完整计算机系统。它是一个小型的电脑设备所具有的那样拥有者明显的大脑,也就是控制的核心。同时,也具有一些输出设备,还有就是定时器,能够作为时间的控制中心,具有作为通讯的接口,把所有需要用到的都集中在一个小小的芯片之上,这就是单片机。当然单片机现在的发展已经比较先进,我们来看一下作为最基本的存在它是怎样的。如下图:
STM32F103是STM32f101的增强型单片机,在32位的MCU中性能最强;具有出众的控制和通讯,非常适合低电压/低功耗的应用场合。下图为STM32内核:
对于本次设计,我们选择的单片机是STM32F103C8T6单片机。此单片机和51系列相比多了很多功能,不但运行速度比51单片机要快很多,自带2个AD转换,方便我们在设计烟雾和CO的时候免去了需要加外部ADC进行转换,非常方便;
STM32实物图如下图所示:
4.2 主要功能模块电路设计
4.2.1 电源电路设计
单片机的电源采用直流5V供电,电源模块包括一个3脚的电源座子和6脚的电源开关。电源座子用于连接外部的电源插头,电源开关用于控制整个单片机的电路开和关。原理图如下:
4.2.2 ADXL345倾角传感器电路设计
ADXL345的内部功能结构如下图所示,X、Y、Z三个相互正交的的方向上的加速度由 G-Cell传感器感知,经过容压变换器、增益放大、滤波器和电压信号输出。然后我们就可以得到步数,我们设置步数距离后可以通过步数在计算里程,ADXL345内部功能图如下:
ADXL345的三个相互正交的测量方向如下图,固定在人体上后,这三个方向上的数据意义也就随之确定了。
引脚配置(顶视图):
ADXL345是一款小而薄的超低功耗3轴加速度计,分辨率高(13位),测量范围达±16g。数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或I2C数字接口访问。ADXL345非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。其高分辨率(3.9mg/LSB),能够测量不到1.0°的倾斜角度变化。
4.2.3 心率传感器电路设计
测心率实际上也在同时检测血氧,只是基于本模块我们只用到心率检测,把血氧检测到的数据不显示,所以实际在运用的时候我们也在同时测血氧饱和度。
MAX30102 是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。它集成了一个红光 LED 和一个红外光 LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。
原理说明:
传统的脉搏测量方法主要有三种:一是从心电信号中提取;二是从测量血压时压力传感器测到的波动来计算脉率;三是光电容积法。前两种方法提取信号都会限制病人的活动,如果长时间使用会增加病人生理和心理上的不舒适感。而光电容积法脉搏测量作为监护测量中最普遍的方法之一,其具有方法简单、佩戴方便、可靠性高等特点。
4.2.4 OLED显示屏电路设计
有机发光显示器(Organic Light Emitting Display,OLED)是一种新型发光和显示器件。OLED实质上是一个薄膜器件,即在阳极和阴极之间夹多层有机薄膜组成的稳定的绿色有机薄膜电致发光器件。当有电流通过时,这些有机材料就会发光。OLED使用普通的矩阵交叉屏,OLED位于交叉排列的阳极和阴极中间,通过对阳极和阴极组合的选通,可以控制每一个OLED的点亮。
液晶显示模块电路如图所示,P5是一个4孔的排针,专门供OLED液晶显示屏使用,5V是指接的5V电压;显示屏的SCL引脚连接的是单片机的B6引脚,通过SCL引脚传输串行时钟数据;SDA引脚连接的是单片机的B7引脚,通过SDA引脚传输串行数据。
4.2.5 DS18B20温度电路设计
DS18B20 是美国 DALLAS 半导体公司推出的应用单总线技术的数字温度传感器。它的主要技术特性如下:
① 具有独特的单线接口方式,即微处理器与其接口时仅需占用 1 位I/O 端口;
② 支持多节点,使分布式多点测温系统的线路结构设计和硬件开销大为简化;
③ 测温时无需任何外部元件:
④ 可以通过数据线供电,具有超低功耗工作方式:
⑤ 测温范围为-55~+125℃,测温精度为±0.5℃:
⑥ 温度转换精度 9-12 位可编程,能够直接将温度转换值以 16 位二进制数码的方式串行输出。12 位精度转换的最大时间为 750ms。
DS18B20温度传感器结构图:
4.2.6 DS1302时钟电路设计
DS1302是一款专门处理时钟的芯片,晶振为32.768,
1、由美国DALLAS公司推出。
2、它是一种高性能、低功耗、带RAM的实时时钟电路。
3、DS1302使用方便,接线简单,适合此电子时钟的设计制作。
4、DS1302可以对年月日时分秒等进行计时,并且带有闰年补偿功能。
5、它可以一次传送多个字节的时钟信号。并且内部有存放数据的RAM寄存器
6、DS1302的 工作电压宽达2.5~5.5V。同时还提供了对后备电源的引脚。
1引脚:VCC2为主电源引脚。
8引脚:VCC1备用电源引脚。
备注:DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。由于本设计未引用备用电源,只引用了1引脚,主电源引脚。
2和3引脚:X1、X2外接晶振引脚。(外接32.768kHz晶振)
4引脚:GND为接地引脚。
5引脚:CE/RST为复位/片选线。通过把RST输入驱动置高电平来启动所有的数据传送。
RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
RST提供终止单字节或多字节数据的传送手段。
6引脚:I/O为数据输入输出口。在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
7引脚:SCLK为串行时钟,输入。
4.2.7 按键电路设计
本设计一共设置有5个控制命令按键:参数设置;设置加;设置减;清除当前步数里程。我们采用的是独立式的按键,独立式按键就是每单个的按键就会有一条单独的I/O线,他们之间互不影响,按键一端接地,采用的是低电平有效,按下按键就会连接该条线路。键盘抖动的消除采用的是软件消除,因为硬件需要外接器件成本高也比较麻烦,软件消除的原理是线建立一个子程序,在检测到按键闭合时先执行子程序延时功能,按键断开时也执行数毫秒的功能从而达到消除抖动的目的。电路图设计:
4.2.8 蜂鸣器报警电路设计
按键我们可以用于设置心率体温上限,血氧下限,当参数不在范围内蜂鸣器进行声光报警提醒。
蜂鸣器是一种蜂鸣元器件,供电时就进行蜂鸣,操作非常简单。市场上有很多蜂鸣器,我们选择提供5V电源的蜂鸣器被认为是实用的。当我们使用蜂鸣器时,我们有一个小技巧。如果我们觉得蜂鸣器不够响,我们可以把蜂鸣器顶部的纸去掉。在本次设计中,当检测到温度或者烟雾浓度高于报警上限时,蜂鸣器报警。蜂鸣器电路如图3.6所示,由3部分组成,一部分是一个1k的电阻,第二部分是一个PNP三极管,最后一部分就是蜂鸣器。三极管采用NPN三极管,其主要功能是放大电流和电平特性,因为单片机电路的电路非常小,无法提供蜂鸣器所需的电流,经过三极管放大驱动电流后,电流放大200倍,驱动蜂鸣器报警。
4.2.9 WIFI模块设计
本次设计关于无线通信方面我们采用的模块是WIFI模块,我们通过此模块可以把当前的数据和参数无线端发送到用户手机上进行显示。
本次设计无线通信部分采用ESP8266无线串口模块作为数据发送模块。ESP8266模块是一款超低功耗的UART-WiFi 透传模块,功能非常强大,通信距离很远,价格低,体积小,方便去嵌入奥任何产品,功能强大内部跑LWIP协议,支持AP,STA,AP+STA三种模式,简洁高效的AT指令。ESP8266无线模块工作电压是3.3V,单片机5V电压满足其工作电压要求,而且体积很小,价格非常便宜。在本次设计中用于单片机和手机之间的无线通信,通过WIFI模块,单片机将温湿度和烟雾浓度值发送给手机端,最后显示在APP上。下图是ESP8266模块电路图,从图中可以看出,2号、4号和8号引脚接地,1号引脚连接单片机的RXD引脚,5号引脚连接单片机的TXD引脚。
五、软件编程设计
完整的控制系统由硬件系统和软件系统组成,前一章主要阐述了系统的硬件电路的设计方案,若要充分发挥系统的设计功能,则需要支持硬件平台的软件程序,即烧写到单片机内部的程序。本设计利用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 WIFI模块设计
本次设计采用的无线通信模块为esp8266,此模块我们只需要和单片机进行串口通信通过相应的AT指令集就可以对数据进行无线传输,利用wifi模块的热点模式。供电电压3-3.6V ,峰值输出功率20DBM。峰值电流240毫安。波特率我们采用115200。我们只需要连接3.3V,GND TXD RXD就可以和单片机进行通信,并且手机端可以接受到当前wifi 发送的数据信息。
首先初始化波特率为115200 . void esp8266_init(),配置wifi模式为AP热点模式void esp_ap_mode(void),Uart1_SendStr(“AT+CWMODE=2\r\n”);设置wifi名称和密码Uart1_SendStr(“AT+CWSAP=“TEST”,“12345678”,1,3\r\n”); 通过串口把指令发送出去,Uart1_SendStr(“AT+CIPMUX=1\r\n”);建立多路连接模式(可由一个或者是多个esp8266向手机端发送数据),Uart1_SendStr(“AT+CIPSERVER=1,8080\r\n”);配置端口号为8080。开始发送数据void esp_send_buf(unsigned char conn_id, char * buf, unsigned char len); printf(“AT+CIPSEND=%d,%d\r\n”,conn_id,len);d第一个表示ID号第二个表示数据长度。strx = strstr((const char*)Usart1RecBuf,(const char*)“SEND OK”);发送完成
六、实物视频及图片
视频:
基于STM32的智能手环wifi连接手机APP
实物图片:
手机APP设计:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)