一个可以显示简单信息的桌面时钟项目。
0. 定位
-
显示实时时间,小时级天气信息;
-
初始化时建立AP,其中运行简单的web服务器,用于配置网络
-
可联网更新时间和天气信息;
-
根据需求显示其他信息(如电脑运行信息)
1. 整体结构
硬件
MCU:ESP32
显示:SPI接口的1.44寸OLED屏幕
时间存储:DS1302 时钟芯片
控制输入:摇杆(兼容PS2手柄)
软件
Arduino 框架
分为Display、Network、Weather、Clock、Utils等模块
Display:封装显示相关的函数,提供整体样式刷新、时间显示、天气图标显示等功能,并加入了中文显示功能;
Network:网络配置、更新时间、天气数据;
Weather:天气信息处理;
Clock:DS1302芯片读写功能、时间信息处理;
Utils:小功能的封装,如结构体数据复制、摇杆状态读取。
2. 实现的关键环节
-
显示屏适配
显示屏驱动常见,但是屏幕尺寸不适合(此屏幕为128x128,所支持尺寸为160x128),因此找到Adafruit_GFX库修改显示参数以进行适配。
-
中文字体显示
Python脚本调用FreeType库,并以16*15的点阵为目标,生成显示数据,进而生成
.h
文件供引用。 -
天气图标显示
将和风天气的图标(SVG)格式转换为bmp,然后用python解析bmp文件格式,同样取模为32x32的显示数据,并生成
.h
文件供使用。 -
天气信息更新
心知天气提供的API,所返回的数据量大,且调用API所需的身份认证(hmac算法)暂时没有实现,因此使用腾讯云服务器作为中转,预先解析好数据,并以简化格式返回。
云服务器上脚本基于flask框架,用Gunicorn(一个WSGI HTTP 服务器)运行,并由Nginx提供代理。暂时提供苏州和南京的天气数据,接口为http://weather.shadowc.ltd/weather/Nanjing,返回数据第一个字节
T/F
作为标志位,T表示有效,后续为今明两天天气信息,包括昼夜气象代码、高低温度、风向风速、降雨概率等。 -
菜单逻辑设计
以菜单表存储,每个菜单的状态提供上下左右和按键四个状态转移方向,目前已完成天气时间显示、网络配置、时间更新、天气更新功能。
3. TODOS
- 优化菜单逻辑,增加分离时间和天气显示,天气显示信息可以在一屏放下;
- 增加配置功能,可通过网页配置天气信息的位置;
- 尝试通过修改芯片MAC地址,验证接入校园网;
- 设计串口交互方式,可显示电脑状态信息。