之前用四位LED八段数码管做过温度计,效果不错。半夜里不会太亮以至于影响到睡觉,然而想看的时候却显示的绝对清晰。
干脆再做一个时钟吧,想看时间瞄一眼就好,省得摸手机。
LED数码管选了一种由TM1637驱动的四位LED模块,没有小数点但是有时间分隔符,非常适合显示HH:mm。使用起来很简单,只需要两个IO口即可。DS3231选了I2C的模块,甚至还支持温度检测(本项目未使用此功能)。
接线很简单。DS3231就按硬件I2C标准连接Arduino就好,LED模块我选了A0、A1这两个口。当然这个是可以任意改的,代码中指定好CLK和DIO连接哪两个IO口即可。
较新版的Arduino IDE支持在库管理中在线搜索并下载安装库,因此库安装还是相当方便的。TM1637相关库选用了DigitalTube的,DS3231选用了Sodaq的。
代码比较简单。这个LED模块支持亮度设置,挺好的,晚上不会太刺眼。需要说明的是DS3231模块时间校准设置时需要正确构造 DateTime对象。为了尽可能的准确,预留好代码编译和上传的时间。比如,现在是14:58分,预估编译+上传需要10秒钟,那么DateTime可以构造成15:00,并且在14:59:50的时候开始运行。记得该次运行的时候rtc.setDateTime(dt);是不能被注释的。一旦上传成功,就必须把它注释掉并且再次上传,不然Arduino掉电后下次运行还是从15:00开始计时。此外,只要不执行setDateTime,DateTime对象就并不要求给出准确的时间,甚至可以不必定义。
LED的时间分割符控制是通过point方法实现的,参数为true代表显示,为false代表不现实。
#include "TM1637.h" #include <Wire.h> #include "Sodaq_DS3231.h" DateTime dt(2018, 5, 4, 14, 5, 0, 5); // 年 月 日 时 分 秒 星期。周日-周六对应0-6 //pins definitions for TM1637 and can be changed to other ports #define CLK A0 #define DIO A1 TM1637 tm1637(CLK, DIO); void setup() { tm1637.init(); // 设置LED亮度。最暗到最亮 0-7。典型值2。 tm1637.set(1); Wire.begin(); rtc.begin(); // 第一次使用时钟模块,或者需要校准时放开下列注释 // 一旦校准完毕,继续注释掉,并再次上传 // 定义dt的时候建议预留一些编译和上传的时间 //rtc.setDateTime(dt); } // 时间分隔符闪烁标识 bool ShowPoint = true; void loop() { DateTime now = rtc.now(); int h = now.hour(); int mn = now.minute(); int b0 = h / 10; int b1 = h % 10; int b2 = mn / 10; int b3 = mn % 10; tm1637.point(ShowPoint); tm1637.display(0, b0); tm1637.display(1, b1); tm1637.display(2, b2); tm1637.display(3, b3); ShowPoint = !ShowPoint; delay(1000); }
版权声明
1.本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行测试。
2.本站资源仅供学习和交流使用,版权归资源原作者所有,请在下载后24小时之内自觉删除。
3.若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与本站无关。
4.若内容涉及侵权或违法信息,请联系本站管理员进行下架处理,邮箱ganice520@163.com(本站不支持其他投诉反馈渠道,谢谢合作)
- 上一篇: 树莓派RGB LED实验(C程序)
- 下一篇: 树莓派GPIO入门—— SPI数码管显示
发表评论