NodeMCU(ESP8266) WiFi時(shí)鐘

一、實(shí)現(xiàn)功能
利用oled屏幕作為顯示,esp8266作為聯(lián)網(wǎng)模塊,實(shí)現(xiàn)一個(gè)可以聯(lián)網(wǎng)校準(zhǔn)時(shí)間的時(shí)鐘??
???????????????????????????????????????????????????????????????????????(PS:文末有完整代碼以及相關(guān)資料)
二、主要材料
1、NodeMCU(esp8266)

2、oled屏

三、開(kāi)發(fā)環(huán)境
這里代碼我選擇用arduino IDE寫(xiě),因?yàn)橛泻芏嗪芊奖愫芎糜玫膸?kù)
具體如何使用arduino搭建esp8266環(huán)境網(wǎng)上有很多超詳細(xì)保姆級(jí)教程,這里就不再贅述??

然后就可以開(kāi)始愉快的碼代碼了!
思路:連上WiFi---->通過(guò)獲取時(shí)間的api得到準(zhǔn)確時(shí)間---->將時(shí)間經(jīng)過(guò)處理后保存---->用oled屏顯示出來(lái)!
只要再加上億點(diǎn)點(diǎn)細(xì)節(jié)就好啦!
一、連接WiFi
連接WiFi的方法和庫(kù)有很多,我這里列出兩種方法,大家可以自行根據(jù)情況選擇
(1)使用ESP8266WiFi庫(kù)
該庫(kù)是用于控制esp8266 WiFi功能的基本庫(kù),功能強(qiáng)大,我這里只介紹如何連接上自己的WiFi這一功能
我們主要用到該庫(kù)的兩個(gè)基本函數(shù)----mode()和begin()
示例代碼:

(2)使用WiFiManager庫(kù)
該庫(kù)功能強(qiáng)大,在一定程度上包含了上一個(gè)庫(kù)的部分功能,在連接WiFi上更加自由,不需要在代碼中配置WiFi名稱和密碼了
這個(gè)庫(kù)并不是自帶的,需要我們自行下載安裝,大家可以去官網(wǎng)下載,也可以通過(guò)我的網(wǎng)盤(pán)下載,已經(jīng)放在文末了(放心,是最新版本的,文件不大,下載很快??)
工作流程:先判斷有無(wú)連接WiFi,如果連上了就繼續(xù)執(zhí)行后續(xù)代碼,如果沒(méi)有連接WiFi,則先將8266的模式改為ap模式(熱點(diǎn)模式),此時(shí)通過(guò)手機(jī)或者電腦可以看到一個(gè)名為“configure WiFi”的熱點(diǎn),連接8266發(fā)出的WiFi熱點(diǎn),會(huì)自動(dòng)跳轉(zhuǎn)到配置界面,在配置界面配置好WiFi后會(huì)自動(dòng)退出ap模式,再轉(zhuǎn)為sta模式連接剛剛配置好的WiFi
示例代碼:

配置界面:


然后等待連接成功就好啦??
二、獲取時(shí)間
這里涉及到一個(gè)概念----->API
什么是API呢?簡(jiǎn)單的說(shuō)就是一個(gè)接口,就是...有點(diǎn)不好解釋哈哈??,不太明白的可以百度一哈??百度上有詳細(xì)的解釋
大家可以百度搜索一下時(shí)間api,有很多的,我這里不方便做推薦
大家可以先直接用瀏覽器打開(kāi)這個(gè)api看一下是啥樣的
我所用的這個(gè)api用瀏覽器打開(kāi)后可以看到一長(zhǎng)串字符,:{"sysTime2":"2021-02-27 21:35:09","sysTime1":"20210227213509"}
沒(méi)錯(cuò),我們要的時(shí)間就已經(jīng)在這里面啦!??
至于我們?nèi)绾瓮ㄟ^(guò)8266去訪問(wèn)這個(gè)api,直接看代碼---->
代碼示例:

三、數(shù)據(jù)處理
經(jīng)過(guò)前兩步我們已經(jīng)能夠得到當(dāng)前的準(zhǔn)確時(shí)間了,但是那么一長(zhǎng)串信息顯然沒(méi)法直接使用,所以我們需要經(jīng)過(guò)一定的處理,準(zhǔn)確的將年、月、日、時(shí)、分、秒都單獨(dú)的提取出來(lái),這里我本來(lái)是想用正則表達(dá)式去提取的,但是沒(méi)找到arduino相關(guān)的庫(kù),后來(lái)發(fā)現(xiàn)直接用字符串分割操作就可以完成了??
網(wǎng)站返回的時(shí)間信息是字符串格式的,我們需要轉(zhuǎn)成整數(shù)型,然后利用8266每秒+1成為一個(gè)時(shí)鐘
數(shù)據(jù)處理代碼:


substring(x,y)函數(shù)可以將第x個(gè)到第y個(gè)數(shù)之間的字符串提取出來(lái),然后用toint()函數(shù)將字符串轉(zhuǎn)為整型
四、每秒加一的實(shí)現(xiàn)
實(shí)現(xiàn)秒的加一有很多方法,例如在主循環(huán)中delay(1000),然后加一,我這里提供一種更好的方法,更加精確一點(diǎn),需要用到 Ticker庫(kù)
ticker庫(kù)可以指定時(shí)間去自動(dòng)執(zhí)行一個(gè)函數(shù)
代碼示例:

五、OLED的顯示
數(shù)據(jù)已經(jīng)全部準(zhǔn)備完畢了!只要將數(shù)據(jù)顯示出來(lái)就完工了!
oled的顯示需要用到u8g2這個(gè)庫(kù),這是一個(gè)專門(mén)用于處理屏幕顯示的庫(kù),十分強(qiáng)大好用
這里提供一段hello world的顯示例程,大家先感受下
代碼示例:


本人使用的是128*64像素的oled屏,通信協(xié)議為硬件i2c
小伙伴們可能找不到自己板子硬件i2c的腳,所以也可以這么寫(xiě):

這樣就是用IO口模擬的i2c,可以自定義引腳
其他的屏幕也是類(lèi)似的方法,不論是spi還是i2c,硬件或是模擬,u8g2庫(kù)都提供相應(yīng)的支持,如果小伙伴們?cè)谛吞?hào)的選擇上還不是很清楚的話可以看看u8g2庫(kù)的相關(guān)資料
六、億點(diǎn)點(diǎn)細(xì)節(jié)
那么基本上就已經(jīng)完成啦,接下來(lái)只要將各個(gè)部分拼接到一起,然后加以協(xié)調(diào)就可以了,前面所講述的只是最重要最基礎(chǔ)的部分,實(shí)際上還有許多需要思考的地方----->
1、WiFi不用一直連著,獲取完時(shí)間就可以關(guān)閉
2、屏幕不用一直亮著,過(guò)一段時(shí)間能自動(dòng)關(guān)閉
3、如何觸發(fā)獲取時(shí)間這一步驟(定時(shí)獲取或者按一下按鈕獲?。?/p>
....
七、演示
開(kāi)機(jī)后會(huì)有提示語(yǔ),提醒按下按鍵

按下按鍵后會(huì)開(kāi)始自動(dòng)連接WiFi并且獲取網(wǎng)絡(luò)時(shí)間

然后就可以看到時(shí)間啦,并且30秒后oled會(huì)自動(dòng)關(guān)閉,再次按下按鈕可以喚醒

八、完整代碼及資料
PS:本來(lái)可以直接把代碼粘在這里的,但是出了點(diǎn)小問(wèn)題,我發(fā)現(xiàn)會(huì)出現(xiàn)部分代碼不全的情況,所以就用百度網(wǎng)盤(pán)來(lái)分享啦(小文件,下載很快的??)
源碼:
鏈接:https://pan.baidu.com/s/15Dl70g3fRFNg44HjhZ9f_w?
提取碼:8266?
庫(kù):
鏈接:https://pan.baidu.com/s/1P1Je_-wMdL-Bv-GrhWfOAw?
提取碼:wifi

總結(jié)?
總算碼完啦!新人小白第一次寫(xiě)這個(gè),百分百原創(chuàng)!有不足的地方望大家指出??我會(huì)加以改進(jìn),希望大家多多支持呀!
