内容介绍
内容介绍
任务目的:利用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
查看更多
猜你喜欢
Funpack第六期--基于MAX32660-EVSYS设计的具有计步和指南针功能的手表本项目使用MAX32660作为主控制作电子手表,具有日常日期时间显示,具有计步,温度,指南针等功能。
振青666
1227
Funpack第六期-基于MAX32660的彩屏计步手表原型使用MAX32660-EVSYS板卡制作带有时间显示的手表原型,彩色液晶屏显示时间,步数和运动时间。
R_xd
1320
Funpack第六期-MAX32660-EVSYS板卡-简易计步手表功能Funpack第六期 MAX32660-EVSYS板卡 简易计步手表功能 MPU6050 DS3231 OLED12864
Snapdragon
1123