物聯(lián)網(wǎng)是最近幾年比較火的一個(gè)話題,什么是物聯(lián)網(wǎng)?
物聯(lián)網(wǎng)(Internet of Things,簡(jiǎn)稱IoT)是指通過(guò)各種信息傳感器、射頻識(shí)別技術(shù)、全球定位系統(tǒng)、紅外感應(yīng)器、激光掃描器等各種裝置與技術(shù),實(shí)時(shí)采集任何需要監(jiān)控、 連接、互動(dòng)的物體或過(guò)程,采集其聲、光、熱、電、力學(xué)、化學(xué)、生物、位置等各種需要的信息,通過(guò)各類可能的網(wǎng)絡(luò)接入,實(shí)現(xiàn)物與物、物與人的泛在連接,實(shí)現(xiàn)對(duì)物品和過(guò)程的智能化感知、識(shí)別和管理。物聯(lián)網(wǎng)是一個(gè)基于互聯(lián)網(wǎng)、傳統(tǒng)電信網(wǎng)等的信息承載體,它讓所有能夠被獨(dú)立尋址的普通物理對(duì)象形成互聯(lián)互通的網(wǎng)絡(luò)。
簡(jiǎn)單的來(lái)說(shuō)就是通過(guò)有線和無(wú)線的方式組成一個(gè)網(wǎng)絡(luò)系統(tǒng),并將所有硬件設(shè)備納入這個(gè)網(wǎng)絡(luò)系統(tǒng)之中,從而達(dá)到各個(gè)設(shè)備之間自由交互信息、控制等目的。
特別說(shuō)明:通過(guò)網(wǎng)絡(luò)遠(yuǎn)程控制LED的方式有很多,本文介紹的這種方式是基于blinker的服務(wù)器和APP實(shí)現(xiàn)的。
1 工作原理
Blinker廠家有自己的一個(gè)服務(wù)器,我們的設(shè)備(esp8266、esp32、手機(jī)等)都可以通過(guò)網(wǎng)絡(luò)接入到這個(gè)服務(wù)器,手機(jī)app我們看不到源碼不確定是以什么樣的方式接入的,我主要講一下MCU(esp8266、esp32等)這邊,MCU是通過(guò)WIFI連接到互聯(lián)網(wǎng)的,然后通過(guò)MQTT協(xié)議接入到Blinker的服務(wù)器,MCU作為客戶端,服務(wù)器作為服務(wù)端。具體MQTT的實(shí)現(xiàn)原理這里不多說(shuō)了,光是MQTT這一個(gè)話題都可以寫好多文章了,想深入了解的同學(xué)可以自行查閱資料。
當(dāng)MQTT連成功之后,MCU會(huì)一直偵聽,等待服務(wù)器下發(fā)數(shù)據(jù)。這個(gè)時(shí)候我們可以通過(guò)手機(jī)app操作,比如點(diǎn)一下開燈,服務(wù)器收到這個(gè)開燈命令后會(huì)通過(guò)MQTT發(fā)送命令到MCU,MCU接收到數(shù)據(jù)并解析命令后執(zhí)行點(diǎn)燈的操作。服務(wù)器在這里相當(dāng)于一個(gè)中轉(zhuǎn)站,把手機(jī)的操作轉(zhuǎn)發(fā)到設(shè)備端,實(shí)現(xiàn)了手機(jī)和設(shè)備之間的互動(dòng)。不過(guò)有一點(diǎn)要說(shuō)明的是,設(shè)備和服務(wù)器是通過(guò)MQTT連接的,而手機(jī)app和服務(wù)器則不一定是用MQTT,個(gè)人覺得用http的可能性更大,但是看不到源碼,所以實(shí)際上是怎么通訊的就不清楚了,這個(gè)也不是很重要,并不影響實(shí)際的使用。
2 硬件準(zhǔn)備
我這里以ESP8266和ESP32為例講解,其他MCU方法和原理都是一樣的,所以根據(jù)自己的MCU選擇其中一種即可。
硬件配置如下:
模塊 | 型號(hào) | 說(shuō)明 |
---|---|---|
ESP8266 | ESP-12F | 這是安信可的一款模組,內(nèi)部主要是用樂鑫的ESP8266EX再加上一個(gè)片外FLASH組成,開發(fā)板型號(hào)是NodeMCU-12F(CH340版本) |
ESP32 | ESP-WROOM-32 | MCU是樂鑫的一款芯片,開發(fā)板型號(hào)ESP32 DEVKITV1 |
具體的硬件參數(shù)和電路原理圖這里就不發(fā)出來(lái)了,不同廠家做的開發(fā)板引腳可能會(huì)有點(diǎn)差別。
3 軟件準(zhǔn)備
版本說(shuō)明:
本文測(cè)試時(shí)各軟件使用的版本如下:
軟件 | 版本 | 備注 |
---|---|---|
Arduino IDE | 1.8.16 | Blinker需要配合1.8.x及以上版本的Arduino IDE |
ESP8266 package | 3.0.2 | Blinker需配合使用3.0.0或以上release版本的ESP8266 package |
ESP32 package | 2.0.1 | Blinker需配合使用2.0.0或以上版本的ESP32 package |
Blinker arduino package | 0.3.9 | 當(dāng)前最新版本,以后可能會(huì)有更新 |
Blinker APP | 2.5.2(安卓版) | 當(dāng)前最新版本,以后可能會(huì)有更新 |
3.1 Arduino IDE環(huán)境搭建
Arduino開發(fā)板庫(kù)安裝
esp8266和esp32開發(fā)板環(huán)境搭建具體就不說(shuō)了,不懂的同學(xué)可以看下我之前發(fā)布的博客。
esp8266開發(fā)入門教程(基于Arduino)——環(huán)境安裝
使用VS code搭建Arduino IDE環(huán)境
Blinker庫(kù)安裝
1)下載Blinker Arduino庫(kù)壓縮包
Blinker Arduino庫(kù)可以在官網(wǎng)下載,也可以在Github或者我的網(wǎng)盤上下載。
Blinker Arduino庫(kù)官網(wǎng)下載:https://diandeng.tech/dev
Blinker Arduino庫(kù)Github下載:https://github.com/blinker-iot/blinker-library/archive/master.zip
Blinker Arduino庫(kù)云盤下載:https://pan.baidu.com/s/1VlyYBs1-pEA-L9fUI-t_dA
提取碼:m660
2)安裝Blinker庫(kù)
打開Arduino IDE,點(diǎn)擊 項(xiàng)目 -> 加載庫(kù) -> 添加.ZIP庫(kù),選擇下載好的壓縮包,等待安裝完成即可。
3.2 手機(jī)安裝Blinker APP
安裝包可以在官網(wǎng)下載,也可以在手機(jī)的應(yīng)用商店下載。
Blinker APP官網(wǎng)下載:https://diandeng.tech/dev
4 Blinker APP注冊(cè)
4.1 注冊(cè)賬號(hào)
打開安裝好的Blinker APP,注冊(cè)一個(gè)賬號(hào)并登錄。
4.2 新建一個(gè)設(shè)備
登錄賬號(hào)進(jìn)入之后,如果沒有設(shè)備,先點(diǎn)擊 “添加設(shè)備”
,我們這里選 “獨(dú)立設(shè)備”
。
然后選擇接入方式,我們這里選 “網(wǎng)絡(luò)接入”
。
服務(wù)器我們這里選 “點(diǎn)燈科技”
,直接用Blinker的服務(wù)器。
然后我們就得到了一個(gè)設(shè)備密鑰(Secret Key),這個(gè)密鑰要在后面寫到我們的應(yīng)用代碼里面的,這里可以先不管,返回設(shè)備列表,在設(shè)備的詳細(xì)信息里面也可以看到設(shè)備密鑰。
打開我們新建的設(shè)備,這個(gè)設(shè)備的控制界面是可以自定義的,按鍵和窗口這些都可以自己調(diào)整,我這里只是為了測(cè)試圖方便就直接導(dǎo)入一個(gè)現(xiàn)成的示例。
在設(shè)備的詳細(xì)信息里面可以修改設(shè)備的名稱,也可以看到設(shè)備密鑰,這個(gè)密鑰在后面寫代碼的時(shí)候要用到。
5 Arduino代碼編寫
示例代碼如下:
提示:設(shè)備密鑰、WIFI賬號(hào)和密碼要根據(jù)自己修改,代碼中的定義僅供參考。密鑰可以在手機(jī)Blinker APP的設(shè)備信息里面查看。
注:該代碼esp8266和esp32通用
#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = "testkey"; // 設(shè)備密鑰
char ssid[] = "test"; // WIFI賬號(hào)
char pswd[] = "12345678"; // WIFI密碼
#define LED_PIN 5 // LED引腳
// 新建組件對(duì)象
BlinkerButton Button1("btn-abc");
BlinkerNumber Number1("num-abc");
int counter = 0;
// 按下按鍵即會(huì)執(zhí)行該函數(shù)
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // 翻轉(zhuǎn)LED燈狀態(tài)
}
// 如果未綁定的組件被觸發(fā),則會(huì)執(zhí)行其中內(nèi)容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
counter++;
Number1.print(counter);
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
// 初始化有LED的IO
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
}
void loop() {
Blinker.run();
}
注:上面的例子只展示了應(yīng)用部分,因?yàn)楹芏嗟胤蕉际侵苯诱{(diào)用API,所以我們不容易了解到設(shè)備和服務(wù)器之間到底是怎么實(shí)現(xiàn)通訊的,數(shù)據(jù)的接收和解析是怎樣做的。如果要完整理解這個(gè)過(guò)程可以去看下Blinker的庫(kù),上面這個(gè)代碼用到的API在庫(kù)里面都能看到函數(shù)原形,也能看到里面的數(shù)據(jù)是怎么處理的。不過(guò)這里就不往下講了,內(nèi)容比較多,感興趣的同學(xué)自己去看代碼吧。
6 運(yùn)行測(cè)試
通過(guò)串口打印的log可以看到esp8266的運(yùn)行情況。
大致的過(guò)程是這樣的:?jiǎn)?dòng)之后先是連接wifi,然后通過(guò)HTTP向服務(wù)器獲取連接MQTT所需的一些賬戶信息。然后是通過(guò)MQTT連接上服務(wù)器,至此初始化完成。
如果中途出現(xiàn)什么錯(cuò)誤,可以通過(guò)查看log查找失敗的原因。
打開手機(jī)Blinker APP,可以看到這個(gè)設(shè)備的狀態(tài)是 “在線”
,在手機(jī)APP上點(diǎn)擊 “點(diǎn)我開關(guān)燈”
按鍵,可以看到LED燈的狀態(tài)會(huì)翻轉(zhuǎn),APP和串口也會(huì)輸出相應(yīng)的log。
點(diǎn)擊 “點(diǎn)我計(jì)數(shù)”
按鍵,可以看到APP和串口都會(huì)輸出相應(yīng)的log。
至此,整個(gè)測(cè)試流程就完成了。
上面點(diǎn)燈和按鍵的功能其實(shí)都是自定義的,從APP顯示的log或者M(jìn)CU串口輸出的log都可以看到,所謂的點(diǎn)燈命令和按鍵計(jì)數(shù)都只是發(fā)送了一條json格式的數(shù)據(jù)。比如這個(gè)按鍵功能,就是發(fā)了一條{"num-abc":{"val":1}}數(shù)據(jù),當(dāng)服務(wù)器和MCU都把val當(dāng)成是計(jì)數(shù)次數(shù)的時(shí)候,它的含義就是計(jì)數(shù),而實(shí)際上我們也可以把這個(gè)數(shù)據(jù)改成其他功能或者增添修改更多的命令,只要保證服務(wù)器和MCU雙方的協(xié)議一致即可。
結(jié)束語(yǔ)
好了,關(guān)于如何基于esp8266實(shí)現(xiàn)手機(jī)APP控制LED的編程和使用方法就講到這里,其實(shí)這只是其中一種方式,我們還可以通過(guò)http或者tcp等方式來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)通訊,也不局限于控制LED點(diǎn)燈,我們也可以控制多種燈,或者其他外設(shè)。只要數(shù)據(jù)的傳輸通了,我們就可以自定義很多命令和功能。
時(shí)間關(guān)系我這里就講這么多,后續(xù)有時(shí)間的話我會(huì)考慮再介紹一下其他的方式。
想了解更多Arduino的內(nèi)容,可以關(guān)注一下博主,后續(xù)我還會(huì)繼續(xù)分享更多的經(jīng)驗(yàn)給大家。
還有什么問(wèn)題的話,歡迎在評(píng)論區(qū)留言。如果這篇文章能夠幫到你,就…你懂得。