加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 1 工作原理
    • 2 硬件準備
    • 3 軟件準備
    • 4 Blinker APP注冊
    • 5 Arduino代碼編寫
    • 6 運行測試
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

Arduino應(yīng)用開發(fā)——手機APP控制LED

09/30 10:15
2598
閱讀需 14 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

物聯(lián)網(wǎng)是最近幾年比較火的一個話題,什么是物聯(lián)網(wǎng)?

物聯(lián)網(wǎng)(Internet of Things,簡稱IoT)是指通過各種信息傳感器射頻識別技術(shù)、全球定位系統(tǒng)、紅外感應(yīng)器、激光掃描器等各種裝置與技術(shù),實時采集任何需要監(jiān)控、 連接、互動的物體或過程,采集其聲、光、熱、電、力學(xué)、化學(xué)、生物、位置等各種需要的信息,通過各類可能的網(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這一個話題都可以寫好多文章了,想深入了解的同學(xué)可以自行查閱資料。

當(dāng)MQTT連成功之后,MCU會一直偵聽,等待服務(wù)器下發(fā)數(shù)據(jù)。這個時候我們可以通過手機app操作,比如點一下開燈,服務(wù)器收到這個開燈命令后會通過MQTT發(fā)送命令到MCU,MCU接收到數(shù)據(jù)并解析命令后執(zhí)行點燈的操作。服務(wù)器在這里相當(dāng)于一個中轉(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 當(dāng)前最新版本,以后可能會有更新
Blinker APP 2.5.2(安卓版) 當(dāng)前最新版本,以后可能會有更新

3.1 Arduino IDE環(huán)境搭建

Arduino開發(fā)板庫安裝

esp8266和esp32開發(fā)板環(huán)境搭建具體就不說了,不懂的同學(xué)可以看下我之前發(fā)布的博客。

esp8266開發(fā)入門教程(基于Arduino)——環(huán)境安裝

ESP32 Arduino開發(fā)環(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è)備”

請?zhí)砑訄D片描述

然后選擇接入方式,我們這里選 “網(wǎng)絡(luò)接入”。

在這里插入圖片描述

服務(wù)器我們這里選 “點燈科技”,直接用Blinker的服務(wù)器。

在這里插入圖片描述

然后我們就得到了一個設(shè)備密鑰(Secret Key),這個密鑰要在后面寫到我們的應(yīng)用代碼里面的,這里可以先不管,返回設(shè)備列表,在設(shè)備的詳細信息里面也可以看到設(shè)備密鑰。

在這里插入圖片描述

打開我們新建的設(shè)備,這個設(shè)備的控制界面是可以自定義的,按鍵和窗口這些都可以自己調(diào)整,我這里只是為了測試圖方便就直接導(dǎo)入一個現(xiàn)成的示例。

在這里插入圖片描述
請?zhí)砑訄D片描述

在設(shè)備的詳細信息里面可以修改設(shè)備的名稱,也可以看到設(shè)備密鑰,這個密鑰在后面寫代碼的時候要用到。

請?zhí)砑訄D片描述

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)容比較多,感興趣的同學(xué)自己去看代碼吧。

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。

請?zhí)砑訄D片描述
在這里插入圖片描述

點擊 “點我計數(shù)” 按鍵,可以看到APP和串口都會輸出相應(yīng)的log。

請?zhí)砑訄D片描述
在這里插入圖片描述

至此,整個測試流程就完成了。

上面點燈和按鍵的功能其實都是自定義的,從APP顯示的log或者MCU串口輸出的log都可以看到,所謂的點燈命令和按鍵計數(shù)都只是發(fā)送了一條json格式的數(shù)據(jù)。比如這個按鍵功能,就是發(fā)了一條{"num-abc":{"val":1}}數(shù)據(jù),當(dāng)服務(wù)器和MCU都把val當(dāng)成是計數(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ū)留言。如果這篇文章能夠幫到你,就…你懂得。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜