发作品签到
标准版

[重大更新] ESP8266 WS2812 数码管时钟

工程标签

4.8k
0
0
24

简介

基于ESP-12F的网络授时时钟,带自动感光、温湿度检测和22枚彩灯

简介:基于ESP-12F的网络授时时钟,带自动感光、温湿度检测和22枚彩灯

开源协议

GPL 3.0

(未经作者授权,禁止转载)
创建时间:2022-10-31 10:57:10更新时间:2024-06-12 11:11:31

描述

板载资源:

  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 正极接3V35V均可,使能端连接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?这样操作应该会方便一些。)

最近事有点多,更新可能要等暑假了。

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
Arduino相关库文件.zip
64
2
MAX7219_PCB_Clock.zip
34
3
MAX7219_PCB_Clock_Inverted.zip
58
4
Mode7-整点报时.MOV
222
5
BOM_WS2812-Clock_2022-10-31.csv
38
6
MAX7219_PCB_Clock_Inverted_No_Checking.zip
21
7
MAX7219_PCB_Clock_No_Checking.zip
29
8
NTPClient-New.zip
14
9
MAX7219_PCB_Clock_New.zip
8
10
MAX7219_PCB_Clock_Inverted_New.zip
12
11
新功能演示.mp4
6
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航