[重大更新] ESP8266 WS2812 数码管时钟
简介
基于ESP-12F的网络授时时钟,带自动感光、温湿度检测和22枚彩灯
简介:基于ESP-12F的网络授时时钟,带自动感光、温湿度检测和22枚彩灯开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
板载资源:
1路MAX7219
(DIN-GPIO13;CLK-GPIO14;CS-GPIO15)
1路DHT11
(GPIO2)
1路蜂鸣器
(GPIO4)
1路22枚WS2812b彩灯
(GPIO5)
1路光敏传感器
(型号:GL5528(10K-20K),通过两级分压电路
(第一级光敏+10K电阻,第二级220K电阻+100K电阻)连接至ESP-12F的A0引脚)
2枚按键
(一枚MODE/SET“万能”按键(所有功能均由它控制,该按键为上拉输入,连接至GPIO12,可设置为INPUT_PULLUP)、
一枚RST重置按键)
主控ESP-12F模组
(TTL的TX、RX、GND已引出,GPIO0和GND连接至“FLASH”跳线,背面还引出供电引脚(带SS34防反接),
解决MicroUSB立式插座难焊接的问题)
代码已放在附件中,有需要可自行下载。
Arduino添加ESP8266环境和烧录模组的方式请自行百度,烧录方式参考这篇文章:
https://blog.csdn.net/lyndon_li/article/details/124181888
以下是程序变量定义:
①开机初始状态设置,true代表有声音,false代表静音。在开机状态下按住MODE/SET键后短按一下RST,数码管全显后再松开MODE/SET键,则可以切换为和snd相反的状态(即true变false,false变true,该状态不保存,每次开机需重新设定)
②是否有DHT11模块存在,若有则设为true(在模式4和模式5会显示温湿度),若没有则设为false(模式4和模式5会显示FAIL,避免系统一直检测不存在的DHT11)
③整点报时设置,true代表开启,false代表关闭。
模式解析:
m的值 | 模式名称 | 屏幕显示内容 | DIG1显示内容 | DIG2显示内容 | WS2812显示内容 | 备注 |
0 | Empty | 0-EP | 时间 | 休眠 | 休眠 | 亮度最低、最省电的模式 |
1 | Second | 1-SE | 时间 | 秒 | 休眠 | 上下两只数码管秒点同时闪烁 |
2 | Weekday | 2-Ed | 时间 | 星期 | 休眠 | DIG2显示"d:x",周一至周六对应的x值为1~6,周日时x=0(可根据需要修改程序让DIG2在周日显示d:7,存储星期的变量是int类型的”weekDay“) |
3 | Date | 3-dA | 时间 | 日期 | 休眠 | 日期有时准,有时不准,可根据需要更改算法或设为其他模式 |
4 | Temperature | 4-tE | 时间 | 温度 | 休眠 | DIG2格式:xx℃ |
5 | Humidity | 5-HU | 时间 | 湿度 | 休眠 | DIG2格式:xx%(百分号有点不像) |
6 | Only LED | 6-OL | 休眠 | 休眠 | 虚拟时钟表盘 | 红色代表时针,绿色代表分针,蓝色代表秒针 |
7 | LED Clock | 7-LC | 时间 | 秒 | 虚拟时钟表盘 | 同上 |
8 | Night Light | 8-NL | 休眠 | 休眠 | 小夜灯(暖色) | RGB(5,5,2) 颜色配置 |
9 | Colorful Light | 9-CL | 休眠 | 休眠 | 彩灯(循环跑马) | (黑)→红→绿→蓝→红→黄→白→青→蓝 (循环) |
- | 自定义 | ---- | / | / | / | 可自定义函数(全局搜索”//Undefined“,第一处为更改模式时的显示(”----“),第二处为自定义代码放置处(需先删除已有的三行代码)) |
以上是模式介绍。
放几张图片:
m=0:
m=1:
m=2:
m=3:
m=4:
m=5:
m=6:
m=7:
m=8:
m=9:
以上是10个模式的示意图。
使用方法:
1.焊接或贴片元件。(DIG1为0.56寸共阴时钟数码管,DIG2为0.4寸共阴时钟数码管,若使用白色数码管,则R1应在100K以上而非10K,否则亮度会太高(我用的是220K,效果不错,若是在夜间使用,则建议680K;焊接DHT11时请先将引脚从根部往下折弯90°(开孔朝上),然后对准孔位进行焊接。如果顺利的话,DHT11应该能覆盖下图中的矩形))
2.先用跳线帽或杜邦线短接丝印“FLASH”的2pin插针(新版使用丝印“FLASH”的按键,按住“FLASH”按键再上电,等ESP-12F的蓝灯闪一下之后再松开按键;也可以在上电之后按住“FLASH”键再短按“RST”键,等ESP-12F蓝灯闪一下后松手),然后给时钟上电,ESP-12F的蓝灯会闪一下,说明电路搭建没有问题。
3.将USB转TTL模块插上电脑,TTL模块的TX、RX、GND分别接时钟正面(新版的TTL排针在反面)丝印“TTL”的3pin插针的R、T、G(交差连接),并打开设备管理器记录下当前TTL模块的端口号。
4.打开配置好ESP8266开发环境的Arduino IDE软件,Ctrl+O打开程序文件(MAX7219_PCB_Clock.ino),打开库管理器,搜索并安装以下库:
AceSegment (0.12.0)
AceSPI (0.4.0)
NTPClient (3.2.1)
DHT sensor library (1.4.3)
Adafruit NeoPixel (1.10.4)
WiFiManager (0.15.0)
5.安装好后,先选择刚刚记录下的端口(“工具”>“端口”),然后点击上传,如果提示没有库文件就把附件中的库复制到“项目文件夹\libraries”文件夹中并替换,或者按报错信息修改参数。(有时会遇到奇怪的问题,如“为xxx编译时出错”,解决方法是复制所有代码后新建一个草稿并将代码粘贴进去,然后保存并上传)
6.等待编译并上传。
7.上传成功后,拔掉短接“FLASH”跳线的杜邦线或跳线帽(新版使用“FLASH”按键,可以跳过这一步),然后按下按键“RST”,系统应该会重启,两只数码管都显示“88:88”,所有LED点亮白色。若有灯不亮或数码管不亮,则检查焊点是否有虚焊,尤其是MAX7219四个角的引脚(那四个是信号脚,分别是DIN、DOUT、CLK、CS。WS2812旁边的电容可以不焊,但MAX7219芯片旁的C22一定要焊!由于信号通讯原因,MAX7219必须要有滤波电容。我曾经就有一次忘记焊了,屏幕只会闪一下,我当时还以为它坏了,结果接上电容立马就好了)和WS2812的四个引脚(焊盘非常小,电烙铁很难焊接,可以根据需要更改焊盘大小)。有时数码管会在上电时一直全显,那是因为电路中的噪音误触发了MAX7219的检测模式。此时只要断电在重新上电就可以了。(PCB中的信号线已加粗)
8.若snd=false,则在开机后DIG1会显示NS(No Sound),等待几秒后,所有LED会熄灭;若snd=true,则蜂鸣器会发出提示音。接着LED_STATE点亮红色,DIG1显示“AP”。等待一会儿后,就可以用手机或电脑(甚至Kindle)在WiFi设置中搜寻到名为“ESP8266_Clock”的AP接入点,连接并等待页面跳转到192.168.4.1,若没有则手动输入该IP地址,等界面加载完成后,点击“Configure WiFi”,选择你的WiFi网络的名称(SSID)并输入密码,然后点“Save”,若密码无误,则不久后DIG1会显示“GO”,若环境足够亮,LED_STATE会亮绿色。如果snd=true,则蜂鸣器会在联网成功后响4声。
9.如果本来有声音而你想静音,或者本来没声音而你想打开声音,则先按住 MODE/SET 键不放,再短按 RST 键,等屏幕显示的内容变化后再松开 MODE/SET 键,此时ESP8266会重新连接网络,并静音或打开声音。一句话说就是在开机时按住 MODE/SET 键可以改变当前的声音设置。
10.如果以上步骤都完成了,那么恭喜你,你现在可以开始使用时钟了。长按 MODE/SET 键直到屏幕显示你想要的模式(模式代码见前文表格)后立刻松手(程序中有500ms的模式切换间隔),ESP8266将会切换至相应模式并将其写入EEPROM,下次启动时会记忆上次的模式,不需重新设定。
11.若在时间显示模式(模式0~模式7)中WiFi断开,则屏幕和彩灯会熄灭,LED_STATE会红色呼吸慢闪,此时系统不接受 MODE/SET 的按键信号(即按键没反应),网络连接恢复后会自动重新连接,并显示时间(该时钟没有RTC实时时钟模块)。如果你想更换网络,那就按下 RST 键,系统会重启并显示“AP”,这时你就可以用手机为其重新配网。若是在其他模式下网络断开,则LED_STATE会点亮浅红色,不影响当前模式使用。在正常使用模式下,如果环境光足够亮,则LED_STATE会点亮浅绿色。
12.程序中有设置整点报时,在整点时如果snd=true,则蜂鸣器会响10声(00秒至09秒);如果snd=false,则正面的LED_STATE和背面的LED_BACKGROUND会蓝色呼吸快闪10次左右(原来的程序只会闪7次左右,附件中的视频就是原先的程序)。注意,该时钟不支持设置报时范围,所以如果需要在夜间使用,那么请将snd设为false以免打扰到睡眠,或更改程序。(程序中的报时功能可在变量定义中设定(前文有))
------------------------------PCB已更新(2022-10-01)------------------------------
1.更新后的PCB删除了原先的LED_BUZ,因为这个灯没什么用;
2.改变了USB_IN立式母座的位置,方便后期加固焊点(原先在数码管正后方,松动了也加固不了,因为焊点被数码管盖住了);
3.改用四层板(原先的两层板自动布线一直布不上,总是无法连接MAX7219芯片和数码管,改了很多次才发现有两条线确实无法跨过其他走线,于是只好改用四层板),加粗走线(JLC依然可以免费打板,不过限制在绿色)。
------------------------------PCB已更新(2022-11-01)------------------------------
1.增加PWR指示灯,上电即点亮,可以不焊接。
2.更改蜂鸣器位置,方便焊接(请先焊接蜂鸣器再焊接数码管,否则蜂鸣器非常难安装)。
3.引出MAX7219、DHT11、WS2812的数据引脚,可以只焊接ESP-12F最小系统并外接其他模块(如MAX7219显示模块、DHT11模块、WS2812灯环等),也可以把该时钟当作显示模块使用(适用于已经有NodeMCU或D1 Mini等开发板的情况),两种接法见下:
①外接模块:
②作为模块使用:
③当然,也可以不使用本时钟板,直接使用NodeMCU和显示模块、按键模块等对接。
为方便改装,现给出各按键GPIO定义:
按键 | 对应引脚 | 电阻 |
MODE/SET | GPIO12 | 10K上拉 |
RST | RST | 10K上拉 |
FLASH | GPIO0 | 10K上拉 |
可以使用网上便宜的按键(一般默认上拉,需将NodeMCU开发板的3V3引脚接到按键模块的GND引脚,NodeMCU开发板的GND引脚接到按键模块的VCC引脚,输入引脚直接连接按键模块的OUT引脚即可)或者触摸模块代替(TTP223触摸需要设置为触摸时输出低电平+点动)。
e.g.按键模块(红线是NodeMCU的3V3,橙线是NodeMCU的GPIO12,棕线是NodeMCU的GND,三根线分别连接按键模块的GND、OUT、VCC)
这些是其余模块的引脚:
模块引脚 | ESP8266 GPIO (请根据引脚映射连接NodeMCU) | 备注 |
DHT11温湿度传感器---DAT | 2 |
推荐接3V3供电 |
BUZZER蜂鸣器模块---I/O | 4 | 正极接3V3或5V均可,使能端连接GPIO4,负极接GND |
WS2812彩灯---DAT | 5 | 灯珠使用5V供电,数据线直连GPIO5 |
MAX7219数码管显示模块---DIN | 13 | MAX7219模块使用5V供电 |
MAX7219数码管显示模块---CLK |
14 | MAX7219模块使用5V供电 |
MAX7219数码管显示模块---CS |
15 | MAX7219模块使用5V供电 |
光敏电阻模块---AO |
A0 | 光敏电阻模块使用3.3V供电 |
按键MODE/SET---OUT |
12 | 连接GPIO12上拉10K电阻输入 |
4.为了便于焊接,大部分电阻采用R2512封装,少数R2010封装(R2512的全部是10K电阻,R2010的是光敏电阻的分压电路,一个220K,一个100K)。
5.将FLASH跳线更改为按键(在背面),便于调试时烧录,也可以在程序中为其自定义功能(GPIO0也是可以作为输入的)。
------------------------------程序已更新(2022-11-04)------------------------------
增加新的程序文件:MAX7219_PCB_Clock_Inverted.zip。若使用MAX7219模块而非本时钟作为时间显示的话,原来的程序MAX7219_PCB_Clock.ino会出现以下问题(对比一下):
很明显,下面那个MAX7219数码管模块的显示顺序反了,“8:57:08”变成了“80:75:8”。如果遇到该问题,请烧录MAX7219_PCB_Clock_Inverted.ino而非MAX7219_PCB_Clock.ino*。MAX7219_PCB_Clock.ino是按Seg7至Seg0的顺序写的,MAX7219_PCB_Clock_Inverted.ino是按Seg0至Seg7的顺序写的,可以适配几乎所有的MAX7219显示模块。
________________________________________________________
*因为设计PCB时是按MAX7219CWG芯片的Datasheet连线的,第一位到第八位分别对应MAX7219芯片的DIG0至DIG7,而市面上大多数MAX7219模块是按DIG7到DIG0的顺序连接数码管的(就连“AceSegment”库的开发者都是按DIG7到DIG0的顺序写的),所以如果使用PCB作为时钟就需要把0-7倒过来,第一位(左上↖)至第八位(右下↘)分别对应程序中的Seg7至Seg0。
这是刷了MAX7219_PCB_Clock_Inverted.ino的ESP8266控制MAX7219显示模块的效果:
该问题已经修复了。(显示的秒不一样是由于NTP时间更新问题,程序中设置每一秒校准一次时间,所以会有±1秒的误差)
------------------------------程序已更新(2022-12-17)------------------------------
为满足部分没有WiFi连接的场景,程序增加了2个(附件6和7),带“No_Checking”的固件不会因没有WiFi连接而关闭数码管并闪红灯。
------------------------------文本已更新(2023-01-11)------------------------------
*修正了一些错别字和错误标点。
------------------------------程序已更新(2023-10-22)------------------------------
在1024前两天的今天,这个项目终于迎来了重磅更新!(不过这可能是最后一次更新了,请期待后续带RTC时钟芯片的版本)
由于上了高中,可能时间不是很多,遇到问题可以在评论区留言,看到了一定回。
新增序号为8-11的4个文件,包括一个库文件的压缩包,两个程序文件的压缩包和一个演示视频。
*解决日期显示错误的问题。(解决办法:使用NTPClient-New.zip里的NTPClient文件夹替换libraries里的NTPClient文件夹,新版NTPClient库自带“getFormattedTime()”函数,可以获取到正确的日期。该库原有的功能没有其他变化,可以直接替换)
*所有设置可以仅通过MODE/SET按键完成,脱离上位机。启动时按住MODE/SET键可以恢复默认设置,蜂鸣器长响一声。
模式10为设置模式,该模式下短按按键可以调节当前闪烁的值,长按按键设置下一个。(按键按下时顶部的5个灯会依次点亮白色,在点亮的灯的个数为1-4个时松开按键为短按,个数为5个并保持常亮后松开按键为长按。该程序没有使用中断,故短按时也需要按久一些直到第一个灯点亮)
进入模式10时串口会打印使用说明(为了避免乱码,使用说明为英文。不带Inverted的.ino文件程序的902-988行为串口打印的使用说明)
在所有设置中,DIG1显示当前设置项目(“Snd”、“OCL”等),DIG2显示当前设置值(“ON”、“OFF”、“-XX-”、“Auto”、“H-XX”、“HH:MM”、“----”)
一、进入模式10后,数码管显示“SET”1秒后显示“SYS”,LED_STATE蓝灯闪烁,长按进入系统设置,短按跳过。在以下设置中长按确认,短按更改闪烁的值。
1.Snd(声音开关)
2.OCL(整点报时)
3.SLE(显示休眠,开启后时钟在30秒无操作后熄屏,LED_STATE点亮黄色,按MODE/SET键唤醒)
4.CLS(勿扰启动,开启后时钟在启动时将不会显示开机动画)
5.bLn(秒点闪烁,开启后时钟在显示时间时冒号会闪烁,否则常亮)
6.bGL(背景灯光,开启后LED_BACKGROUND会保持常亮,可在下一步中设置灯光的亮度,0-95可调,先设置十位(0-9)再设置个位(0或5))
7.dSb(显示亮度,Auto表示自动感光,H-XX(XX为01~16)表示手动设置亮度,H-01最暗,H-16最亮。此设置仅更改数码管亮度,WS2812b彩灯亮度仍随环境亮度变化)
[系统设置结束]
二、数码管显示“ALA”,LED_STATE蓝灯闪烁,长按进入闹钟设置,短按跳过。在以下设置中长按确认,短按更改闪烁的值。
1.AL1(闹钟1,开启后可在下一步中设置闹钟时间,若关闭则无法调节闹钟时间。在闹钟时间调节界面可依次调节4位数字(HH:MM))
2.AL2(闹钟2,设置方法同上)
3.AL3(闹钟3,设置方法同上)
[闹钟设置结束]
三、数码管显示“dEt”,LED_STATE蓝灯闪烁,长按进入设置概览,短按跳过。在概览界面,按下按键后数码管会自动依次显示设置内容,松开按键则停止在当前设置且DIG1的第四位会闪烁“-”。设置概览结束后DIG1会显示“End”,此时松开按键即可退出设置概览。
1.Snd(声音开关)
2.OCL(整点报时)
3.SLE(显示休眠)
4.CLS(勿扰启动)
5.bLn(秒点闪烁)
6.AL1(闹钟1,“HH:MM”表示闹钟开启(HH:小时;MM:分钟),“----”表示闹钟关闭)
7.AL2(闹钟2,显示格式同上)
8.AL3(闹钟3,显示格式同上)
9.bGL(背景灯光,“OFF”表示灯光关闭,“-XX-”表示灯光开启(XX为设置的亮度))
10.dSb(显示亮度,此时再按MODE/SET键,DIG1会显示“End”,松开按键退出设置概览)
[设置概览结束]
四、数码管显示“OFF”,LED_STATE红灯闪烁,长按进入深度睡眠(DeepSleep,只能按RST键唤醒),短按跳过。
五、数码管熄屏,如果未设置深度睡眠则可以按MODE/SET键切换模式,如果设置了深度睡眠则必须按RST键唤醒。
所有设置在闹钟设置结束后自动保存至EEPROM,在闹钟设置结束前(数码管还未显示至“dEt”,即还未进入第三步时)按RST键可以放弃所有更改并重新启动。
新固件的设置界面较为复杂,程序更新后遇到任何问题均可以在评论区提问,有任何改进建议也可以写在评论区。新固件第一次使用时需要在上电时按住MODE/SET键把所有设置恢复默认,否则部分设置可能会乱码或无法使用。
------------------------------文本已更新(2024-06-11)------------------------------
无意间翻出这个项目的源代码,考虑使用中断函数对新功能的按键逻辑进行重构。最近写的一个风扇控制器使用中断函数后体验极好,但是中断函数部分需要写按键去抖程序,不然用起来跟老式机械按钮一样。
(或许可以引出GPIO0的按钮作为按键2?这样操作应该会方便一些。)
最近事有点多,更新可能要等暑假了。
评论