Funpack第六期-MAX32660-EVSYS板卡-简易计步手表功能
Funpack第六期 MAX32660-EVSYS板卡 简易计步手表功能 MPU6050 DS3231 OLED12864
标签
嵌入式系统
Snapdragon
更新2021-04-02
798

自我介绍:我是来自山东的陈海,目前是嵌入式工程师。主做单片机类。

一、实现的功能:

本设计大体上完成了两个功能,一个是时钟系统,采用DS3231实时时钟芯 片,第二个是计步系统,采用MPU6050计算步数。oled把两个系统分成两个界面, 通过按键自由切换。

按键切换界面,一个界面是日期时间界面,另一个是步数界面

显示采用OLED12864单色屏

计时采用DS3231芯片

计步采用MPU6050

  1. 日期时间界面

    void time_mode_init(void)
    {
    	OLED_Clear();
    	OLED_DisplayChineseInit(0, 1);
    	OLED_ShowString(64+8, 0, (uint8_t *)"(UTC+8)", 16);
    	OLED_DisplayChineseInit(48, 2);
    	OLED_ShowChar_3216(32, 16, ':');
    	OLED_ShowChar_3216(32+16+32, 16, ':');
    	OLED_ShowChar(8*4, 48, '/', 16);
    	OLED_ShowChar(8*7, 48, '/', 16);
    	OLED_RefreshGram();
    }

例一、日期时间界面初始化

void refresh_date_time(void)
{
	DateTime dt = DS3231_GetNowTime();
	OLED_ShowNum_3216(0, 16, dt.hour, 2);
	OLED_ShowNum_3216(16*3, 16, dt.minute, 2);
	OLED_ShowNum_3216(16*6, 16, dt.second, 2);
	OLED_ShowNumDateTime(0, 48, dt.year, 4, 16);
	OLED_ShowNumDateTime(8*5, 48, dt.month, 2, 16);
	OLED_ShowNumDateTime(8*8, 48, dt.day, 2, 16);
	OLED_DisplayChinese(128-16, 48, week_str[dt.week - 1]);
	OLED_RefreshGram();
}

例二、日期时间界面刷新

  1. 计步界面

    void step_mode_init(void)
    {
    	int16_t gx, gy, gz;
    	OLED_Clear();
    	OLED_DisplayChineseInit(0, 3);
    	OLED_RefreshGram();
    	
    	MPU6050_GetGyroscope(&gx, &gy, &gz);
    	MPU6050_GetGyroscope(&gx, &gy, &gz);
    	MPU6050_GetGyroscope(&gx, &gy, &gz);
    	
    	mpu6050_init_data = GET_ABS(gx) + GET_ABS(gy) + GET_ABS(gz);
    }

例三、计步界面初始化

void refresh_step(void)
{
	static uint32_t step_cnt = 0;
	static uint32_t step_ok = 0;
	int16_t gx, gy, gz;
	MPU6050_GetGyroscope(&gx, &gy, &gz);
	uint32_t tmp = GET_ABS(gx) + GET_ABS(gy) + GET_ABS(gz);
	if (mpu6050_init_data * 4 < tmp)
	{
		step_ok = 1;
	}
	else if (step_ok == 1)
	{
		step_cnt++;
		step_ok = 0;
	}
	OLED_ShowNum_3216(16, 24, step_cnt, 6);
	OLED_RefreshGram();
}

例四、计步界面刷新

  1. 主函数初始化与按键检测

    int main(void)
    {
    	static uint8_t mode = 0, key_down = 0, key_cnt = 0;
    	
    	printf("uart ok ?\r\n");
    	OLED_Init();
    	SIM_I2C_Init();
    	// DS3231_Init();
    	MPU6050_I2C_Init();
    	uint8_t rel = MPU6050_Init();
    	time_mode_init();
    	GPIO_Config(&key_pin);
    	DelayMs(1000);

例五、主函数初始化

while (1)
	{
		if (!mode)
			refresh_date_time();
		else
			refresh_step();
		
		if (GPIO_InGet(&key_pin) == 0) {
			key_down = 1;
		} else {
			key_down = 0;
			key_cnt = 0;
		}
		LCD_SET_BLK(0);
		for (__IO uint32_t i = 0; i < 200000; i++) {} //500ms
		LCD_SET_BLK(1);
		for (__IO uint32_t i = 0; i < 200000; i++) {}
		if (key_down == 1)
		{
			if (key_cnt >= 1)
			{
				mode = mode ? 0 : 1;
				if (mode)
					step_mode_init();
				else
					time_mode_init();
				key_down = 0;
				key_cnt = 0;
				printf("%u\r\n", (uint32_t)mode);
			}
			else
			{
				key_cnt++;
			}
		}
	}

例六、主函数按键检测及循环

 

二、对本活动的心得体会。

1、第一次接触这种小封装的单片机,试用了下发现性能超乎预料,通过这次活动, 我对小体积高性能的解决方案有了新的认知

2、美信写的函数库非常清晰易懂,对自己封装底层有重要参考价值。

建议:

和上次一样,感觉活动如果可以多出些直播外教程就更好了。

团队介绍
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号