Funpack第六期--基于MAX32660-EVSYS设计的具有计步测温的手表
本设计是利用MAX32660-EVSYS板子作为主控,OLED进行显示,MPU6050完成计步与测温功能的智能手表。
标签
嵌入式系统
显示
冷月烟
更新2021-03-17
864

任务目的:利用MAX32660-EVSYS板子作为主控,OLED进行显示,MPU6050完成计步与测温功能的智能手表。

本设计一共由三个界面组成,分别是时间显示界面、计步显示界面、温度显示界面,通过按键去切换界面。

主要代码:

RTC初始化代码,这里主要参考美信提供的例程做轻微的修改。

int user_rtc_init(uint16_t day, uint8_t hr, uint8_t min, uint8_t sec)
{
    sys_cfg_rtc_t sys_cfg;

    NVIC_EnableIRQ(RTC_IRQn);

    sys_cfg.tmr = MXC_TMR0;
    if (RTC_Init(MXC_RTC, day*SECS_PER_DAY+hr*SECS_PER_HR+min*SECS_PER_MIN+sec, 0, &sys_cfg) != E_NO_ERROR) {
        printf("Failed RTC_Setup().\n");
        return -1;
    }

//    printf("RTC started.\n");
//    printTime();

    if (RTC_SetTimeofdayAlarm(MXC_RTC, TIME_OF_DAY_SEC) != E_NO_ERROR) {
        printf("Failed RTC_SetTimeofdayAlarm().\n");
        return -1;
    }

    if (RTC_EnableTimeofdayInterrupt(MXC_RTC) != E_NO_ERROR) {
        printf("Failed RTC_EnableTimeofdayInterrupt().\n");
        return -1;
    }

    if (RTC_SetSubsecondAlarm(MXC_RTC,  (uint32_t)MSEC_TO_RSSA(SUBSECOND_MSEC_0)) != E_NO_ERROR) {
        printf("Failed RTC_SetSubsecondAlarm().\n");
        return -1;
    }

    if (RTC_EnableSubsecondInterrupt(MXC_RTC) != E_NO_ERROR) {
        printf("Failed RTC_EnableSubsecondInterrupt().\n");
        return -1;
    }

    if (RTC_EnableRTCE(MXC_RTC) != E_NO_ERROR) {
        printf("Failed RTC_EnableRTCE().\n");
        return -1;
    }
}

 

计步部分主要使用MPU6050的dmp实现,参考原子的代码。

主要包括初始化dmp

mpu_dmp_init()

调用读取实际角度。

mpu_dmp_get_data(&pitch,&roll,&yaw);

获取计步数,这里由dmp库提供,为了减少误判,在dmp库判断只有连续计步到达7步以上才判断为走路状态,然后才会正式开始计步数,这样可以避免将抬手放手的动作判断为计步。

dmp_get_pedometer_step_count(&step);

读取温度利用了,这里是直接读取MPU6050寄存器然后做转换得到的数值。

MPU_Get_Temperature()

 

主要显示函数,包括时间显示、步数显示、温度显示三个界面,只要调用对应的显示函数,就会更新OLED上的显示。

因为美信这款单片机本身资源比较小,没有采用显示缓冲的方式,节约了一部分RAM空间。

为了避免出现闪烁的问题,因此只有再切换界面的时候才会对全屏进行清除,而在正常循环显示的时候只是覆盖刷新。

 

void display_clock(uint16_t day, uint8_t hr, uint8_t min, uint8_t sec)
{
	OLED_ShowChar48(4+0,    1, hr/10);
	OLED_ShowChar48(4+24*1, 1, hr%10);
	OLED_ShowChar48(4+24*2, 1, 10+sec%2);
	OLED_ShowChar48(4+24*3, 1, min/10);
	OLED_ShowChar48(4+24*4, 1, min%10);
}

void display_steps(uint16_t num)
{
	OLED_heart_image(4, 1, 0);
	OLED_ShowChar48(4+24*2, 1, num/100%10);
	OLED_ShowChar48(4+24*3, 1, num/10%10);
	OLED_ShowChar48(4+24*4, 1, num%10);
}

void display_temp(uint8_t num)
{
	OLED_ShowChar48(4+12+24*0, 1, num/10%10);
	OLED_ShowChar48(4+12+24*1, 1, num%10);
	OLED_heart_image(4+12+24*2, 1, 1);
}

 

心得体会:之前也用过美信的芯片,不过是他家的电源芯片。这块美信单片机看似不起眼,其实功能十分健全,很适合应用于小型的传感器设备上。

希望硬禾以后也能像这期一样推出一些不那么主流的芯片方案,有助于工程师们增长见识。

 

附件下载
程序.zip
代码
团队介绍
电子爱好者
团队成员
李千秋
一个爱捣鼓板子的开发者
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号