【RT-Thread作品秀】RedClock
作者:iysheng
概述
我开发 RedClock 这个作品的背景主要有两个:
1. 我想开发一下墨水屏,想体验下新奇的事物;
2. 想在传统 wifi 时钟的基础上添加一个番茄时钟的功能,尝试提高工作效率,让其不单单具备提供时间和天气的功能
目前 RedClock 实现的功能,可以概括为 4 条:
1. 通过墨水屏同步显示时间、天气图标(时间信息通过 ntp 校时,天气信息通过 js 语言从和风天气获取)
2. 一键切换番茄时钟模式,番茄时钟的默认周期是 25 分钟,到实践通过屏幕提示
3. 通过外接氣壓传感器 lps22hh 获取温度和气压信息并通過墨水屏幕
4. 時間、天氣、温度和气压信息支持通过网络访问 ART-Pi 的设备 IP 同步显示
开发环境
硬件: ART-Pi 、LPS22HH、SSD1619
RT-Thread版本:V4.0.3
开发工具及版本:
编译工具:arm-none-eabi-gcc、 arm-none-eabi-binutils
编辑工具:vim
烧录、调试工具:openocd 0.10+ dirty(打过补丁才可以烧录程序到 ART-Pi 的外部 flash)、kermit(串口工具)、telnet(调试工具)、gdb
硬件开发工具:Kicad(RedClock 扩展板开发工具)
RT-Thread使用情况概述
使用到的内核模块部分:
互斥锁、信号量、mempool、device
组件部分:
cJSON、EasyFlash、webnet
软件包部分:
lps22hb(传感器)
其他:
硬件框架
软件框架说明
软件的实现设计到两个层次,设备驱动层(墨水屏驱动层开发),APP层(天气、传感器和时间的更新显示分别在不同的线程完成,线程间的数据交换通过函数完成,全局变量均为 static 类型,依据高内聚、低耦合分层设计理念开发)
软件模块说明
本软件主要的软件设计理念是创建多个线程,根据功能划分各个线程实现的功能:
在 factory 工程的基础上,添加了 red_monitor_thread 这个线程,完成传感器数据周期一分钟获取一次、以及更新 tomato 显示相关的内容。还有一个 redclock_lcd_thread 线程周期性的刷新屏幕,目前从屏幕寿命考虑,设置为 3 分钟刷新一次。还有一个线程完成对按键的扫描(目前仅仅支持番茄时钟快速切换的按键)。
考虑到为了实现一次配网,重启后自动联网,开启了easyflash 保存 wifi 帐号和密码。联网为了消除跨域访问设备的问题,替换了原始 ART-Pi 的 index.html 文件为自己的文件,这样将对应的 js 和 css 部署在自己电脑这端完成开发和调试,借助 webnet 通过 CGI 的方式完成时间、温度、气压的上报(支持同步通过浏览器访问 ART-Pi查看)和天气的下发(天气通过 js 连接和风天气服务获取)。
墨水屏的开发,通过注册了一个 device 完成,通过 SPI 接口访问。更新墨水瓶内容相关的动作,放在了四个函数中完成(分别完成天气图标更新、时间更新]、传感器数据更新、番茄时钟状态更新),
这些函数指挥更新墨水屏显示的内容,不会刷新墨水屏显示,刷新墨水屏显示的时候,更新才会有效。
演示效果
演示视频:
圖片展示:
比赛感悟
比赛过程中,我使用 Kicad 画了两版PCB,并作PCB然后焊接,整个开发过程大部分都是在 Linux 下完成的,初了开发墨水屏显示界面的时候使用了磨刀这个原型开发工具以及Image2Lcd整个软件将图片转换为 C语言。
感觉自己收获最多的地方有两个方面,第一个方面当然是软件了,印象最深刻的是通过在 openocd 的代码仓库察看不同的 branch 和 patch,给 openocd 打补丁然后修改对应的配置文件,支持直接烧录程序到 ART-Pi 的外部 flash。通过这个工作,让我对 openocd 的使用有了更多的了解(通过访问 openocd 的网站以及看对应的 manual), 这个是我最激动的。其他的软件方面就是对 easyflash和webnet 这两个组件有了学习,通过阅读对应的代码,学到了在 32 上进行 KV 类型的数值保存的新方法,之前我接触32 保存配置数据使用的方法是从内部 flash 的尾部划分 64KB 虚拟为快设备,然后来格式化为 elm 文件系统,然后以 cJSON 格式保存,现在看来浪费了很多空间, easyflash 也是我以后工作中替换之前这种方案新的可取的方法。通过对 Webnet 的学习,我真正接触到了通过 http 服务,远程通过浏览器和 32 进行数据通讯的方法。围绕 webnet, 我还真正开发了一波js 和css 代码,开发 js 代码的时候,学会了通过 jquery 实现 post 和 get 请求,然后 ART-Pi 这端通过 CGI 完成 HTTP 通讯。
硬件方面,我感觉很开心的是自己真的在 Kicad 绘制了 PCB 然后导出 gaber 文件作出来了 PCB 板,通过设计两版完成了 RedClock 的扩展版,两个版本都可以让墨水屏顺利点亮。第一版的问题是我将 ART-Pi 对应的 P1 和 P2 两组管脚放反了,汗!
不管怎么说,参加这次比赛,我很开心,可以接触到新的事物包括硬件模块和 RT-thread 上新的组件,以及真切体会到了在 Linux 上开发设计硬件的可能。