本文作者:默 & 铁熊
前段时间我在网上看到了一款很有意思的点阵时钟,它可以播报天气,查看 YouTube 的订阅数,还有好看的时间动画。你可以把它当做普通闹钟,也可以连接蓝牙把它当做音箱来使用。它的许多功能都很有意思,其中我最喜欢的是它的时间显示动画效果,然而它一千多的价格让我望而却步,放弃了入手的打算。不过既然身为创客,我为什么不制作一个属于自己独一无二的创意网络时钟呢?
说干就干,于是我就做了一个创意点阵时钟,先来看一下演示视频吧:
[video(video-aynePODb-1591445136040)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=243386172)(image-https://img-blog.csdnimg.cn/img_convert/67e1039b0c8ef5ab8dd56e58dd5f5f14.png)(title-)]
预期目标及功能
- 网络自动校准时间
- 无网络连接时及时反馈
- 一键配置时钟网络
- 自定义精美时间显示字体
- 时间显示动画
- 亮度自动调节
- 时段提示
材料清单
- ESP8266 Wemos mini 开发板 1 块;
- 杜邦线若干;
- 4 合 1 点阵模块;
- 激光切割外壳;
- 栎木滑面仿木纹贴纸。
电路原理图
电路连接关系如下图所示:
结构拼装
将 USB 数据线按下图所示方向由外壳背部插入开发板,使用热熔胶将开发板固定到木板上,保持稳定直到热熔胶凝固,主要热熔胶不要碰到数据线。
将外壳前部与点阵屏按下图所示方式放置入面板凹槽,使用热熔胶固定点阵,保持稳定直到热熔胶凝固。
然后使用杜邦线按原理图正确连接电路,并拼接外壳底部与左右两侧,最后将外壳顶部进行封顶。
剪切合适大小的栎木滑面仿木纹贴纸,粘贴至外壳表面。注意留出点阵位置,可以适当使用刻刀雕刻出 USB 下载接口,以便进行供电及程序下载或更新。
程序设计
下面开始详细讲解程序设计过程。
开发环境
我们使用 Aduino 软件来编写本项目的程序,开发板选择 ESP8266 类型。至于如何在 Arduino 中配置 ESP8266 的开发环境,不在本文的介绍范围,请自行查阅相关资料。
程序思路
为了达到我们的预期目标,我们先绘制功能的思维导图,再根据思维导图逐步实现创意点阵时钟的程序设计。
下面我们将具体讨论创意点阵时钟各个子功能是如何实现的。
获取网络时间
作为一个时钟,最重要的功能当然是显示时间啦。那么该如何从网络获取时间呢?
下面的例子演示了如何获取网络时间并将时间保存在变量中,其中 ESP8266WiFi.h
库的功能是连接网络,NtpClientLib.h
库的功能是获取 NTP 服务器的网络时间,SimpleTimer.h
库是用来设置定时器每秒刷新一次时间。该例子并没有串口打印当前时间,你可以添加串口打印相关代码用来调试程序。
#include <ESP8266WiFi.h>
#include <NtpClientLib.h>
#include <TimeLib.h>
#include <SimpleTimer.h>
SimpleTimer timer;
const PROGMEM char *ntpServer = "ntp1.aliyun.com";
int8_t timeZone = 8;
volatile int hour_variable;
volatile int minute_variable;
volatile int second_variable;
void Simple_timer() {
hour_variable = NTP.getTimeHour24();
minute_variable = NTP.getTimeMinute();
second_variable = NTP.getTimeSecond();
}
void setup() {
Serial.begin(9600);
WiFi.begin("ssid", "password");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Local IP:");
Serial.print(WiFi.localIP());
NTP.setInterval(600);
NTP.setNTPTimeout(1500);
NTP.begin(ntpServer, timeZone, false);
timer.setInterval(1000L, Simple_timer);
}
void loop() {
timer.run();
}
点阵屏显示库:MD_Parola
MD_Parola
是 MAX7219 点阵屏的模块化滚动文本显示库,其主要特点如下:
- 支持点阵屏显示文本时左对齐、右对齐或居中对齐;
- 具有文字滚动,进入和退出效果;
- 能够控制显示参数和动画速度;
- 支持硬件 SPI 接口;
- 可以在点阵屏虚拟多个显示区域;
- 用户定义的字体和/或单个字符替换;
- 支持双高显示;
- 支持在混合显示文本和图形。
下面的例子简单演示了如何利用 MD_Parola 滚动显示字符串,其中 MD_Parola 对象有 4 个参数:分别为 SPI 管脚 DIN、CLK、CS 及点阵数目。下面我们所做的创意点阵时钟的显示功能均由此库开发。
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
MD_Parola P = MD_Parola(13,14,12,4); //DIN(D7) CLK(D5) CS(D6)
MD_MAX72XX mx = MD_MAX72XX(13,14,12,4); //DIN(D7) CLK(D5) CS(D6)
void setup() {