在家居生活中,亮度是保護我們眼睛最重要的靈藥,如果亮度不足,不但沒有安全感,對視力的保健更是一大殺手。我們如果在家裡看到這樣的情形,當然可以馬上調整光線,但是如果我們在外面上班,就不太容易查覺到這個隱藏的問題。

如果我們能夠用創客神器 Arduino 來照顧我們的眼睛,透過手機上網,直接使用瀏覽器監控我們家的亮度,那該有多好?所以本月我們要使用 Arduiono,透過簡單的上網擴充卡,和網際網路中頂尖的物聯網平台:ThingSpeak 網站。

ThingSpeak 網站

ThingSpeak 網站是一個專業的物聯網網站,讀者可以利用這個網站先行開發。(若讀者有不懂之處,可以參考網路資源網站文章)該網站提供許多免費的資源,瞬間就讓我們的家庭進化成先進的智慧家庭。所以本篇要告訴讀者,如何簡單、快速、有效的建立一個居家亮度監控的物聯網。

建立帳號

讀者先到 ThingSpeak 網站建立帳號,進入網站後到主頁,先點選下圖"Sign Up”,建立一個帳號(有帳號的讀者可以跳過本節)。

image

ThinkSpeak網站主頁。

讀者依照下圖所示,將資料輸入完畢後,創建一個可以用的帳號。

image

ThinkSpeak 網站創建帳號。

帳號登入

讀者先到 ThingSpeak 網站,進入網站後到主頁,先點選 ”Sign In”,使用您的帳號登入。

image

登錄 ThinkSpeak 網站。

查看 Channel 資料

讀者先登入 ThingSpeak 網站後,依下圖紅框處,先行查看目前的 Channel。

image

查看自己的 channel。

創建新 Channel

進入網站後,選擇 Channel 區,由下圖紅框區所示,沒有任何東西,代表讀者需要先行創建新的 Channel。

image

未創見任何 channel。

如果讀者由下圖紅框區所示,點選 New Channel 選單來創建新的 Channel。

image

創建新 Channel 選單。
下圖為創建新的 Channel 資訊的簡單介紹畫面。

image

創建新 Channel 畫面。
讀者可以參考下圖紅框區,將必要的資訊填入。

image

創建新 Channel 畫面(範例)。
讀者輸入資料後,將畫面捲軸拉至下方後,參考下圖紅框處,選 Save Channel 的選單,將此 Channel 存檔。

image

儲存新 Channel。
由下圖所示,完成 Channel 創建後,可以看到這個 Channel 的畫面。

image

Channel 完成後的畫面。

取得 Channel 寫入金鑰

進入網站建立一個新的 Channel 之後,先點選下圖紅框區,查看 Channel 的 API Key 的資料。

image

查看 Channel 的 API Key 的資料。
由下圖紅框區處,可以看到本 Channel 寫入金鑰,本書範例是『UR42ZTYTE4PBQ8Y2 』。

image

取得 Channel 寫入金鑰。

實做亮度監控之物聯網

首先,組立 W5100 以太網路模組是非常容易的一件事,如下圖所示,只要將 W5100 以太網路模組堆疊到任何 Arduino 開發板之上就可以了。

image

將 Arduino 開發板與 W5100 以太網路模組堆疊組立。

之後,再將組立好的 W5100 以太網路模組(如下圖所示),只要將 USB 線插入 Arduino 開發板,再將 RJ 45 的網路線一端插入 W5100 以太網路模組,另一端則插入可以上網的集線器(Switch HUB)的任何一個區域網接口(Lan Port)就可以了。

image

接上電源與網路線的 W5100 以太網路模組堆疊卡。

為了取得亮度的值,作者使用 BH1750FVI 亮度模組來偵測亮度,讀者可依照下表之 BH1750FVI 亮度模組接腳表,將 BH1750FVI 亮度模組接在 W5100 以太網路模組堆疊卡之上。

BH1750FVI 亮度模組接腳表:

接腳 接腳說明 Arduino開發板接腳
S Vcc 電源 (+5V) Arduino +5V
2 GND Arduino GND
3 SDA Arduino Analog Pin 4(UNO)
   SCL Arduino Analog Pin 5(UNO)

image

我們遵照前幾章所述,將 Arduino 開發板的驅動程式安裝好之後,打開 Arduino 開發板的開發工具:Sketch IDE 整合開發軟體,攥寫一段程式,如下表所示之 ThingSpeak 之亮度監控程式,我們就可以讓 W5100 以太網路模組堆疊卡變成一台簡易的物聯網之亮度監控伺服器來運作了。

ThingSpeak 之亮度監控程式(範例原始碼網址):

Arduino_to_ThingSpeak (Arduino_to_ThingSpeak)

/*
https://github.com/iobridge/ThingSpeak-Arduino-Examples/blob/master/Ethernet/Arduino_to_ThingSpeak.ino
 Arduino --> ThingSpeak Channel via Ethernet
 
 The ThingSpeak Client sketch is designed for the Arduino and Ethernet.
 This sketch updates a channel feed with an analog input reading via the
 ThingSpeak API (https://thingspeak.com/docs)
 using HTTP POST. The Arduino uses DHCP and DNS for a simpler network setup.
 The sketch also includes a Watchdog / Reset function to make sure the
 Arduino stays connected and/or regains connectivity after a network outage.
 Use the Serial Monitor on the Arduino IDE to see verbose network feedback
 and ThingSpeak connectivity status.
 
 Getting Started with ThingSpeak:
 
   * Sign Up for New User Account - https://thingspeak.com/users/new
   * Create a new Channel by selecting Channels and then Create New Channel
   * Enter the Write API Key in this sketch under "ThingSpeak Settings"
 
 Arduino Requirements:
 
   * Arduino with Ethernet Shield or Arduino Ethernet
   * Arduino 1.0+ IDE
   
  Network Requirements:
   * Ethernet port on Router    
   * DHCP enabled on Router
   * Unique MAC Address for Arduino
 
 Created: October 17, 2011 by Hans Scharler (http://www.nothans.com)
 
 Additional Credits:
 Example sketches from Arduino team, Ethernet by Adrian McEwen
 
*/

#include 
#include 
#include 
#include 


// Local Network Settings
byte mac[] = {
  0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF
};
IPAddress ip(192, 168, 30, 200);
IPAddress dnServer(168, 95, 1, 1);
// the router's gateway address:
IPAddress gateway(192, 168, 30, 254);
// the subnet:
IPAddress subnet(255, 255, 255, 0);

// ThingSpeak Settings
byte server[]  = { 184, 106, 153, 149 }; // IP Address for the ThingSpeak API
String writeAPIKey = "UR42ZTYTE4PBQ8Y2 ";    // Write API Key for a ThingSpeak Channel
const int updateInterval = 30000;        // Time interval in milliseconds to update ThingSpeak   
EthernetClient client ;


// Variable Setup
long lastConnectionTime = 0; 
boolean lastConnected = false;
int resetCounter = 0;

// Initialize Arduino Ethernet Client
BH1750 lightMeter;

void updateThingSpeak(String tsData)
{
  if (client.connect(server, 80))
  { 
    Serial.println("Connected to ThingSpeak...");
    Serial.println();
        
    client.print("POST /update HTTP/1.1n");
    client.print("Host: api.thingspeak.comn");
    client.print("Connection: closen");
    client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"n");
    client.print("Content-Type: application/x-www-form-urlencodedn");
    client.print("Content-Length: ");
    client.print(tsData.length());
    client.print("nn");

    client.print(tsData);
    
    lastConnectionTime = millis();
    
    resetCounter = 0;
    
  }
  else
  {
    Serial.println("Connection Failed.");   
    Serial.println();
    
    resetCounter++;
    
    if (resetCounter >=5 ) {resetEthernetShield();}

    lastConnectionTime = millis(); 
  }
}

void resetEthernetShield()
{
  Serial.println("Resetting Ethernet Shield.");   
  Serial.println();
  
  client.stop();
  delay(1000);
  
  Ethernet.begin(mac, ip, gateway, subnet);
  delay(1000);
}


void setup()
{
  // Start Serial for debugging on the Serial Monitor
  Serial.begin(9600);
    lightMeter.begin();
  // Start Ethernet on Arduino
    // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    // try to congifure using IP address instead of DHCP:
      Ethernet.begin(mac, ip, dnServer, gateway, subnet);

  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");
  
}


//String analogValue0 = String(lightMeter.readLightLevel(), DEC);
void loop()
{
  String analogPin0 = String(analogRead(A0), DEC);
  
  // Print Update Response to Serial Monitor
  if (client.available())
  {
    char c = client.read();
    Serial.print(c);
  }
  
  // Disconnect from ThingSpeak
  if (!client.connected() && lastConnected)
  {
    Serial.println();
    Serial.println("...disconnected.");
    Serial.println();
    
    client.stop();
  }
  
  // Update ThingSpeak
  if(!client.connected() && (millis() - lastConnectionTime > updateInterval))
  {
    updateThingSpeak("field1="+analogPin0);
  }
  
  lastConnected = client.connected();
}

為了讓上述程式可以順利運做,依下圖黃色區將讀者取得的 ThingSpeak 寫入金鑰,填入自己的『ThingSpeak 寫入金鑰』,程式方能順利執行。

image

變更 ThingSpeak 寫入金鑰。

如下圖所示,可以看到本次實驗-ThingSpeak 之亮度監控程式結果畫面。

image

ThingSpeak 之亮度監控程式結果畫面。

查看 Channel 資料

進入網站後,先點選下圖紅框區,切換到 Channel 的資料。

image

切換到 Channel 的資料。
由下圖紅框區處,可以查閱 Channel 寫入資料。

image

查閱 Channel 寫入資料。

讀者可以看到,我們已經成功將簡單的亮度監控伺服器的資料,送到 ThinkSpeak 物聯網平台,並可以查看資料。

Import/Export Channel 資料

進入網站後,先點選下圖紅框區,切換到 Channel 的資料。

image

切換到 Channel 的資料。

看到下圖紅框區,可以將 ThinkSpeak 上 Channel 的資料輸出到 PC 個人電腦。

image

輸出 Channel 寫入資料。

當讀者按下上圖的『Download』圖示後,我們就可以看到該 Channel 的資料輸出成為 CSV 的資料,並由下圖所示,轉成 CSV 的資料在 EXCEL 顯示出來,透過 EXCEL 的任何操作,算出其統計資料或轉成圖表。

image

轉成 CSV 的資料在 EXCEL 顯示。

文/曹永忠、許智誠、蔡英德

編/leettlepon

參考資料:

  • 曹永忠, 許智誠, & 蔡英德. (2015a). Arduino程式教學(入門篇):Arduino Programming (Basic Skills & Tricks) (初版 ed.). 台湾、彰化: 渥玛数位有限公司.
  • 曹永忠, 許智誠, & 蔡英德. (2015b). Arduino程式教學(無線通訊篇):Arduino Programming (Wireless Communication) (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.
  • 曹永忠, 許智誠, & 蔡英德. (2015c). Arduino編程教学(入门篇):Arduino Programming (Basic Skills & Tricks) (初版 ed.). 台湾、彰化: 渥玛数位有限公司.
  • 曹永忠, 許智誠, & 蔡英德. (2015d). Arduino编程教学(无线通讯篇):Arduino Programming (Wireless Communication) (初版 ed.). 台湾、彰化: 渥瑪數位有限公司.