1.2 環境光感測

此篇文章乃引用自http://makerdiwo.com/archives/4690

對於Tingspeak 的申請與應用有相當詳盡的解說,請參閱:

人類的未來-物聯網:透過THINGSPEAK網站監控居家亮度

曹 永忠 | 11 八月, 2015 AT 13:52

10149 2

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

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

ThingSpeak 網站

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

一、建立帳號

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

ThinkSpeak網站主頁。

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

ThinkSpeak 網站創建帳號。

ThinkSpeak 網站創建帳號完成後畫面。

二、帳號登入

讀者先到 ThingSpeak 網站,進入網站後到主頁,先點選下圖紅框區,使用您的帳號登入。

登錄 ThinkSpeak 網站。

讀者依下圖,輸入您帳號正確資訊後,登入 ThingSpeak 網站。

ThinkSpeak 網站登入畫面。

三、查看 Channel 資料

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

查看自己的 channel。

四、創建新 Channel

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

未創見任何 channel。

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

創建新 Channel 選單。

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

創建新 Channel 畫面。

讀者可以參考下圖紅框區,將必要的資訊填入。

創建新 Channel 畫面(範例)。

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

儲存新 Channel。

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

Channel 完成後的畫面。

五、取得 Channel 寫入金鑰

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

查看 Channel 的 API Key 的資料。

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

取得 Channel 寫入金鑰。

六、實做亮度監控之物聯網

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

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

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

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

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

BH1750FVI 亮度模組接腳表:

接腳

S

2

3

接腳說明

Vcc

GND

SDA

SCL

Arduino開發板接腳

電源 (+5V) Arduino +5V

Arduino GND

Arduino Analog Pin 4(UNO)

Arduino Analog Pin 5(UNO)

我們遵照前幾章所述,將 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 <SPI.h>

#include <Ethernet.h>

#include <Wire.h>

#include <BH1750.h>

// 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.1\n");

client.print(“Host: api.thingspeak.com\n");

client.print(“Connection: close\n");

client.print(“X-THINGSPEAKAPIKEY: “+writeAPIKey+"\n");

client.print(“Content-Type: application/x-www-form-urlencoded\n");

client.print(“Content-Length: “);

client.print(tsData.length());

client.print(“\n\n");

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 寫入金鑰』,程式方能順利執行。

變更 ThingSpeak 寫入金鑰。

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

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

查看 Channel 資料

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

切換到 Channel 的資料。

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

查閱 Channel 寫入資料。

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

Import/Export Channel 資料

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

切換到 Channel 的資料。

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

輸出 Channel 寫入資料。

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

轉成 CSV 的資料在 EXCEL 顯示。

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