云摆摊⼿把⼿教你制作ESP8266物联⽹创意点阵时钟,⼥朋友看了都想要!
你可以把它当做普通闹钟,也可以连接蓝⽛把它当做⾳箱来使⽤。它的许多功能都很有意思,其中我最喜欢的是它的时间显⽰动画效果,然⽽它⼀千多的价格让我望⽽却步,放弃了⼊⼿的打算。
不过既然⾝为创客,我为什么不制作⼀个属于⾃⼰独⼀⽆⼆的创意⽹络时钟呢?
说⼲就⼲,于是我就做了⼀个创意点阵时钟,先来看⼀下演⽰视频吧:
预期⽬标及功能
•
⽹络⾃动校准时间
•
⽆⽹络连接时及时反馈
•
⼀键配置时钟⽹络
•
⾃定义精美时间显⽰字体
羽毛球赛•
时间显⽰动画
•
亮度⾃动调节
•
时段提⽰
材料清单
•
可爱甜美的歌曲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 = ""; int8_t timeZone = 8;
volatile int hour_variable;
volatile int minute_variable;
volatile int cond_variable;
void Simple_timer {
hour_variable = TimeHour24;
minute_variable = TimeMinute;
cond_variable = TimeSecond;
}
void tup {
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.tInterval(600);
NTP.tNTPTimeout(1500);
NTP.begin(ntpServer, timeZone, fal);
timer.tInterval(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 tup {
mx.begin;
P.begin;
}
丹田气烧菜菜谱大全做法大全void loop {
if (P.displayAnimate) {
P.displayScroll("Mixly", PA_LEFT, PA_SCROLL_LEFT, 50);
}
}
点阵位图取模
要在点阵屏中显⽰图⽚,⾸先需要设计点阵图案(位图),然后对图案进⾏取模操作。点阵取模使⽤ PCtoLCD2002 取模软件,取模设置如下:
取模⽅式为阴码、逆向、逐列式,输出⽅式为 16 进制,注意格式设置为 C51 格式,其余参数按照默认取模⽅式设置即可。
位图显⽰函数:display_bitmap
这⾥我们取模的数据格式为 uint8_t 数组,我们有⾃定义字体 0~9 和时间分隔符“:”,再加上⼀些⾃定
义的图像,这就导致我们有⼤量的位图。为了⽅便的管理这些位图,我们使⽤指针数组 bitmap_data[] 去管理我们的位图。为了显⽰⽅便,我们定义了函数 display_bitmap ,该函数需要 3 个参数,分别为显⽰横坐标 abscissa、位图宽度 width 及指针数组 bitmap_data[] 中的位置 bitmap_number。需要注意的是我们这⾥并没有指定位图的⾼度,因为我们⽤到的
MAX7219 点阵屏分辨率为 8×32,所以这⾥我们默认位图⾼度为 8。
#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);
uint8_t bitmap_data1[] = {0x3e, 0x2a, 0x3e};
uint8_t bitmap_data2[] = {0x2e, 0x2a, 0x3e};
uint8_t * bitmap_data[] = {
bitmap_data1
bitmap_data2
……
};
void display_bitmap(int abscissa, int width, int bitmap_number) {
mx.tBuffer(abscissa, width, bitmap_data[bitmap_number]);