愛招飛幫助手冊 愛招飛幫助手冊
  • FastERP-1
  • Smart
  • PinToo
  • FastWeb
  • FastERP-2 企業管理系統 (opens new window)
  • 印染業ERP (opens new window)
  • 工廠終端機 (opens new window)
  • TARS
  • MARS
  • TaskRunner
  • Flying
  • FastDesk
  • HiDesk
  • HiNAT
  • FastBPM
  • 設備故障診斷 (opens new window)
  • 設備最佳運轉效益 (opens new window)
  • 企業智能助手SmeGPT (opens new window)
  • 燈號管理 (opens new window)
  • 戰情室 (opens new window)
  • 能源管理 (opens new window)
  • 人車定位 (opens new window)
  • 戰情指揮系統 (opens new window)
  • FastERP-1
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
  • FastERP-1
  • Smart
  • PinToo
  • FastWeb
  • FastERP-2 企業管理系統 (opens new window)
  • 印染業ERP (opens new window)
  • 工廠終端機 (opens new window)
  • TARS
  • MARS
  • TaskRunner
  • Flying
  • FastDesk
  • HiDesk
  • HiNAT
  • FastBPM
  • 設備故障診斷 (opens new window)
  • 設備最佳運轉效益 (opens new window)
  • 企業智能助手SmeGPT (opens new window)
  • 燈號管理 (opens new window)
  • 戰情室 (opens new window)
  • 能源管理 (opens new window)
  • 人車定位 (opens new window)
  • 戰情指揮系統 (opens new window)
  • FastERP-1
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
  • Smart幫助主頁
  • 學習手冊

  • 開發手冊

    • 通訊協議

      • 通訊埠

      • 藍芽Bluetooth

      • 無線網WIFI

      • ModbusRTU

      • ModbusTCP

      • OPC

      • MQTT

        • MQTT控制元件使用
        • MQTT控制LED燈
          • 1. 說明
          • 2. 零件連線圖
          • 3. 使用零件
          • 4. Arduino流程圖
          • 5. Arduino程式
          • 6. 設計明細
          • 7. 程式設計
            • 7.1. 程式初始化設定
            • 7.2. 事件設定
          • 8. 運行結果
        • MQTT讀取溫濕度
      • RestAPI

      • HTTP

    • 互動輸出

    • 媒體存取

    • 人工智慧

    • 實體運用

目录

MQTT控制LED燈

# Smart之MQTT控制LED燈

# 1. 說明

  範例採用MQTT通訊協議,控制駁接在Arduino上的LED燈。MQTT是由IBM開發的通訊協議,為感測器提供一個輕量可靠的二進制通訊設定,使得開發MQTT與物聯網,機器之間的通訊變得非常簡單。

  TARS中也提供了MQTT服務,使用TARS中的該服務可以實現設備之間的相互連線。範例中的LED燈連正極(長腳)處連線電阻再連線到Ethernet W5100擴充套件板的D8針腳,LED燈負極連線到擴充套件板的GND針腳,以下介紹如何利用MQTT通訊協議,達到控制的目的。

  通過範例學習,可以掌握MQTTClient控制元件的基本使用,並結合arduino開發板通過MQTT進行LED的控制功能。

# 2. 零件連線圖

# 3. 使用零件

序 零件名稱 數量
1 Arduino UNO R3 開發板 1
2 Arduino Ethernet W5100 網路擴充套件板 1
3 USB數據線 1
4 麵包板 1
5 杜邦線 若干
6 LED燈 1
7 220歐姆電阻 1
8 網線 1

# 4. Arduino流程圖

# 5. Arduino程式

  使用Arduino IDE 編譯並上傳以下Arduino程式。

// pubsubclient MQTT 程式庫  https://github.com/knolleary/pubsubclient
 
#include <SPI.h>
#include <Ethernet.h>
// MQTT 宣告 ========================================================
#include <PubSubClient.h>
EthernetClient ethClient;
PubSubClient client(ethClient);
 
#define LED_PIN 8                                         //定義LED針腳為8
#define STRING_LEN 128
 
// 設定網路IP地址 (網路擴充套件卡的 MAC 可自行修改 +1 以避免衝突)
byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x94, 0xB7 };     
IPAddress ip(192, 168, 0, 163);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
 
void setup() {
   Serial.begin(9600);
   Ethernet.begin(mac, ip, gateway, subnet);               // 啟動網路
   Serial.println("網路已啟動"); 
  //設置 MQTT ========================================================
  client.setServer("192.168.0.176", 1883);                 // 連線MQTT Broker
  client.setCallback(callback);                            // 設定從 MQTT Broker讀取主題之後,運行子程式。
  if (client.connected()) {                                // 如果已經連線 MQTT Broker
    client.subscribe("#");                                 // 自動接收來自 192.168.1.13 MQTT Broker 所有主題資訊
  }
   delay(1500);
   pinMode(LED_PIN, OUTPUT);                               //設定針腳8為輸出模式
}
 
void loop() {
  // MQTT 開始運行接收主題
  if (!client.connected()) {                               // 如果MQTT Broker不通,將重新連線
     reconnect();
  }
  client.loop();
 }
 
// 接收MQTT主題后呼叫運行程式
void callback(char* topic, byte* payload, unsigned int length) {
  String mapre01;                                       // 預定接收的主題1     /LED
  String mapres;                                        // 實際從 MQTT Broker 接收到的主題
  String information;                                   // 實際從 MQTT Broker 接收到的主題內容
  String LEDOpen="1"; 
  //將 char[] 轉為 String charToStringL(需轉換的 Char陣列, 轉換后的 String)
 
  mapre01 = "LED";                                      //LED 的主題 
  charToStringL(topic, mapres);                         //實際從 MQTT Broker 接收到的主題
  for (int i = 0; i < length; i++) {                    //轉換 MQTT Broker 接收到的主題內容為字串
    information = information + (char)payload[i];
  }
  if (mapres != mappu01) {                              // 不顯示發佈的主題
     Serial.print("接收訊息 " + mapres + " [");
     Serial.print(information);
     Serial.print("] ");
  }
 
  if (mapres == mapre01) {
    if (information == LEDOpen) {                
      Serial.println("打開 LED");
      digitalWrite(LED_PIN, HIGH);                      //PIN 8輸出高電平,LED點亮
    }
    else {
      Serial.println("關閉 LED");
      digitalWrite(LED_PIN, LOW);                       //PIN 8輸出低電平,LED熄滅
    }
  }
  delay(500);                                           //延時500ms
  Serial.println();
}
 
void reconnect() {
  // 一直循環直到連線上 MQTT Broker
  while (!client.connected()) {
    Serial.print("正在連線 MQTT Broker...");
    if (client.connect("arduinoClient")) {
      Serial.println("MQTT Broker 已經連線上");
      client.subscribe("#");
    } else {
      Serial.print("連線失敗, rc=");
      Serial.print(client.state());
      Serial.println("五秒之後再進行連線");
      delay(5000);
    }
  }
}
 
//將 char[] 轉為 String 自定函式
void charToStringL(const char S[], String & D)
{
  byte at = 0;
  const char *p = S;
  D = "";
 
  while (*p++) {
    D.concat(S[at++]);
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

# 6. 設計明細

  開啟Smart智慧控制平臺,分別加入下插圖之控制元件。或者通過點選功能表欄[檔案]-[打開專案]選擇範例專案檔案來打開該範例。

MQTT控制LED燈 UI佈局

  ①:TLabel元件,控制元件名稱為Label1。

  ②:TImage元件,控制元件名稱為Image1。

  ③:TImage元件,控制元件名稱為Image4。

  ④:TMQTTClient元件,控制元件名稱為MQTTClientLED。

  ⑤:TImage元件,控制元件名稱為Image3。

  ⑥:TImage元件,控制元件名稱為Image2。

  ⑦:TMemo元件,控制元件名稱為MemoMsg。

  ⑧:TImage元件,控制元件名稱為Image5。

  • Main窗體屬性設定

    • ClientHeight:窗體客戶區高度=624。
    • ClientWidth:窗體客戶區寬度=918。
  • ①Label1屬性設定

    • AutoSize:是否根據字型調整控制元件大小,設定為True。
    • Caption:標籤內容,設定為ModbusRTU之LED智能照明。
  • ②Image1屬性設定

    • Align:設定控制元件佔滿=alClient。
    • Stretch:設定圖片是否按照控制元件大小拉伸=Yes。
    • Picture:設定圖片(背景)。點選Picture屬性右側的[...]按鈕,打開檔案上傳界面,點選[Load...]從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]載入圖片。
  • ③Image4屬性設定

    • Height:設定控制元件高度=109。
    • Width:設定控制元件寬度=109。
    • Picture:設定圖片(背景)。點選Picture屬性右側的[...]按鈕,打開檔案上傳界面,點選[Load...]從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]載入圖片。
  • ④MQTTClientLED屬性設定

    • BrokerHostName:MQTT中介軟體所在設備的IP地址,例如192.168.1.162。
    • BrokerPort:MQTT中介軟體所使用的埠,預設為1883。
    • Name:控制元件名稱,設定為MQTTClientLED。
    • Topic:MQTT的訂閱主題,此處設定為LED。
  • ⑤Image3屬性設定

    • Height:設定控制元件高度=367。
    • Width:設定控制元件寬度=909。
    • Picture:設定圖片(燈亮)。點選Picture屬性右側的[...]按鈕,打開檔案上傳界面,點選[Load...]從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]載入圖片。
  • ⑥Image2屬性設定

    • Height:設定控制元件高度=366。
    • Width:設定控制元件寬度=909。
    • Picture:設定圖片(燈滅)。點選Picture屬性右側的[...]按鈕,打開檔案上傳界面,點選[Load...]從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]載入圖片。
  • ⑦MemoMsg屬性設定

    • Height:控制元件高度=236。
    • Width:控制元件寬度=317。
    • Name:控制元件名稱,設定為MemoMsg。
  • ⑧Image5屬性設定

    • Height:控制元件高度=64。
    • Width:控制元件寬度=64。
    • Picture:設定圖片。點選Picture屬性右側的[...]按鈕,打開檔案上傳界面,點選[Load...]從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]載入圖片。

# 7. 程式設計

# 7.1. 程式初始化設定

  在程式運行時,啟動與MQTT Broker的連線。

constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  //啟動MQTT連線
  FThis.MQTTClientLED.Enabled := True;
end;
1
2
3
4
5
6

# 7.2. 事件設定

  • ③Image4-OnClick事件

  點選Image4時,根據程式中的LED燈顯示狀態,向MQTT Broker發送開關的指令。

procedure TMyHandler.Image4Click;
begin
   if FThis.Image3.Visible then
   begin
     //關燈
     FThis.MQTTClientLED.PublishStr('LED','0');
     FThis.Image3.Visible := False;
   end
   else
   begin
     //開燈
     FThis.MQTTClientLED.PublishStr('LED','1');
     FThis.Image3.Visible := True;
   end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  • ⑧Image5-OnClick事件

  點選Image5時,切換MemoMsg(日誌)的顯示狀態。

procedure TMyHandler.Image5Click;
//開啟關閉日誌
begin
  FThis.MemoMsg.Visible := not FThis.MemoMsg.Visible;
end;
1
2
3
4
5
  • ④MQTTClientLED-OnPublishReceived事件

MQTTClientLED接收到訊息時將內容顯示在MemoMsg中。

//MQTTClientLED 控制元件 OnPublishReceived事件(發佈收到的內容)
procedure TMyHandler.MQTTClientLEDPublishReceived;
begin
  if APayload='1' Then
    FThis.MemoMsg.Lines.Add(ATopic+'->開')
  else
    FThis.MemoMsg.Lines.Add(ATopic+'->關');
end;
1
2
3
4
5
6
7
8

# 8. 運行結果

  通過工具欄儲存,將程式儲存為 sdb 專案檔案。

專案儲存

  使用滑鼠點選工具欄運行(Run),測試運行結果。當點選右側開關按鈕影象時,如果底下照明燈顯示為熄滅的狀態,則會更新狀態為點亮,同時連線到NodeMCU的LED燈也會點亮;如果照明燈顯示為點亮的狀態,則會更新狀態為熄滅,同時連線到NodeMCU的LED燈會熄滅。

MQTT控制LED燈 運行結果
MQTT控制元件使用
MQTT讀取溫濕度

← MQTT控制元件使用 MQTT讀取溫濕度→

Copyright © 2021-2025 愛招飛IsoFace | ALL Rights Reserved
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式