首页 » 科学 » 玩转单片机!基于ESP8266模块的WIFI点阵时钟制作_模块_年夜众

玩转单片机!基于ESP8266模块的WIFI点阵时钟制作_模块_年夜众

落叶飘零 2024-11-12 02:27:45 0

扫一扫用手机浏览

文章目录 [+]

美图镇楼

楼主是一名业余的单片机爱好者,做过许多各种各样的时钟,能看过眼去的都发在了本版,还蒙版主厚爱给过精华。
可是至今也没有做出一个十分满意的“作品”来。
由于做的每个时钟都有这样那样的缺陷, DS1302并不太准确;DS3231要好一点但还是有偏差(实在也够用了);GPS授时倒是准了,但是要拖一根GPS天线到室外,不足整洁。
一贯想DIY一个准确、简洁的时钟治愈我的“强制症”,苦于一贯没有找到好的方案。

玩转单片机!基于ESP8266模块的WIFI点阵时钟制作_模块_年夜众 科学

在一个月黑风高的晚上我有时地创造了物联网模块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片88点阵。
利用SPI串口通讯,还可以多片级联,只要用3个GPIO就能驱动多少片88点阵。

MAX7219简介(来自百度百科)

MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接64个独立的LED。
其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个88的静态RAM用来存储每一个数据。
只有一个外部寄存器用来设置各个LED的段电流。
MAX7221与SPI™、 QSPI™以及 MICROWIRE™相兼容,同时它有限定回转电流的段驱动来减少EMI(电磁滋扰)。
一个方便的四线串行接口可以联接所有通用的微处理器。
每个数据可以寻址在更新时不须要改写所有的显示。
MAX7219许可用户对每一个数据选择编码或者不编码。
全体设备包含一个150μA的低功耗关闭模式,仿照和数字亮度掌握,一个扫描限定寄存器许可用户显示1-8位数据,还有一个让所有LED发光的检测模式。

第一次玩MAX7219,由于LUA措辞用的不顺手,调试起来有点麻烦。
先用熟习的51来点亮点阵,调试通过后再一点一点地移植到ESP8266。
买的点阵是328,即利用不雅观观的48字体,时分秒也无法全部显示,更不用说标准的58的字体了。
末了决定只用3片点阵,利用58字体,只显示小时和分钟,但也不足用,折衷一下: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

本文来源:数码之家

标签:

相关文章