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