玩转单片机!基于ESP8266模块的WIFI点阵时钟制作
用ESP8266模块制作的网络授时点阵时钟
美图镇楼
楼主是一名业余的单片机爱好者,做过许多各种各样的时钟,能看过眼去的都发在了本版,还蒙版主厚爱给过精华。可是至今也没有做出一个十分满意的“作品”来。因为做的每个时钟都有这样那样的缺点, DS1302并不太准确;DS3231要好一点但还是有误差(其实也够用了);GPS授时倒是准了,但是要拖一根GPS天线到室外,不够整洁。一直想DIY一个准确、简洁的时钟治愈我的“强迫症”,苦于一直没有找到好的方案。
在一个月黑风高的晚上我偶然地发现了物联网模块ESP8266,能连接WIFI,竟然还集成了32位的单片机,关键还是白菜价,简直就是神器啊!就想着用它来做一个从网络获取时间的时钟,这样只要有网络,时间就准确无误,再也不用纠结了。
1: 认识ESP8266
ESP8266是上海乐鑫(ESPRESSIF)生产的WI-FI低功耗芯片,是业内集成度最高的 Wi-Fi 芯片,封装尺寸仅为 5mm x 5mm。 ESP8266EX 高度集成了天线开关、射频 balun、功率放大器、低噪放大器、过滤器和电源管理模块,仅需很少的外围电路,可将所占 PCB 空间降到最低。ESP8266EX 内置 Tensilica L106 32 位微型控制器 (MCU),具有超低功耗和 16 位RSIC,时钟速度最高可达 160 MHz。支持实时操作系统 (RTOS),目前 Wi-Fi 协议栈只用了 20% 的 MIPS,其他均可用于用户编程和开发。ESP8266EX 专为移动设备、可穿戴电子产品和物联网应用而设计,通过多项专有技术实现了最低功耗。ESP8266EX 有三种运行模式:激活模式、睡眠模式和深度睡眠模式,能够延长电池寿命。(PS:这段是抄的)
当然了,只有芯片是没法玩的,网上有和外围电路一起封装好的模块。还有基于这些模块的开发板,板载USB转串口电路,只要用MicroUSB线(安卓手机数据线)连接电脑就可以调试了。方便好用价格也不贵。
Esp8266模块
Esp8266开发板
为便于理解,我们可以把ESP8266模块看作一个可以连接WIFI的单片机。但是要玩转这片小小的板子,却没有想像中那么简单。模块的编程和51单片机有很大的区别,需要从头开始学起,没有找到系统的教程,只好从网络上多如牛毛的信息中提取所需要的知识点,用蚂蚁啃骨头的精神,一点点攻克难关,终于实现了想要的功能。在这里分享一下个人的一些不成熟经验,有兴趣的同好可以参考一下。
2:流行的几种开发方式
AT指令:模块通过串口与上位机连接,上位机发出指令,模块收到指令后做出响应。可以用PC端的串口助手调试。当然也可以用另一片单片机做上位机,不过放着模块集成的32位MCU不用,再用51之类的8位单片机驱动的话就有点小马拉大车了。
NodeMCU:运行于ESP8266模块上的一种固件,该固件提供一些封装好的模块(API),直接调用就可以了。使用LUA语言编程。
Arduino:模块可以在Arduino环境下调试,有基础的同学可以使用此方式。本菜鸟没玩过Arduino,只是按教程简单试了一下,发现编译下载好慢。
几种方法都试了试,发现最适合自己的是NodeMCU。LUA语言与C有共通之处,很快就能适应了。还有现成的API,一些复杂的功能用几行代码就能实现。
3:刷NodeMCU固件
买来模块后需要刷入NodeMCU固件,NodeMCU的源代码发布在Github网站,但是要编译成可刷入模块的bin固件,需要在陌生的Linux环境下,没有Linux基础貌似玩不转。
好在像作者这样的菜鸟可以在线订制固件,打开http://nodemcu-build.com/,留下自己的Email,根据自己的需要选择相应的模块和版本。等会就收到订制好的固件了。
刷入固件用的工具从这里下载https://github.com/nodemcu,按住Flash键不放,把模块接入USB,选好COM口和要刷入的固件,速度不要选的太高,可能会刷入失败,用哪个波特率自己多试几次就好。
固件刷好后,就可以开心的玩了。开发软件个人建议使用Esplorer,此软件需要安装JAVA。试一下第一句程序:print(“Hello NodeMCU!”),模块正常的话会显示Hello NodeMCU!
试试node.restart(),重新启动一下模块,会显示当前固件的版本、生成时间、包含模块等信息。
最新的NODEMCU固件支持可变波特率,不再局限于9600bps。比如可以在Esplorer里把波特率改为57600。如下图:
至此开发环境搭建完毕,可以试着先把模块连接到家里的WIFI,网上有例程,把SSID和密码改成自己的,运行一下就能连接了。
4:从Internet获取时间
关于从网络获取标准时间,先试了试获取百度网站返回的HTTP头,里面包含当前的日期时间等数据,提取一下就好,但是有网友说这个时间也不是十分的准确。
后来发现NodeMCU包含SNTP模块,是专门干校准时间这活的。并且操作也非常的简单,就决定了采用这种方式。
SNTP简介:
SNTP,即简单网络时间协议(Simple Network Time Protocol),主要被用来同步因特网上计算机的时间。SNTP协议采用客户端/服务器的工作方式。SNTP服务器通过接收GPS信号或自带的原子钟作为系统的时间基准。SNTP客户端通过定期访问SNTP服务器获得准确的时间信息,用于调整客户端自身所在系统的时间,达到同步时间的目的。
上网找到国内常用的NTP服务器,用PC端的Ping命令简单的测试了一下,结果如下。
NodeMCU固件sntp模块用法很简单,本制作只使用其中的sntp.sync()函数。
语法:sntp.sync({ server1, server2, .. }, [callback], [errcallback], [autorepeat])。
各参数解释:
1. Server1,server2,..:指定要使用的一个或多个ntp服务器
2. Callback:同步成功回调,不需要在这里显式的调用rtctime.set(),该模块在内部自动执行此操作,以获得最佳的准确性。
3.Errcallback:失败回调,返回失败的原因。
1:DNS查找失败
2:内存分配失败
3:UDP发送失败
4:超时,不接收NTP响应
4. autorepeat:如果是非零值,那么每1000秒同步将发生一次,每次同步操作后都会调用回调。
找来例程试一下
sntp.sync("202.120.2.101",
function(sec, usec, server, info)
print('sync', sec, usec, server)
end,
function()
print('failed!')
end)
运行结果:sync 1497432519 920178 202.120.2.101
结果显示同步成功,并返回了1970/01/01到现在的UNIX时间戳和同步服务器。SNTP每次成功同步后会自动更新ESP8266模块的实时时钟,也就是自动调用rtctime.set()函数。所以要使用sntp授时需要rtctime模块的支持,定制固件时不要落下。需要说明的是,成功同步后会自动更新MCU内部的RTC。
当然那一大串UNIX时间戳我们人类是不太能看懂的,还要转为我们习惯使用的日期和时间,这就要用到rtctime模块中的rtctime.epoch2cal()函数,语法为rtctime.epoch2cal(timestamp)。函数成功运行后返回一个数组,数组包括:
year 1970年 ~ 2038年
mon 1 ~ 12月
day 1 ~ 31 日
hour 小时
min 分钟
sec 秒
yday 当前是一年中的第1 ~ 366天
wday 星期 (星期天是1)
例程:
tm = rtctime.epoch2cal(rtctime.get()) --获取当前日期时间并转换
print(string.format("%04d/%02d/%02d %02d:%02d:%02d",
tm["year"], tm["mon"], tm["day"],
tm["hour"], tm["min"], tm["sec"]))
运行结果:2017/07/08 09:48:04
5:显示标准时间
标准时间有了,下一步的工作就是怎样显示出来的问题,总不能开着电脑用串口助手看时间吧。家里用的话1602或12864液晶字太小,远了就看不清楚;数码管做的太多,都审美疲劳了;最后决定用点阵,但是ESP8266模块的GPIO太少,不够用来直驱点阵,为解决这个问题,特地从淘宝上淘了基于MAX7219的点阵模块,4个MAX7219驱动4片8*8点阵。使用SPI串口通讯,还可以多片级联,只要用3个GPIO就能驱动若干片8*8点阵。
MAX7219简介(来自百度百科)
MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。 只有一个外部寄存器用来设置各个LED的段电流。 MAX7221与SPI™、 QSPI™以及 MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。 一个方便的四线串行接口可以联接所有通用的微处理器。 每个数据可以寻址在更新时不需要改写所有的显示。MAX7219允许用户对每一个数据选择编码或者不编码。 整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。
第一次玩MAX7219,由于LUA语言用的不顺手,调试起来有点麻烦。先用熟悉的51来点亮点阵,调试通过后再一点一点地移植到ESP8266。买的点阵是32*8,即使用不美观的4*8字体,时分秒也无法全部显示,更不用说标准的5*8的字体了。最后决定只用3片点阵,使用5*8字体,只显示小时和分钟,但也不够用,折衷一下:0-19时用24小时制,20-23时用12小时制。
成功点亮后的点阵,私人订制的字体,还是很漂亮的。
6:开始制作:
硬件很简单,就是一个ESP8266模块, 5V转3.3V的电路和几个阻容。用洞洞板很快就搞定了。
用茶色亚克力做面板,可以增强点阵的可读性。插上电源,模块尝试连接WIFI,蓝色LED亮起,成功连接后该LED熄灭,稍等就会显示当前准确的时间了。如果WIFI断线,模块会尝试自动重连,LED会指示当前的WIFI连接状态。
在每次上电后自动同步时间,然后每隔一个小时与NTP服务器同步一下。这样只要有网络,本时钟显示的时间就是准确的。
功耗也不大,白天正常亮度,不到100ma。21:30后降低亮度,避免影响睡觉。
再来几张美图
7:后记
对于一个仅仅靠兴趣驱动的爱好者来说,做这么一个小玩意遇到的困难太多了,身边没有谁可以请教,只能在网上一点一点的找答案,好在还算是成功的实现了自己想要的功能。现在已经正常的运行了一个多月,时间与GPS几乎一秒不差。
不足的地方就是本时钟只能在一个WIFI环境下使用。其实NodeMCU也提供了通过浏览器设定模块的SSID和密码的功能,但试了几次发现不太稳定,再说换了WIFI只要简单的改改程序就好,也不算麻烦。决定不再折腾,能做到这样就很满意了。
-----官方NodeMCU文档,请移步http://nodemcu.readthedocs.io/en/master/en/
还有调试中的一张图,用液晶屏显示,一起发上来
谢谢观看!
浏览更多精彩内容请登录数码之家网站
技术交流请联系原作者
作者:qxgm
本文来源:数码之家
单片机实例分享,打造音乐频谱时钟
(此处已添加圈子卡片,请到今日头条客户端查看)电路原理
下面我们按各功能模块逐一给大家介绍一下这个制作的电路原理吧。
图25.1 时钟显示效果
图25.2 频谱显示效果
1.电源部分
电源电路如图25.3所示。
图25.3 电源部分的电路
电源模块采用了一支很常见的7805稳压芯片,再加一大一小两个电容进行滤波,输入端直接买了个9V/1A的电源适配器,方便省事。7805额定输出电流1A,对于这样的小系统来说,已经完全够用了。实际使用下来,7805发热不太大,无需加装散热片。为了使用方便,我在7805的输入端加装了一个开关和一个红色LED,分别作为系统电源开关和指示灯。
2.时钟、温度部分
这部分电路如图25.4所示。单片机采用的是STC89C52RC,考虑到成本和功能性问题,时钟部分我没有单独买时钟芯片,直接使用内部定时器中断作为时钟源,这直接导致的结果就是时钟误差稍大。经测试,每24小时误差在1分钟左右,作为一个功能性的DIY作品,就饶了它吧,呵呵……温度传感器采用的也是常用的DS18B20,相信大家都很熟悉。3个功能按键分别是时钟(闹铃)小时调整、时钟(闹铃)分钟调整和时钟/闹铃切换。
图25.4 时钟、温度部分的电路
为了跟“频谱”切题,时钟、温度的显示没有采用传统的数字表示,而是分别把时钟的小时、分钟的十位和个位分别用点来表示,每两列表示一位,每行表示一点,左下角是时钟,右上角是温度。是不是有点晕乎呢?其实只要你看了实物就会觉得很简单,文字的确不是很好表达。时钟没有单独设置“秒”的显示,为了增强显示效果,我特地在右下角设置了沙漏下落效果,每一秒钟下落一行。
3.频谱分析部分
电路如图25.5所示。这部分的制作跟“五色LED频谱”是一样的原理,都是把音频信号经AD采样,用快速傅里叶变换求出频点的幅值,再根据幅值大小来驱动相应的LED。只不过我设计的是每次采128个点,最后十六分频而已。单片机采用的是STC12C5A60S2,已经在信号输入端加了47pF的电容滤波,但还是发现有噪声。可能是因为使用的是洞洞板,还有就是走线过长的缘故。我试着加大了电容再次滤波,但直接导致低频响应变差,鉴于噪声不是很严重,最后只好作罢,将就一下了。
图25.5 频谱分析部分的电路
4.WAV 音乐播放部分
电路如图25.6所示。这部分应该是整个系统里面最复杂的了,WAV音乐播放部分是在数码之家论坛hit00版主的“WAV播放器”的基础上修改而来的。单片机选用的是STC12C5616AD,虽然该单片机自带有SPI接口,在一定程度上已经简化了程序,但SD卡文件的操作确实有难度。原来的程序里带有语音,受到单片机存储空间的限制,语音质量太差,没有“暂停”及”上一曲”功能。我去掉了语音,增加了暂停及上一曲功能。其中暂停功能的实现花了我不少时间,本来想当暂停的时候就让单片机进入死循环,开始的时候再跳出来,结果试了以后发现完全不是那么回事。单片机PWM信号的输出本来就用的中断,单片机进不进入死循环,中断还是一样的工作。要不就让它在暂停的时候掉电或是待机什么的呢?好吧,查STC12C5616AD的手册。一看手册我笑了,PCON电源控制寄存器不正是我想找的吗,单片机进入掉电模式,单片机状态维持当前值,呵呵……问题解决。功放部分采用了LM386功放芯片,直接引用了网上LM386的典型应用电路。
图25.6 WAV音乐播放部分的电路
5.显示部分
电路如图25.7所示。为了能有好的显示效果,显示部分用的是32×16的高亮度聚光蓝色LED组成的点阵屏,1kΩ电阻限流。全过程手工焊接,可能我焊得慢,整整焊了一晚上。焊接状态与电路细节如图25.8、图25.9所示。
图25.7 显示部分的电路
由于时钟部分跟频谱分析部分共用点阵屏,所以必须考虑两路信号的隔离分时显示。还有就是32列LED的列驱动问题。信号的隔离分时显示我用的是74HC573锁存器,通过控制OE端口将需要显示的信号线路的74HC573选通,而将另外一组信号通过74HC573的高阻态实现隔离。LED的列驱动选用的是74HC154(4线—16线译码器),只需一组I/O口就可实现32列LED的列驱动了。
到此,整个系统的介绍就完了,在这里特别感谢数码之家论坛的hit00版主在制作过程中给予的大力帮助。图25.10就是这个实物作品的全家福。
为了尽量减少干扰和连线,整个板子电源全是用焊锡走的线。信号线采用杜邦线和插针连接,方便调试。
虽然制作时觉得挺累,但当看到自己做的东西“跑”起来那一刻,就什么都值了,我相信每一个DIY爱好者都会有这种感觉吧,也许这就是DIY的乐趣。相关源程序可到qq群657864614进行下载。
图25.8 焊接状态
图25.9 电路细节
图25.10 完成的电路板实物
划重点:现收集整理了1300G电子技术资料,一口价68元,需要的朋友可以私聊我!
相关问答
单片机 双色 点阵 原理,要详细一点,是用595的?如果想用595控制点阵屏,我的空间有程序,还有Proteus演示。如果想用595控制点阵屏,我的空间有程序,还有Proteus演示。
为什么 单片机点阵 只亮一点?单片机点阵只亮一点的原因可能是由于单片机是一列(行)、一列(行)逐一进行扫描的,如果扫描到第一列(行)有1个LED亮,扫描到下一列(行)的时候有2个LED灯亮...单...
51 单片机点阵 线路接法?51单片机点阵接法具体看所使用的点阵型号和具体电路设计。一般来说,点阵的接法通常涉及以下几个方面:1.供电接法:点阵需要一个合适的电源供电。通常情况下,...
51 单片机 8*8 点阵 由下向上显示0~9?P1口为行,P2口为列;numb[10][8];//0~9的点阵数据由下向上显示,即从P1.7开始驱动行,然后是P1.6,,,P1.0;for(i=0;i<10;i++){a=0x80;for(...
...状态等.本文给出了一种基于MCS-51 单片机 的16×16 点阵 _作业帮[最佳回答]IsbecomesbasedonthemonolithicintegratedcircuitLEDdisplaymonitorbymanyindependentLEDli...
led 点阵 具体点亮过程.要有8*8的 点阵图 来显示_作业帮[最佳回答]P2\P0.01234567.000000000//0X00.100010000//0X10.200110000//0X30.3...
单片机 P1口与集成的好的led 点阵 模块接法?直插LED压降在1.8V~2.2V之间,贴片LED压降在2V~3.3V之间,按3V压降计算,LED的电流I=(Vcc-Uled-Uce)÷R=(5V-3V-0.3V)÷200Ω=8.5mA;理...
单片机点阵式 led显示屏显示汉字是镜像怎么处理-ZOL问答如果你的单片机点阵LED显示屏显示汉字是镜像,首先检查数据传输方向是否正确,可能是字库选择或者扫描顺序反了。调整一下这些设置,确保从左到右、自上而下的正确...
12864 点阵 液晶屏不显示?1、这种情况是新手最常碰到的问题。首先,对应硬件PDF文档确定你的接线没有任何问题,如果是51单片机,用P0口一定要加10K的上拉电阻,不然就算程序正常,也无法...
像素 点阵 灯带怎么用?像素点阵灯带是一种灯光装饰产品,可以通过控制器调整颜色、亮度和模式。首先,将灯带固定在需要装饰的地方,然后通过控制器或手机APP连接灯带,选择想要的颜色...