基于STM32的智能手环wifi连接手机APP(下)

简介: 基于STM32的智能手环wifi连接手机APP(下)

基于STM32的智能手环wifi连接手机APP(上)+https://developer.aliyun.com/article/1627378

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设计:

目录
相关文章
|
2月前
|
传感器 存储 编解码
基于STM32的智能手环wifi连接手机APP(上)
基于STM32的智能手环wifi连接手机APP(上)
74 0
|
7月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
166 0
|
7月前
|
XML API Android开发
Android WIFI使用简述(上)
Android WIFI使用简述(上)
306 0
|
7月前
|
Android开发
Android 状态栏WiFi图标的显示逻辑
Android 状态栏WiFi图标的显示逻辑
186 0
|
7月前
|
Android开发
Android获取当前连接的wifi名称
Android获取当前连接的wifi名称
346 6
|
7月前
|
Android开发
android连接指定wifi
android连接指定wifi
120 0
|
7月前
|
Java Android开发
Android 9在连接以太网情况下 还能连接WiFi
Android 9在连接以太网情况下 还能连接WiFi
75 0
|
7月前
|
Java Android开发 开发者
rk3399 android以太网和wifi共存
rk3399 android以太网和wifi共存
225 0
|
7月前
|
缓存 Java Android开发
Android 9.0 WiFi 扫描结果上报和获取流程
Android 9.0 WiFi 扫描结果上报和获取流程
314 0
|
7月前
|
Android开发
Android 获取Wifi开关状态、控制Wifi开关
Android 获取Wifi开关状态、控制Wifi开关
230 0
下一篇
DataWorks