话不多说,先看成果
主页面
目录
游戏
提示:上面的图用的板子是我自己做的c8t6板子
项目介绍
一、来源
首先这个项目是开源代码,全部来自网络(来源我也会放出来),当然我希望把这个项目扩展开来,怎么扩展,后面再讲。
最初从b站看到一个视频 应该是一个英国老哥搞的 NWATCH-WATCHX
B站链接:https://b23.tv/ph7jgv
后来一个国内的大佬移植到了stm32上面,他写了f4和f1两个版本
github链接:
https://github.com/Soysauce007/WatchX-Nwatch-stm32/
如果手上有正点原子mini板,又不想改代码的同学移步文章最后,有可直接运行的工程代码。
二、项目介绍
1.代码讲解
整体程序还是很庞大的,主要分几个部分做简单的介绍
1.硬件模块
CPU:stm32f103c8t6
0.96寸OLED SPI通信
按键
蜂鸣器
外部时钟芯片
led灯
但是在我的板子是stm32f103rct6 ,就是正点原子的mini板 ,当中没有蜂鸣器和外部时钟芯片,而且有些功能我也不需要,比如rtc时钟,原因后面说。
因此按照大佬的注释,我删减了部分代码,修改了部分硬件初始化。
初始化代码如下(示例):
void c_setup()
{
SystemInit();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(); //初始化延时函数
#if COMPILE_UART
uart_init(UART_BAUD); //初始化串口波特率为115200
#endif
memset(&oledBuffer, 0x00, FRAME_BUFFER_SIZE);
OLED_Init(); //初始化oled 四线模拟spi模式
led_init(); //初始化LED PA8 PA15
battery_init(); //ADC初始化 PA0 必要的模块
appconfig_init();
alarm_init(); //依旧无法储存闹钟,每次重启以后需要自定义
buttons_init(); //按键初始化
millis_init(); //定时器
time_init(); //启动手表时钟
display_set(watchfaceOpen);
display_load();
OLED_ColorTurn(appConfig.invert );
}
循环代码如下:
void c_loop()
{
time_update();
if(pwrmgr_userActive())
{
battery_update();
buttons_update();
}
led_update();
#if COMPILE_STOPWATCH
stopwatch_update();
#endif
if(pwrmgr_userActive())
{
alarm_update();
display_update();
}
}
其他的我就不仔细放出来了,太多了。需要的自己研究,然后评论区交流。
我的见解:项目中包含了大量函数指针,最初让我看的很头痛。后来发现,其实就是一种注册机制,也就是说,每个应用app,其中的代码都和别的app是隔离开来的,每次调用的时候都会向上注册。这个就有点像linux的运行了,把app注册到内核,内核运行这部分代码。这样保证了项目的可扩展性,和项目内每个app不会相互干扰。
3.项目的扩展
1.加入蓝牙模块
我想做成小米手环那样的,可以连接手机app,手机的app给板子做时间的校准,再加入天气和温度。
最关键,我想加入换壁纸功能。思路:手机app打开一张图,先做二值化和压缩处理,这里可能需要局部二值化,因为我试过,全局二值化效果不好。
2.结构
他们做的都是手表,我觉得市面上的手环功能比这个做的确实还是强多了,和他们做对比不合适,我打算做成桌面摆件那样的。摆在办公桌子上那种。
这样的话那么我会再设计机构,初步打算用亚克力板包裹pcb板的方式做个初步的先试试。
这样的话,其实功能还可以添加很多,比如显示电脑cpu的运行情况,消息通知,电脑本次开机以来的使用时间,甚至做蓝牙鼠标也不错。
3.当然是再加些游戏啦,像什么贪吃蛇,俄罗斯方块都可以加上去。
最后
1.我的代码
另外我放出了我的stm32f103rct6 (正点原子mini板)的完整工程,已经调试通过,同时readme。txt写了oled的io定义 ,同学们插上oled,就可以用自带的按键进行操作。
代码链接:https://download.csdn.net/download/qq_40525440/13115229
2.展望
我后续会更新我的工程进展,把我说的做出来,有兴趣的关注。