基于stm32F4智能手环设计

项目功能实现说明:

1、oled显示图片

初始化oled屏幕

void Oled_Init(void)
{
    
    Oled_Pin_Init();
    OLED_RES_H;
    Delay_ms(100);
    OLED_RES_L;
    Delay_ms(100);
    OLED_RES_H;
    Delay_ms(100); 
    
    Mcu_Send_Cmd_Oled(0xAE); //关闭显示
    Mcu_Send_Cmd_Oled(0xD5); //设置时钟分频因子,震荡频率
    Mcu_Send_Cmd_Oled(80);   //[3:0],分频因子;[7:4],震荡频率
    Mcu_Send_Cmd_Oled(0xA8); //设置驱动路数
    Mcu_Send_Cmd_Oled(0X3F); //默认0X3F(1/64)
    Mcu_Send_Cmd_Oled(0xD3); //设置显示偏移
    Mcu_Send_Cmd_Oled(0X00); //默认为0

    Mcu_Send_Cmd_Oled(0x40); //设置显示开始行 [5:0],行数.

    Mcu_Send_Cmd_Oled(0x8D); //电荷泵设置
    Mcu_Send_Cmd_Oled(0x14); //bit2,开启/关闭
    Mcu_Send_Cmd_Oled(0x20); //设置内存地址模式
    Mcu_Send_Cmd_Oled(0x02); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
    Mcu_Send_Cmd_Oled(0xA1); //段重定义设置,bit0:0,0->0;1,0->127;
    Mcu_Send_Cmd_Oled(0xC8); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
    Mcu_Send_Cmd_Oled(0xDA); //设置COM硬件引脚配置
    Mcu_Send_Cmd_Oled(0x12); //[5:4]配置

    Mcu_Send_Cmd_Oled(0x81); //对比度设置
    Mcu_Send_Cmd_Oled(0xEF); //1~255;默认0X7F (亮度设置,越大越亮)
    Mcu_Send_Cmd_Oled(0xD9); //设置预充电周期
    Mcu_Send_Cmd_Oled(0xf1); //[3:0],PHASE 1;[7:4],PHASE 2;
    Mcu_Send_Cmd_Oled(0xDB); //设置VCOMH 电压倍率
    Mcu_Send_Cmd_Oled(0x30); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;

    Mcu_Send_Cmd_Oled(0xA4); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
    Mcu_Send_Cmd_Oled(0xA6); //设置显示方式;bit0:1,反相显示;0,正常显示
    Mcu_Send_Cmd_Oled(0xAF); //开启显示
    
    Oled_Clear_Screen();
}

//显示图片

void Oled_Show_Pic(u8 *buf)
{
    int i,j;
    u8 w,h;
    w = buf[2];
    h = buf[4];
    int m,n;
    m = h/8;
    if(h % 8 != 0 )
    {
        m+=1;
    }
    for(i=0;i<m;i++)
    {
        Mcu_Send_Cmd_Oled(0xb0|i);      //页地址
        Mcu_Send_Cmd_Oled(0x00);        //列地址低四位
        Mcu_Send_Cmd_Oled(0x10);        //列地址高四位
        
        for(j=0;j<w;j++)
        {
            Mcu_Send_Data_Oled(buf[j+i*w+6]);
        }
    }
}


 

2、显示时钟

dateAndTime_t *dateAndTime;//时间&日期
while (1)
{

dateAndTime = RTC_getDateAndTime ();//获取时间日期//显示年月日
sprintf(uiBuf, "20502d/%02d/%02d" , dateAndTime->year, dateAndTime->month, dateAndTime-1
OLED_showString(10,l ,uiBuf,16);

sprintf(uiBuf, "%02d:802d;%02d" , dateAndTime->hour , dateAndTime-"minute, dateAndTime->

//参数1:转换后的字符串参数2:转换的格式参数3:转换的数据
OLED_Showstring (18,4,uiBuf,12);
if(key scan (=-l,
{
FLAG++;

return;

}

实验结果:

 

3、测量温湿度(sht20传感器)

u8 uiBuf[40];//接收转换后的字符串

while (1)
{

SHT20_readTemAndHum (& humidity, stemperature);
sprintf(uiBuf,"E: %d%RH T:&d c", (char) humidity, (char)temperature);

OLED_show (10,1,uiBuf) ;
if (key_scan ()=-1)
{
FLAG++;
return;

}

实验结果:

4、心率检测HP_06模块

uint8_t HP_6_OpenBp(void)
{
    uint32_t i;
        
    for( i = 0; i < PROTOCLO_BUF_MAX_LEN; i++)
    {
        tx_buf[i] = cmd_bp_open[i];
    }
    
    return HP_6_SendCmd( tx_buf, rx_buf);       
}

uint8_t HP_6_CloseBp(void)
{
    uint32_t i;
        
    for( i = 0; i < PROTOCLO_BUF_MAX_LEN; i++)
    {
        tx_buf[i] = cmd_bp_close[i];
    }
    
    return HP_6_SendCmd( tx_buf, rx_buf);       
}

实验结果:

暑假期间留校与两名队友一起参加广东省大学生电子设计竞赛“健康电子”主题的比赛,经过两个月不懈努力,功夫不负有心人,作品也获得了广东省一等奖,现在将作品分享出来跟大家一起交流,也希望大家能多多给出修改意见。 “孤寡老人的健康监测仪”作品主要由一个可佩带的手表和一个手机APP组成,另外还有一个测血压的外接设备,手表的外壳是通过3D打印完成的。 我们的作品的想法是,孤寡老人在家里只需要带着手表,而家人在外面通过APP就可以对老人进行事实监测,手表对于老人来说并不需要进行任何操作,可以把它当成一个正常的手表来使用。 我将把所有源码和原理图分享出来。 作品采用的STM32F405作为主控芯片,没有任何外部扩展FLASH或者SRAM 作品的功能有: 1.测心率、体温和血压 2.测摔倒并报警 3.链接WIFI 4.提醒吃药 5.钟表功能 6.电容触摸,手势滑动,手势解锁,翻腕解锁等 7.体征异常报警功能 8.一键开关机,一键解锁 9.电量监测 硬件组成: 1. 1.54寸 240*240分辨率LCD显示屏 2. 1.54寸电容触摸屏 3. MPU6050 4.有人网络的WIFI模块 5.MXL90615温度传感器 6.SON7015心率传感器 7.TP4056电源芯片 主要软件的内容: 1.系统采用UCOS/II 2.界面使用的是EmWin 3.手机APP和服务器,使用的是JAVA编写 总体介绍内容介绍:整个手表端的设计,为了追求手表体积的尽可能小,除了WIFI模块外,其他地方都没有使用任何现成模块,元器件的规格也都是最小规格的,外观是通过3D打印来弄的。一些底层程序是直接用原子哥的,上层大多数是根据在自己的需求写的。 网络部分:手表上的WIFI链接是使用smartlink功能,通过手机APP来进行链接的,与服务器通信部分采用的websocket协议,实现了全双工实时通信。服务器是买的,其中websocket协议当时做的时候几乎找不到有在单片机上实现的资料,所以都是自己一点一点试出来的。 体征测量部分:心率部分由于传感器的问题,测量条件有点苛刻,干扰对其的影响较大,我们通过示波器观察规律,编写滤波算法将心率测量结果尽可能的稳定。 体温监测,数据并没有做什么特殊处理,实际使用过程中发现体温测量受环境影响较大。 血压测量,血压是通过一个独立于手表之外的设备进行测量的,设备由手表控制,并把测量数据返回到手表,由于手表上已经有一个WIFI了,因此血压与手表的数据传输直接使用了WIFI进行传输。 测摔倒功能,测摔倒算法是自己编写的,原理并不复杂,但是效果还是很不错的(误判少),主要是通过监测加速度值来判断是否摔倒的。 体征测量中,心率和体温是可以主动和被动进行的,手边会每过一段时间自己检测一次,或者通过按钮实现一次测量,测量会持续30s,30s内一旦测量成功就终止测量。 屏幕和显示:屏幕我们是在淘宝上买的1.54寸240*240分辨率的LCD屏幕,由于考虑到老人的使用问题,我们后来又找了一款1.54寸的电容触摸屏,通过工业双面胶将两者贴合在一起,本来想购买已经贴合好的,无奈淘宝上几乎没人卖我们想要的。 手表主要由三个界面,1.时钟界面 2.测量界面 3.WIFI链接界面 整个手表上只有一个开关机和解锁屏的按键,界面内容里也是没有操作按键的,因此界面的切换就需要通过手势来判断,触摸芯片是有支持手势功能的,无奈不知道为何一直打开不了那个功能,后来没办法只能直接编写算法实现手势操作功能,主要的手势功能有1.向左右切换界面 2.向上下进行锁屏和解锁 界面使用的是emwin5.28版的,用的功能都是一些最基础的功能。 手表还可以实现翻腕解锁功能,这里是通过MPU6050解算出欧拉角实现的。 触摸屏上刚好有一个小孔,我们在那里装了一个光敏电阻,用来实现屏幕的亮度自动调节。 报警功能:通过手机APP设置报警功能后,一旦手表判断体征异常就会发出报警震动,当佩戴者点击确定后,手机APP端会自动报警。为了防止误判,体征异常是否发出报警信息这里需要点击确定或者取消。当佩戴者一定时间内都没有点击确认或者取消时,手表会认为佩戴者已经无法正常操作,并自动向APP发送报警信 息,通知手机端。 手边还有提醒吃药功能,使用者通过使用手机APP可以设置3个吃药时间点,一旦时间点到了之后,手表就会自动发出吃药提醒。 用户管理: 手机APP通过扫描手表上的二维码与手机进行绑定,手机APP也需要进行注册才可以进行登录。一个手机只可以操控一个手表。 错误处理:以上的功能很多都是基于网络链接,但是网络链接有时候并不是很稳定的,因此我们在编写软件的过程中也着重对这一块进行了处理,但发生断开连接时,手表会自动进行重连,当重连失败时,手边会重启WIFI模块再进行尝试,并且提示佩戴者,当前已经
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值