DIY电子钟

1. 项目简介

源作者仓库:https://gitee.com/xzqiaochu/eclock/

近年来,工业化大生产使得市面上的小商品越来越同质化。与此同时,各种小工具、DIY元件也大量涌现,鼓励人们自己设计并制作独特的作品。

钟表,作为人们日常生活中不可获取的一员,早已在步入机械化大生产的队伍,在数量上满足了人们的需求。但市面上的常见钟表功能单一,一般只具备显示时间的功能。虽然市场上也出现了多功能钟表,但其价格往往令人望而却步。

因此,我决定自己DIY一款多功能电子钟

2. 设计方案

2.1 材料选择

主控板:Arduino Nano
作为风靡全球的单片机,Arduino提供简易、稳定的开发环境,而且网络上也有众多资料供参考。最重要的一点是,Arduino单片机的价格十分便宜。这次我选择的是Arduino系列的Nano版本,这款单片机体积小巧。

3

显示屏:OLED
我购买了带有SSD1306的OLED显示屏,这款只有四根接线,采用IIC与主控通讯,大大简化了接线。

1

时钟模块:DS3231
为了保证电子钟在断电的情况下仍能保证时间的准确性,需要加装外接时钟模块。这款时钟模块上装有一节纽扣电池。

4

2.2 电路设计

我使用立创EDA平台绘制了电路草图。

0

2.3 加工工艺

为了保证接线的牢固性,所有的接线均使用电烙铁焊接。

模块之间采用泡沫胶粘合。

3. 制作过程

3.1 硬件部分

首先我用面包线将各模块连接起来,并使用Arduino IDE下载相关示例程序,检查各模块的运行情况。(示例程序见:/arduino/examples/

测试无误后,我使用电烙铁将接线焊接到各模块上。
这里我遇到了一个小困难。OLED显示屏和时钟模块都是采用IIC与主控通讯的,而在一个焊点上焊接两个针脚并不方便。随后我发现,时钟模块上有两组IIC引脚,这就好办了。我边将这两组引脚分别与主控和OLED屏相连接。

2

3.2 软件部分

3.2.1 日期时间显示

首先,要显示钟表最基本的功能:显示时间。

我使用了RTC库文件,该库封装了对DS3231模块的操作。只需要调用以下函数边和轻松获取到时间日期。

RTC.getYear();
RTC.getMonth();
RTC.getDay();
RTC.getHours();
RTC.getMinutes();
RTC.getSeconds();

需要注意的是,DS3231模块在使用前需要初始化时间。方法也非常简单,只需要上传一个示例程序即可。(程序见:/arduino/examples/DS3231_Adjust/

3.2.2 温度显示

在看示例程序的过程中,我看到了获取温度的函数。

RTC.getTemp();

这是因为时钟模块的晶振会受温度的影响,为了保证时间的准确性,模块内置了一个温度传感器为晶振提供“补偿”。

而且,实际测试发现,得到的温度数据并不准确。大概是因为模块在工作的过程中会发热。

显示日期的温度的程序见:/arduino/time/

3.2.3 高考倒计时

完成了基本功能之后,我想让电子钟显示高考倒计时。

这就需要进行日期做差了,于是我使用DEV C++编写相关函数,在本地进行调试。(程序见:/cpp/)本地调试省去了费时的上传过程,大大提高了编程效率。

在电脑上调试好日期计算函数后,我将其移植到单片机上,执行正常。

4. 测试

我进行了如下测试,结果均正常:

  • 断电一天后重新上电,时间显示正常。
  • 强制指定一些特殊的时间点,高考倒计时计算正确。

5. 说明书

使用USB口供电即可使用,注意防尘防水。

5

6. 评价及反思

6.1 一些可取之处

  1. 价格便宜,成本20~30元左右。
  2. 扩展性强,实现的功能只受限于想象。
  3. 功耗低,整机功耗约为10mA。

6.2 目前存在的bug

高考倒计时小鼠点后第六位时钟为0,即使改成double类型也是如此。

6.3 不足及改进方案

  1. 没有外壳;以后可以采用3D打印外壳,或者环氧树脂密封。
  2. 时间的准确性依赖于纽扣电池;以后可以改用ESP8266ESP32模块,该模块支持接入WIFI同步网络时间,而且CPU频率更高,价格便宜。
分类: 默认分类 标签: 暂无标签

评论