桌面时钟

ShadowC

| 本文阅读量: -

一个可以显示简单信息的桌面时钟项目。

时钟图片

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. 实现的关键环节

  1. 显示屏适配

    显示屏驱动常见,但是屏幕尺寸不适合(此屏幕为128x128,所支持尺寸为160x128),因此找到Adafruit_GFX库修改显示参数以进行适配。

  2. 中文字体显示

    Python脚本调用FreeType库,并以16*15的点阵为目标,生成显示数据,进而生成.h文件供引用。

  3. 天气图标显示

    将和风天气的图标(SVG)格式转换为bmp,然后用python解析bmp文件格式,同样取模为32x32的显示数据,并生成.h文件供使用。

  4. 天气信息更新

    心知天气提供的API,所返回的数据量大,且调用API所需的身份认证(hmac算法)暂时没有实现,因此使用腾讯云服务器作为中转,预先解析好数据,并以简化格式返回。

    云服务器上脚本基于flask框架,用Gunicorn(一个WSGI HTTP 服务器)运行,并由Nginx提供代理。暂时提供苏州和南京的天气数据,接口为http://weather.shadowc.ltd/weather/Nanjing,返回数据第一个字节T/F作为标志位,T表示有效,后续为今明两天天气信息,包括昼夜气象代码、高低温度、风向风速、降雨概率等。

  5. 菜单逻辑设计

    以菜单表存储,每个菜单的状态提供上下左右和按键四个状态转移方向,目前已完成天气时间显示、网络配置、时间更新、天气更新功能。

3. TODOS

  1. 优化菜单逻辑,增加分离时间和天气显示,天气显示信息可以在一屏放下;
  2. 增加配置功能,可通过网页配置天气信息的位置;
  3. 尝试通过修改芯片MAC地址,验证接入校园网;
  4. 设计串口交互方式,可显示电脑状态信息。