物聯網?快來看 Arduino 上雲啦

削微寒發表於2022-06-24

作者:HelloGitHub-Anthony

這裡是 HelloGitHub 推出的講解開源硬體開發平臺 Arduino 的系列教程。

上一篇文章,我們介紹瞭如何安裝 Arduino 支援庫、DHT 11 溫溼度感測器以及 OLED 螢幕的使用,並用 Arduino 製作了一個小型溫溼度顯示器。

在這個講究萬物互聯的時代,讓我們們的 Arduino 溫溼度也去“雲上”玩玩,有個學名叫物聯網。

物聯網(IoT) 是由物理物件組成的網路,這些物理物件嵌入了感測器、軟體和其他技術,以便可以通過網際網路與其他裝置和系統建立連線並交換資料。

是不是瞬間感覺高大上了一些,但是不用擔心本期的知識超綱,因為高深的我也不會!

今天我們講解:如何把上一期做的溫溼度裝置上雲,通過物聯網平臺完成實時資料上傳遠端控制裝置。實現將 Arduino 裝置測量的溫溼度資料上傳到物聯網平臺,然後接收平臺傳送指令控制裝置上 LED 燈光開關。

你是否已經開始摩拳擦掌了呢?下面我們開始“上雲”!

一、實現聯網功能

1.1 模組介紹

首先,如果想要 Arduino 連線到物聯網平臺的伺服器,必然需要先讓裝置能夠連線到網路(比如家裡的 WiFi),這裡我們就需要用到 ESP-01(s) 模組,來實現這個功能。

其使用方法和前文介紹過的元件類似,只需要用到 VCC(3.3v)、GND、TX、RX 四根線,就能和 Arduino 進行通訊。我這裡使用的是 ESP-01+轉接板,轉接板實現了 5v->3.3v 的變壓以及 RxTx 介面的引出,方便後續使用。

大多數 ESP-01(s) 模組在出廠時,都已經內建了 AT 指令韌體,在使用時只需要向模組傳送 AT 指令即可進行網路連線、資料傳輸等操作。

關於什麼是 AT 指令,簡單來講就是裝置間一種通訊訊息規範,更具體的定義和應用場景讀者可以自行了解。

1.2 模組使用

ESP-01 模組接線方式如下:

  • GND -> GND
  • VCC -> 3.3v(單獨模組) 5.5v(帶轉接板)
  • Tx -> Rx
  • Rx -> TX

用到的 AT 指令如下:

  • AT+RST:重置模組
  • AT+CWMODE=1:切換模式
  • AT+CWQAP:斷開 WiFi 連線
  • AT+CWJAP="WiFi名","密碼":連線 WiFi
  • AT+CIPSTART="TCP","IP",埠:連線伺服器
  • AT+CIPMODE=1:切換到 TCP 透傳模式
  • AT+CIPSEND:開始傳送資料

1.3 程式碼

Arduino 連線 WiFi 的程式碼:

#include <Arduino.h>

boolean at_exec(char *data, char *keyword, unsigned long time_out)
{
  Serial.println(data);
  Serial.flush();
  delay(100); // 等待響應
  unsigned long start = millis();

  while (Serial.available() < strlen(keyword))
  {
    if (millis() - start > time_out)
      return false;
  }
  if (Serial.find(keyword))
    return true;
  else
    return false;

  while (Serial.available())
    Serial.read(); //清空串列埠快取
}

void setup()
{
  Serial.begin(115200);
  while (!at_exec("AT+RST", "OK", 1000));
  while (!at_exec("AT+CWMODE=1", "OK", 1000));
  while (!at_exec("AT+CWQAP", "OK", 1000));
  while (!at_exec("AT+CWJAP=\"HelloGithub\",\"PassWord\"", "WIFI CONNECTED", 2000));
  while (!at_exec("AT+CIPSTART=\"TCP\",\"183.230.40.40\",1811", "CONNECT", 1000));
  while (!at_exec("AT+CIPMODE=1", "OK", 500));
  while (!at_exec("AT+CIPSEND", "OK", 500));
  //Serial.println("*產品ID#鑑權資訊#指令碼名稱*"); // 下文會將如何獲取這部分資訊
}

注意:

  • 下載之前要斷開 Arduino 和 ESP-01 的連線,否則可能會下載失敗
  • 執行 AT+CIPSEND 後,模組將不再響應 AT 指令,如果需要修改配置則必須斷電重啟模組
  • 記得改 AT+CWJAP 的引數,對應 WiFi 使用者名稱和密碼

燒錄後,連線模組重啟 Arduino。如果在路由器管理介面的“已連線裝置”頁面,看到我們的 WiFi 裝置,則表示成功!

二、物聯網平臺

這裡我們使用的是 OneNet 物聯網平臺,它是由中國移動打造的物聯網 PaaS 開放平臺,通過這個平臺可以輕鬆(免費)實現裝置”上雲“。

下面,將介紹從註冊開始到完成裝置上雲,所需的所有云端配置步驟。

2.1 註冊

開啟 OneNet 官網,點選右上角的“註冊”註冊賬號。

2.2 新建產品

完成註冊登入賬號後,點選右上角的“控制檯”進入控制頁面。

進入後點選 “全部產品服務”->“多協議接入”:

在“多協議接入介面”選擇 TCP 透傳->新增產品:

在彈出的側邊欄填寫相關資訊,“產品行業”和“類別”隨便填寫即可,最後點選“確定”完成新建產品。

2.3 新增裝置

找到剛剛建立的產品我的是 “HelloGitHub”,然後點選左側欄的“裝置列表”,在新出現的頁面中點選“新增裝置”,填寫完相關資訊最後點選“新增”,完成增添裝置的操作。

2.4 編寫資料解析指令碼

接下來,我們配置雲端的資料解析指令碼,不用自己動手寫直接下載官方指令碼到本地改一改就能用。

在解壓下載好的資料夾中,找到 sample.lua 檔案裡的 device_timer_init 函式(第 303 行),改成如下內容:

function device_timer_init(dev)
    -- 定時傳送開關燈指令 --
	dev:timeout(0)
	dev:add(10,"open","open")
	dev:add(12,"close","close")
end

找到 device_data_analyze 函式(在檔案的最後),修改為如下內容:

function device_data_analyze(dev)
	local t={}
	local a=0
	local s = dev:size()
    -- 我們定義 一次傳送 十個 位元組,分別為 溫度 溼度 --
	add_val(t,"Temperature",a,dev:bytes(1,5))
	add_val(t,"Humidity",a,dev:bytes(6,5))
	dev:response()
	dev:send("received")
	return s,to_json(t)
end

如果大家對指令碼使用方法感興趣的話,可以檢視程式碼的註釋和官網上接入文件,這裡就不做過多講解了。

2.5 上傳指令碼

將該檔案儲存後,回到剛剛開啟過的“裝置列表”點選“上傳解析指令碼”。

至此,雲端配置完畢。

2.6 連線物聯網平臺

修改 1.3 的程式碼,將 “下文會將如何獲取這部分資訊” 這行程式碼改成:

Serial.println("*產品ID#ILoveHelloGitHub#HG*");

將雲端配置完成後,獲得的產品 ID鑑權資訊指令碼名稱等引數,替換到對應位置。(*產品ID#鑑權資訊#指令碼名稱*

最後,重新燒錄程式碼並重啟 ESP-01 模組。稍等片刻,在雲端重新整理“裝置列表”頁面,看到我們的裝置,證明裝置成功連線上了物聯網平臺。

三、Arduino 上雲

經過前面的鋪墊,我們“上雲”的旅程即將迎來最激動人心的部分。將裝置所在環境的溫溼度資料上傳到雲端!

3.1 程式碼

既然是上傳溫溼度資料,就需要用到我們上期講的 DHT11 模組(溫溼度感測器),然後結合本期連線網路的程式碼,分分鐘就可以完成啦。

但是為了增加專案的趣味性,我額外新增了個解析物聯網平臺傳送命令,遠端控制開關 LED 的函式。

程式碼片段如下:

void setup()
{
  // 改成自己雲端的引數
  Serial.println("*產品ID#ILoveHelloGitHub#HG*");
}

// 根據從串列埠收到的 字串 執行相應的指令
bool command_parse(String command){
  ...
  if (command == "open")
  {
    digitalWrite(LED_BUILTIN, HIGH);
  } else if (command == "close")
  {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

完整程式碼:https://github.com/HelloGitHub-Team/Article/blob/master/contents/Other/Arduino/3/code.cpp

最後,修改完整程式碼中的 WiFi 名和密碼,以及 產品 ID 後,重新燒錄程式碼即可。

3.2 上傳溫溼度資料

稍等片刻後,檢視物聯網平臺的“裝置資訊”,如果看到 Arduino 上傳的室內溫溼度資訊,就證明我們的程式碼執行成功啦。

3.3 遠端控制

下面演示如何通過物聯網平臺,遠端控制燈的開關。

開啟物聯網平臺,點選“裝置介面”的“下發指令”,在彈出的表單上選擇“字串”選項,輸入 “open” 或 “close” 指令。

到這裡,就完成了遠端控制 Arduino 內建 LED 燈開/關的效果!

成功!撒花?

四、總結

這篇文章,結合 Arduino、感測器、WiFi 以及 OneNet 物聯網平臺,通過邊做邊講的方式,講述了一個裝置從聯網到上雲的完整過程。雖然是入門級的教程,但是這些知識已經可以幫助你完成,諸如智慧開關、自動餵食器等實用和有趣的專案。

不小看每一次小的進步,不積跬步無以至千里。

如果說移動網際網路的浪潮已經過去,那麼下一個浪潮中會不會有物聯網的影子呢?反正我覺得技多不壓身,對此你怎麼看?歡迎在評論區發表你的看法。


至此,整個 Arduino 系列教程,到這裡就結束了。完結!再次撒花?

希望,HelloGitHub 的 Arduino 系列教程,能夠勾起你對物聯網的興趣,畢竟興趣才是最好的好老師。

本期的內容就是這些,這裡是 HelloGitHub 分享 GitHub 上有趣、入門級的開源專案。

感謝您的閱讀,如果覺得內容還不錯,一定要記得點贊、留言、分享,我們下期見!

相關文章