设计一款采用7段显示屏的智能壁钟原型,配备多种传感器和控制触摸屏
这是一款适用于学校或办公室的智能时钟原型。它旨在打造一款时尚且功能多样的多功能时钟,让房间内的所有使用者都能查看时间、计时器及其他统计数据。该设计包含两个系统:时钟本体和触摸屏控制器。
这款时钟采用定制的3D打印段式显示屏,通过NeoPixel按钮和灯带进行照明。它还配备了3个传感器,用于读取环境数据。其设计理念是将时钟安装在墙上,然后可通过触摸屏远程控制,该触摸屏可放置在桌面或墙面上方较低位置。用户可通过触摸屏设置定时器、进行配置,并查看传感器读数。
分段显示
分段显示屏由三个主要部分组成。第一部分是状态显示区,包含可单独点亮的字词,用于显示当前时钟所显示的内容。例如,当计时器正在运行时,计时器部分就会被点亮。第二部分是一个进度条,位于整个显示屏的底部,由17个NeoPixel灯珠组成,通过逐步点亮LED灯来表示进度,填充整个进度条。最后也是最重要的一部分是数字显示区,采用4位7段数码管,每两个数字之间用冒号隔开。每个冒号上的点都可以独立控制,因此在需要时也可显示小数点。
这个显示屏是用 Fusion 360 设计的。我觉得这个过程有点麻烦,但我本身是 Fusion 和 CAD 的新手,所以肯定还有更简单的方法可以实现。我通过先绘制出所有段落的草图,再使用拔模工具从显示的段落连接到 LED,希望能得到良好的融合效果和均匀的光线。虽然结果还算不错,但我觉得如果再做一次的话,应该还能改进。七段数码的二维设计由 Posyy 制作完成。
设计完成后,我用3D打印机打印了它。我的打印机有两个挤出头,可以将黑色和透明部分一次性打印成一个整体。虽然打印机比较老,可能需要一些维护,所以打印质量不是特别好,但功能正常!
打印完成后,我不得不费力地将所有NeoPixel按钮和灯带粘贴并焊接到显示屏上。经过一些测试和重新焊接后,显示屏终于可以使用了!
时钟硬件
时钟系统完全由一个内置WiFi的Arduino NANO IOT 33驱动,这使其成为本项目的一个理想选择。它连接了分段式显示屏、三个I2C环境传感器以及一个蜂鸣器。由于NeoPixels需要较大的电流,因此还提供了外部5V电源。显示屏被分为三条NeoPixel灯带,每条区域使用一个引脚,共需3个引脚。5V电压可通过任何能够提供足够电流的电源供应。为了便于与现有系统配合供电,我最终使用了一个USB-C下游扩展板,可输出5V。虽然IoT 33是3.3V微控制器,但该扩展板内置稳压器,可将电压转换为3.3V。VIN引脚可承受4.5-21V电压,因此我们只需直接将其连接到5V电源线,无需额外的电压转换器。NeoPixels在3.3V逻辑电平下运行良好,因此无需使用电平转换器。
所包含的传感器有环境光传感器(VEML6030)、空气质量传感器(ENS160)和大气传感器(BME280)。这些传感器可采集多种数据,包括温度、湿度、气压、CO₂、TVOC、AQI 和照度。为了简化原型设计,我使用了由 Core Electronics Electronics 制造的 Piico 开发板,并将这些传感器连接在上面。通过 JST 电缆,可以将多个传感器串联起来。最终产品中,所有硬件将集成到一块单板电路板上。
所有内容都已组装在面包板上,现在我就可以开始进行软件开发了。显然,从下面的照片中很难看出连接关系,因此在电路图部分的末尾提供了一个Fritzing原理图。
触摸屏硬件
触摸屏组件的硬件非常简单。我使用的是适用于树莓派的Waveshare 10.1英寸电容式触摸屏,该触摸屏与Raspberry Pi 4B配对使用。
软件
该软件仍在开发中,尚未完全定稿,但我仍会分享整个系统的工作原理以及一些有趣的部分片段。
两个系统之间的通信通过WiFi使用MQTT实现。所有主题均以设定的时钟ID开头,这使得多个时钟和触摸屏可以通过单个MQTT代理进行连接。
控制器使用 clock1/command 主题向时钟发送命令。消息负载包含命令及其相关数据的 JSON JSON 格式信息。
时钟通过 clock1/sensors 主题发送其传感器读数。我将传感器单独拆分的原因之一是,我认为只需订阅一个 MQTT 主题,就能让外部系统轻松收集传感器数据。这也有助于在 HomeAssistantAssistantAssistant 等系统中方便地使用这些数据。
典型的传感器消息如下所示:
命令如下所示:
当前的命令为 SET_TIME、SET_CONFIG 和 SET_TIMER。当时钟接收到其中任一命令时,会更新相应的状态变量,从而导致时钟做出相应反应。时间以秒为单位的 Unix 时间戳进行发送。
迈克尔·马戈利斯(Michael Margolis)开发的名为“Time”的库用于在时钟内部跟踪时间。当接收到SET_TIME命令时,系统会将指定的时间戳传递给时间库以设置当前时间,然后继续跟踪直到下一次TIME_SET命令到来。控制器每分钟发送一次时间设置命令。虽然我很少遇到时间偏差,但这样设计可能有些过度,不过宁可谨慎也不可遗憾!
为了保持代码的整洁和易于维护,我在一个独立的文件中创建了一种传感器抽象层,从而避免了读取多种不同传感器时带来的复杂性。同时,它还允许我检测并尝试解决传感器问题。例如,这是光传感器的代码:
这意味着我在主文件中只需调用 readLight()() 即可。
使用 Adafruit NeoPixelPixel 库来控制 NeoPixel。和传感器一样,我创建了一个库来抽象出具体的灯光控制逻辑,这样我只需在主文件中关注设置数字值即可。
设置数字的函数如下:
时钟代码的一个重要部分是,我使用了任务调度功能,具体来说是Anatoli Arkhipenko开发的taskScheduler库。这也就是协作式多任务处理。通过这种方式,我可以定义方法,并设定它们运行的间隔时间。当需要时,taskScheduler就会自动执行这些方法。这对于我需要在不同时间间隔内执行多个任务的情况非常有用。例如,我希望每500毫秒更新一次显示,同时每5秒采集并发送一次传感器数据。与实时操作系统(RTOS)不同的是,任务调度器要求所有任务必须协同工作:每个任务在需要时运行,如果当前有其他任务正在运行,则会等待其轮到。而RTOS中的任务可以具有不同的优先级。由于大多数任务耗时极短,且系统内置定时器负责时间管理,因此这种设计在我的系统中效果良好,能够避免RTOS带来的额外复杂性。
接下来是触摸屏软件。该触摸屏运行一个单一的Python程序,负责图形用户界面(GUI)以及与时钟的通信。界面使用了一个名为NiceGUI的GUI库来创建。NiceGUI非常实用,它能轻松生成简洁的界面,并且便于在UI中显示数值,因为你可以将变量绑定到某个元素上,这样所有对该变量的更新都会自动反映在界面上。你还可以绑定输入值,例如滑块的变化会自动更新相应的变量。
例如,这里是配置选项卡的所有代码:
你也可以看到我创建的函数 send_command,它能非常方便地向时钟发送命令。使用 paho-mqtt Python Python 库来处理 MQTT 通信。这个库很实用,因为它允许你启动一个独立的后台线程来管理连接并监听消息,从而不会干扰图形界面,确保界面保持响应灵敏。
最终的图形界面看起来相当不错,且代码量极少。需要注意的是,NiceGUI 使用 HTML HTML 并通过浏览器渲染界面,类似于 Electron Electron 应用。这确实会增加一些内存和计算开销,但由于我使用了一台专门运行程序的 Raspberry Pi 4,所以运行良好。如果硬件资源受限,我会考虑采用原生解决方案。
最后,附上一些图形界面的截图。
本文编译自hackster.io





