No Code AI(肉寇)AI自動化兩日精通|實體6小時+線上6小時
|

【Project】如何使用Linkit 7697建立智慧溫度監控平台(上)

   

作者:曹建國

 

物聯網興起之後,聯發科技創意實驗室(MediaTek Labs)專注於物聯網中四個關鍵的技術領域:穿戴式裝置、智慧家居、智慧定位和 M2M。而且聯發科技透過不斷的創新各種系統級晶片(SoCs),以提升處理能力,能應付物聯網中更複雜的情境。尤其在智慧居家技術中,提供安全、省電、客製化及便利等不同的開發晶片,來解決多面向的議題,更提供了安全的 Wi-Fi 通訊能力,並建立安全機制來與網際網路和各種周邊連線的雲端平台串聯。

上一代Linkit Smart 7688/DUO兼具服務端與用戶端的強大功能及易上手的開發環境,目前已是Maker接受度極高的一款開發板。然而,許多Maker在建立物聯網裝置時,更需要體積小、速度快、功能不差的純用戶端開發板,於是,MediaTek Labs再次推出 Linkit 7697 這款開發板,讓Maker能更快開發出符合前述需求的物聯網裝置。

Linkit 7697 開發板 (圖/曹建國)

在智慧家居的物聯網技術中,家庭溫度監控往往是最基礎,也是最關鍵的核心技術,因為以人為中心思想的智慧家居,致力於創造舒適的環境,而舒適與否往往取決於溫度的感受,因此本文要運用Linkit 7697 開發板的Wi-Fi 網路功能來建立網際網路的溫溼度監控網站,讓家庭中所有成員,都可以透過網際網路來獲得快速、正確的溫溼度資訊。

讓Linkit 7697 開發板連上網際網路

所以第一步,我們就是要教大家如何取得MAC資料。首先將Linkit 7697 開發板驅動程式安裝好之後(可參考【Tutorial】LinkIt 7697三種開發環境,輕鬆上手!),我們要打開Linkit 7697 開發板的開發工具:Arduino IDE整合開發軟體,並撰寫一段程式(如下表所示),如此就能透過LinkIt 7697 開發板模組,取得MAC資料。

(程式碼可按此下載)

取得MAC資料測試程式 (CheckMac):

// this program is written by BruceTsao for MTK Link 7697

#include

#include

IPAddress  Meip ,Megateway ,Mesubnet ;

String MacAddress ;

byte mac[6];

int status = WL_IDLE_STATUS;     // the Wifi radio’s status

void setup() {

//Initialize serial and wait for port to open:

Serial.begin(9600);

while (!Serial) {

; // wait for serial port to connect. Needed for native USB port only

}

MacAddress = GetWifiMac() ;

ShowMac() ;

}

void loop() {

}

void ShowMac()

{

Serial.print(“MAC:”);

Serial.print(MacAddress);

Serial.print(“\n”);

}

String GetWifiMac()

{

String tt ;

String t1,t2,t3,t4,t5,t6 ;

WiFi.status();    //this method must be used for get MAC

WiFi.macAddress(mac);

Serial.print(“Mac:”);

Serial.print(mac[0],HEX) ;

Serial.print(“/”);

Serial.print(mac[1],HEX) ;

Serial.print(“/”);

Serial.print(mac[2],HEX) ;

Serial.print(“/”);

Serial.print(mac[3],HEX) ;

Serial.print(“/”);

Serial.print(mac[4],HEX) ;

Serial.print(“/”);

Serial.print(mac[5],HEX) ;

Serial.print(“~”);

t1 = print2HEX((int)mac[0]);

t2 = print2HEX((int)mac[1]);

t3 = print2HEX((int)mac[2]);

t4 = print2HEX((int)mac[3]);

t5 = print2HEX((int)mac[4]);

t6 = print2HEX((int)mac[5]);

tt = (t1+t2+t3+t4+t5+t6) ;

Serial.print(tt);

Serial.print(“\n”);

return tt ;

}

String  print2HEX(int number) {

String ttt ;

if (number >= 0 && number < 16)

{

ttt = String(“0”) + String(number,HEX);

}

else

{

ttt = String(number,HEX);

}

return ttt ;

}

如下圖所示,讀者可以看到本次實驗——取得MAC資料測試程式的結果畫面。

取得MAC資料測試程式結果畫面

透過WiFi模組登連接無線基地台

整合上述程式,我們可以輕易取得MAC資料,下一步我們就要教導讀者如何連到無線基地台(Access Point)。一樣打開Arduino IDE整合開發軟體,撰寫連接無線基地台的測試程式(如下表所示),我們就可以透過LinkIt 7697 開發板,連到無線基地台(Access Point)。

(程式碼可按此下載。)

連接無線基地台測試程式 (ConnectWithWPA)

#include &lt;LWiFi.h&gt;

#include <String.h>

IPAddress  Meip ,Megateway ,Mesubnet ;

String MacAddress ;

byte mac[6];

int status = WL_IDLE_STATUS;     // the Wifi radio’s status

 

char ssid[] = “IOT”;     //  your network SSID (name)

char pass[] = “iot12345”;  // your network password

 

void setup() {

//Initialize serial and wait for port to open:

Serial.begin(9600);

MacAddress = GetWifiMac() ; // get MacAddress

ShowMac() ;       //Show Mac Address

 

initializeWiFi();   // connect Wifi Access Point

ShowInternetStatus();   // Show Internet information from Wifi Setup

}

 

 

void loop() {

}

 

 

void initializeWiFi() {

while (status != WL_CONNECTED) {

Serial.print(“Attempting to connect to SSID: “);

Serial.println(ssid);

// Connect to WPA/WPA2 network. Change this line if using open or WEP network:

status = WiFi.begin(ssid, pass);

//   status = WiFi.begin(ssid);

 

// wait 10 seconds for connection:

delay(2000);

}

Serial.print(“\n Success to connect AP:”) ;

Serial.print(ssid) ;

Serial.print(“\n”) ;

 

}

void printWifiData() {

// print your WiFi shield’s IP address:

IPAddress ip = WiFi.localIP();

Serial.print(“IP Address: “);

Serial.println(ip);

Serial.println(ip);

 

// print your MAC address:

byte mac[6];

WiFi.macAddress(mac);

Serial.print(“MAC address: “);

Serial.print(mac[5], HEX);

Serial.print(“:”);

Serial.print(mac[4], HEX);

Serial.print(“:”);

Serial.print(mac[3], HEX);

Serial.print(“:”);

Serial.print(mac[2], HEX);

Serial.print(“:”);

Serial.print(mac[1], HEX);

Serial.print(“:”);

Serial.println(mac[0], HEX);

 

}

 

void printCurrentNet() {

// print the SSID of the network you’re attached to:

Serial.print(“SSID: “);

Serial.println(WiFi.SSID());

 

// print the MAC address of the router you’re attached to:

byte bssid[6];

WiFi.BSSID(bssid);

Serial.print(“BSSID: “);

Serial.print(bssid[5], HEX);

Serial.print(“:”);

Serial.print(bssid[4], HEX);

Serial.print(“:”);

Serial.print(bssid[3], HEX);

Serial.print(“:”);

Serial.print(bssid[2], HEX);

Serial.print(“:”);

Serial.print(bssid[1], HEX);

Serial.print(“:”);

Serial.println(bssid[0], HEX);

 

// print the received signal strength:

long rssi = WiFi.RSSI();

Serial.print(“signal strength (RSSI):”);

Serial.println(rssi);

 

// print the encryption type:

byte encryption = WiFi.encryptionType();

Serial.print(“Encryption Type:”);

Serial.println(encryption, HEX);

Serial.println();

}

 

void ShowMac()

{

 

Serial.print(“MAC:”);

Serial.print(MacAddress);

Serial.print(“\n”);

 

}

 

 

String GetWifiMac()

{

String tt ;

String t1,t2,t3,t4,t5,t6 ;

WiFi.status();    //this method must be used for get MAC

WiFi.macAddress(mac);

 

Serial.print(“Mac:”);

Serial.print(mac[0],HEX) ;

Serial.print(“/”);

Serial.print(mac[1],HEX) ;

Serial.print(“/”);

Serial.print(mac[2],HEX) ;

Serial.print(“/”);

Serial.print(mac[3],HEX) ;

Serial.print(“/”);

Serial.print(mac[4],HEX) ;

Serial.print(“/”);

Serial.print(mac[5],HEX) ;

Serial.print(“~”);

 

t1 = print2HEX((int)mac[0]);

t2 = print2HEX((int)mac[1]);

t3 = print2HEX((int)mac[2]);

t4 = print2HEX((int)mac[3]);

t5 = print2HEX((int)mac[4]);

t6 = print2HEX((int)mac[5]);

tt = (t1+t2+t3+t4+t5+t6) ;

Serial.print(tt);

Serial.print(“\n”);

 

return tt ;

}

void ShowInternetStatus()

{

 

if (WiFi.status())

{

Meip = WiFi.localIP();

Serial.print(“Get IP is:”);

Serial.print(Meip);

Serial.print(“\n”);

 

}

else

{

Serial.print(“DisConnected:”);

Serial.print(“\n”);

}

 

}

 

// MISC Function

String  print2HEX(int number) {

String ttt ;

if (number >= 0 && number < 16)

{

ttt = String(“0”) + String(number,HEX);

}

else

{

ttt = String(number,HEX);

}

return ttt ;

}

 


如下圖所示,讀者可以看到本次實驗 — 連接無線基地台測試程式結果畫面,可以成功連上無線基地台(Access Point),並透過DHCP伺服器取得網路位址,並能顯示閘道器、網路遮罩等資訊。

連接無線基地台測試程式結果畫面

溫溼度模組電路組立

如下圖所示,這個專案我們需要用到的實驗硬體有下圖(左)LinkIt 7697 開發板、下圖(中) MicroUSB 下載線、下圖(右) 麥克風模組:

(左) LINKIT 7697開發板; (中) MicroUSB 下載線; (右)溫濕度模組

由於Linkit 7697 開發板使用ARM Cortex-M4 MCU微處理機,為了可以跟Arduino IDE開發環境相容,筆者參考了原廠的LinkIt 7697 開發板官網,如下圖所示,我們了解到P0~P13對應到Arduino開發板的數位接腳: D0~D13,所以我們就可以將要接的DHT22溫濕度模組,其資料輸出腳位接到P8(D8),完成電路。

溫溼度監控實驗材料表 (來源/MediaTek Labs)

讀者可以參考下圖所示之溫溼度電路圖和接腳表,進行電路配接。

溫溼度模組電路圖

 

溫溼度模組接腳表

對於溫溼度模組讀取,請者參閱筆者文章《Arduino程式教學(溫溼度模組篇) : Arduino Programming (Temperature& Humidity Modules)》(曹永忠, 許智誠, & 蔡英德, 2016a, 2016b, 2016c, 2016d),有詳細說明如何讀取溫溼度模組的方法與參考程式,這裡就不再詳述。

安裝溫溼度模組函式庫

由於DHT22溫濕度模組之常見到的函式庫,是無法應用到LinkIt 7697 開發板的,所以筆者參考原廠官網LinkIt 7697 Starter Kit,下載「Temperature and Humidity Sensor Pro」的相關函式庫,可按此下載。至於安裝函式庫的方法,可以參考筆者文章《智慧家庭:如何安裝各類感測器的函式庫》(曹永忠, 2016b; 曹永忠 et al., 2016a, 2016c),完成DHT22溫濕度模組的函式庫安裝。

溫濕度模組基本測試

我們打開Arduino IDE整合開發軟體,如下圖所示,開啟Temperature and Humidity Sensor Pro的函式範例。

開啟dht22測試範例

如下表所示之dht22測試範例程式,我們先修改:#define DHTPIN D8,將資料輸出腳位接到P8(D8),再將#define DHTTYPE DHT22,設定為本文使用的DHT22溫濕度模組,請將DHT11/DHT21的程式標示註解,我們先行測試DHTtester程式,就能正確讀取DHT22溫濕度模組。

(程式碼可按此下載。)

dht22測試範例程式 (DHTtester)

// Example testing sketch for various DHT humidity/temperature sensors

// Written by ladyada, public domain

 

#include “DHT.h”

 

#define DHTPIN 8     // what pin we’re connected to

 

// Uncomment whatever type you’re using!

//#define DHTTYPE DHT11   // DHT 11

#define DHTTYPE DHT22   // DHT 22  (AM2302)

//#define DHTTYPE DHT21   // DHT 21 (AM2301)

 

// Connect pin 1 (on the left) of the sensor to +5V

// Connect pin 2 of the sensor to whatever your DHTPIN is

// Connect pin 4 (on the right) of the sensor to GROUND

// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

 

DHT dht(DHTPIN, DHTTYPE);

 

void setup()

{

Serial.begin(9600);

Serial.println(“DHTxx test!”);

 

dht.begin();

}

 

void loop()

{

// Reading temperature or humidity takes about 250 milliseconds!

// Sensor readings may also be up to 2 seconds ‘old’ (its a very slow sensor)

float h = dht.readHumidity();

float t = dht.readTemperature();

 

// check if returns are valid, if they are NaN (not a number) then something went wrong!

if (isnan(t) || isnan(h))

{

Serial.println(“Failed to read from DHT”);

}

else

{

Serial.print(“Humidity: “);

Serial.print(h);

Serial.print(” %\t”);

Serial.print(“Temperature: “);

Serial.print(t);

Serial.println(” *C”);

}

}

如下圖所示,讀者可以看到本次實驗-dht22測試範例程式結果畫面,可以成功讀取溫溼度模組的溫溼度資訊。

dht22測試範例程式結果畫面

小結

本篇是《如何使用LinkIt 7697建立智慧溫度監控平台》上篇,主要告訴讀者,在物聯網開發之中,如何使用Linkit 7697開發板來建立物聯網溫溼度感測裝置。

在下篇之中,我們將揭露如何使用這樣的開發裝置,建立一個網際網路的溫溼度監控網站,讓家庭中所有成員都可以透過網際網路來獲得快速、正確的溫溼度資訊。後續還會繼續各種物聯網裝置開發與平台的教學文章,希望與大家一起創造出更優質、更具未來性的物聯網產品開發相關技術。

(責任編輯:賴芳如)

◎加入我們的Line,獲得更多及時文章更新&活動資訊→

加入好友

曹永忠

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author: 曹永忠

國立中央大學資訊管理學系博士,目前在國立暨南國際大學電機工程學系兼任助理教授、國立高雄科技大學商務資訊應用系兼任助理教授自由作家,專注於軟體工程、軟體開發與設計、物件導向程式設計、物聯網系統開發、Arduino開發、嵌入式系統開發。長期投入資訊系統設計與開發、企業應用系統開發、軟體工程、物聯網系統開發、軟硬體技術整合等領域,並持續發表作品及相關專業著作,並通過台灣圖霸的專家認證。

Share This Post On
468 ad

2 Comments

  1. 請問LWiFi.h 是放在哪個資料夾,或者要去哪下載?

    Post a Reply
    • 您好,我們是MakerPRO編輯部,感謝您的提問,這是技術問題的部分,我們再請作者來回答噢:)

      Post a Reply

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *