//Logo Image
作者:楊哲彰,施柏宇,董盈,陳崑漢(2008-12-23);推薦:徐業良(2008-12-23)

應用無線感測器網路建構環境溫濕度監測系統

摘要

無線感測器網路(wireless sensor network, WSN)為嵌入式系統的一項重要技術應用,其中低功耗、低傳輸率的ZigBee無線感測器網路近年來逐漸應用於遠距監測之工業用途。本研究結合ZigBee無線感測器網路技術以及元智大學老人福祉科技研究中心發展之分散式資料伺服架構,開發環境溫濕度無線監測系統。此系統實際裝設於嘉義縣表演藝術中心展覽廳,並於「探索亞洲─故宮南院首部曲」展覽期間,進行展覽廳環境以及展櫃內溫濕度即時連續監測。

關鍵字:無線感測器網路溫度、溼度、嵌入式系統

Abstract

The wireless sensor network (WSN) is an emerging application of the embedded systems. ZigBee WSN technology has prompted rapid development in remote monitoring applications. This research project is to develop an environmental temperature and humidity monitoring system by combining both WSN technologies and the decentralized tele-monitoring system developed by Gerontechnology Research Center, Yuan Ze University. This system was installed at the Chia-Yi Performing Arts Center for remote temperature and humidity monitoring during the exhibition by National Palace Museum. This remote monitoring system is able to continuously provide real-time and long-term temperature/humidity data.

Keywords: wireless sensor network, temperature, humidity, embedded system

1.     研究背景

ZigBee是一項新興的無線感測器網路(wireless sensor network, WSN)技術,具有低成本、低耗電、小體積、容易佈建等特色,非常適合短距離、低資料量的區域無線傳輸。其命名乃源於蜜蜂在採集花粉時,時常以zigzag的方式,將訊息透露給其他蜂群,故取其特性命名為ZigBeeZigBee依據IEEE802.15.4規範,屬於無線個人區域網路(wireless personal area network, WPAN)架構,使用ISM 2.4GHz(全球)、915MHz(美國),以及868MHz(歐洲)等RF頻帶,傳輸速率則分別為10kbps40kbps以及250kbpsZigBee支援大量網路節點與多種網路拓樸(星形、樹形、網狀等三種通訊架構),每個ZigBee裝置都可以擔任中繼路由器(intermediate router),彼此透過多重跳點(multi hop)的方式傳遞資訊,此無線感測器網路技術已廣泛運用於以嵌入式系統架構為主的相關應用上。

元智大學老人福祉科技研究中心開發創新的分散式(decentralized)監測系統架構,並以此系統架構開發環境監測、睡眠品質監測、居家照護機器人、活動力監測、遠距居家照護等應用。分散式系統架構以「分散式資料伺服器(distributed data server, DDS,以下簡稱DDS)」為核心,為一個精簡化、小型化,針對特定目的提供所需功能之「精簡型伺服器(thin server)」。DDS具有獨立IP,不需作業系統即可快速連結上網,並具備接收感測訊號、運算處理、資料儲存、網路通訊等功能。與一般伺服器或個人電腦相較,DDS同樣使用傳輸控制協定∕網際網路協定(Transmission Control Protocol/Internet Protocol, TCP/IP)和超文件傳輸協定(Hypertext Transfer Protocol, HTTP),讓用戶端(client)能以瀏覽器執行DDS端的應用程式,進而讀取、維護、管理DDS上儲存的資料。DDS儲存資料容量與運算管理能力比較有限,但其有體積小、成本低、不易受病毒攻擊、不需特殊維護等優點。

1所示為分散式監測系統架構,DDS為系統核心,可連結外部感測器以無線或有線方式擷取訊號;透過網際網路通訊,經過授權的遠端使用者可由電腦,以網頁或VB程式與DDS連線進行資料存取。本系統也可連結外部集中式資料庫(Centralized Database),進行集中式資料管理。

本研究目的係運用ZigBee無線感測器網路技術,以及元智大學老人福祉科技研究中心所開發的分散式監測系統架構,開發環境溫溼度無線監測系統。本系統之規劃與設計並針對國立故宮博物院「故宮南院首部曲-探索亞洲」之展覽需求,實際於嘉義縣立表演藝術中心裝設本系統,於展覽期間進行展覽廳與展櫃溫濕度連續監測。本系統可透過網際網路,於遠端電腦顯示展場以及展櫃內即時溫溼度數據,以及歷史資料記錄,作為文物保存與典藏維護之工具。

1. 分散式監測系統架構

2.     系統設計

本監測系統硬體包含無線溫濕度監測器以及分散式資料伺服器兩部分。兩裝置分別具備ZigBee無線傳輸與接收模組,溫濕度監測器可將溫濕度數據以無線方式傳輸至分散式資料伺服器。以下將分別針對兩裝置進行詳細的設計說明。

(1)   無線溫濕度監測器

無線溫溼度監測器內部電路板與外觀如圖2所示,外觀尺寸為120×70×25(mm)。溫濕度監測器電路主要由「溫濕度感測器」、「單晶片處理器」、「ZigBee無線模組」、以及「電源」等四項元件構成。無線溫濕度感測器內的主動元件,皆以DC3.3V為標準預設驅動電壓,所有的性能參數亦採用此電壓準位為標準,為發揮裝置的最理想性能,電源線路以電壓調節器(LM3940)進行穩壓,可接受DC4.5-7.5V輸入,穩壓後輸出DC3.3V電源供給所有裝置上的元件。溫濕度感測器採用瑞士Sensirion SHT75數位式溫濕度感測器,尺寸僅3.7×3.1×13.5(mm),此感測器可同時擷取溫度與濕度,於常溫常濕狀況下具備14bit(溫度)與12bit(溼度)解析度,以及±0.3oC±1.8%RH之量測準確度。

2. 感測器內部與外觀

3說明無線溫濕度監測器內裝置元件與單晶片處理器的主要連接方式與執行程序。除了連接元件所需的電源(VDD)以及地線(GND)外,單晶片處理器(PIC18LF6722, Microchip Co.)B1B2數位腳位連接溫濕度感測器,以此兩數位腳位的電位(SCK, DATA)時序下達指令,感測器量測數值直接以數位訊號輸出,再由單晶片處理器擷取溫濕度數值,數值經過偏差修正後轉換成ASCII碼,透過RS-232(TX/RX)ZigBee無線模組連結,以無線方式送出溫濕度之ASCII碼。完整的無線溫濕度監測器電路設計,請參見本文末附錄圖B-1,單晶片擷取溫濕度感測器之程式請參見附錄A

3. 無線溫濕度監測器內裝置元件訊號連接(左)與執行程序(右)

(2)   分散式資料伺服器

分散式資料伺服器DDS(如圖4)由單晶片處理器搭配網路晶片的“PIC Server”,搭配周邊應用板(peripheral application board)組合而成。目前PIC Server採用Microchip PIC18F6X2X系列單晶片為核心,PIC18F6X2X系列包含PIC18F6621PIC18F6622PIC18F6722,為64pinTQFP(Thin Quad Flat Pack)封裝形式,採用4組獨立電源,支援2RS-232通訊埠。PIC ServerPIC18F6X2X與網路晶片RTL8019AS整合於同一片電路板上,提供網際網路通訊功能,利用泛用型韌體TCP/IP乙太網路驅動程式(firmware TCP/IP Ethernet BIOS driver)為平台,結合可程式唯讀記憶體(EEPROM)而成為「嵌入式網頁伺服器(embedded web server)」。

周邊應用板可搭配不同感測器自行規劃,擴充使用彈性,並以多媒體記憶卡(Multi-Media Card, MMC)為資料儲存載體。目前實驗室原型之DDS周邊應用板基礎規劃中,電源輸入部分可使用9V12V直流電源,經由3組獨立穩壓電源,可提供5V3.3V穩壓直流電源,分別供應主系統相關元件(5V)以及MMC儲存模組(3.3V)電源,除了DDS所有元件之外,應用板連接埠尚可提供105V53.3V,及5個未穩壓的旁路電源輸出,供外接裝置使用。訊號I/O部份提供19I/O接點,以及2組獨立的RS-232介面,一組與電腦連線,另一組則由連接埠連結至ZigBee無線模組。DDS電路設計圖參見本文附錄圖B-2

DSC01672.JPG

4. 分散式資料伺服器

3.     系統佈建與軟體介面

本溫濕度監測系統實際安裝於嘉義縣表演藝術中心之展覽廳,並於「故宮南院首部曲-探索亞洲」展覽期間(200810月至20091月)進行溫濕度監測。本系統硬體包含一部分散式資料伺服器,以及13個無線溫濕度監測器。圖5所示為監測器於現場安裝情形,圖中箭頭指示處為監測器,其中4個無線溫濕度監測器安裝於展覽廳內特定位置,用以偵測環境溫濕度,監測器位置離地約170cm(如圖5.15.2)。其餘9個則分別置於特定展櫃內底面,用以監測展櫃內的溫濕度(如圖5.3)。監測器之電源線可經由此貫孔延伸至展櫃牆面內部連接交流電插座。表1說明13個無線溫濕度監測器的編號以及監測位置。分散式資料伺服器則安置於展場牆面內靠近網路線路的隱密處。

1. 無線感測器配置表

環境監測器

展櫃內監測器

編號

位置

編號

位置

1

菩薩立像

5

西潮(A)

2

西潮

6

西潮(B)

3

茶文化

7

西潮(C)

4

織品

8

織品(A)

 

 

9

織品(B)

 

 

10

織品(C)

 

 

11

織品(D)

 

 

12

佛教造像(A)

 

 

13

佛教造像(A)

5. 無線溫濕度監測器現場裝設情形

本監測系統可供遠端電腦透過網際網路顯示即時或歷史溫溼度資料紀錄,包括使用網頁瀏覽器及VB程式兩種方式。使用者若欲瀏覽即時數據,僅需開啟網頁瀏覽器(如IE等)連結至DDS後,即可動態顯示目前所有監測器的即時數據(如圖6),無須安裝其他軟體;對於瀏覽歷史資料或繪圖等進階功能,使用者需要透過VB程式。

6. 以網頁瀏覽器連結至DDS後動態顯示目前所有監測器的即時數據

溫濕度監測系統之VB程式介面如圖7所示。開啟程式並且與DDS連線成功後,程式介面內所有的功能選項均被啟用。主要功能與操作簡要說明如下:

7. 溫濕度監測系統VB程式介面主畫面

(1)    瀏覽即時監測數據

成功啟動後,可點選「即時監測」,跳出如圖8之新表單畫面,可顯示出展場內所有連結感測器的位置與其目前即時溫溼度數值。每個感測器欄位中,左邊數值為溫度,右邊數值為濕度。可點選「手動更新」來更新即時收到的數據。但須避免快速連續點選「手動更新」按鈕,以免DDS因過度被下指令而當機。

8. 即時數據顯示畫面

(2)    記錄資料下載

於「日期選擇」選定特定單一日期,點選「資料下載」,此時VB程式將從DDS下載當日累積至今的記錄資料,約數秒後完成下載動作。若要快速檢視區段時間的記錄數據,可於主畫面下方「2008XXXX資料查詢」項目內以下拉式選單指定感測器與紀錄時間,溫溼度數值會隨即顯示於一旁欄位內。本程式亦提供連續監測數據之繪圖功能,於「繪圖區」內指定感測器,再點選「繪圖」,可顯示如圖9之紀錄數據曲線。若需調整顯示範圍,可自行調整圖表上數值的上下界,再行點選「繪圖」即可。若要再行檢視其他日期之記錄數據,需要在選定日期後,重新執行「資料下載」程序。

9. 當日連續監測數據繪圖

(3)    原始記錄資料匯出

點選「原始資料」,將資料以Excel軟體處理。點選後出現如圖10左圖表單,以滑鼠拖曳全選複製表單內所有內容後,另開啟Excel,再直接貼上數據,可利用「使用文字匯入精靈」自動將數據內容分類(如圖10右圖)。分類後A欄為記錄時間,BC欄分別為No.1感測器的溫溼度值、D欄與E欄分別為No.2感測器的溫溼度值,依此類推至No.15感測器(No.14No.15無資料,為備用欄位),使用者可自行進行資料編輯與處理。

 

10. 原始數據表單(左)與匯入Excel後資料格式(右)

4.     結論與討論

本研究目的係運用ZigBee無線感測器網路技術,以及元智大學老人福祉科技研究中心所開發的分散式監測系統架構,開發環境溫溼度無線監測系統。本系統之規劃並針對國立故宮博物院「故宮南院首部曲-探索亞洲」之展覽需求,實際於嘉義縣立表演藝術中心裝設本系統,於展覽期間進行展覽廳與展櫃溫濕度連續監測。本系統可透過網際網路,於遠端電腦顯示展場以及展櫃內即時溫溼度數據,以及歷史資料記錄,作為文物保存與典藏維護之工具。本開發監測系統可達成即時溫濕度數據顯示、歷史監測記錄檢視等功能。未來系統設計將朝向微小化、以及更低功耗的目標發展與改進,也可運用無線感測器網路技術於相關遠距監測應用。

附錄A. 取擷SHT75之溫溼度數據的單晶片程式

欲取擷SHT75之溫溼度數據,可於圖A-2主程式碼中使用ReadTempture()ReadHumidity()執行動作。本程式不包含SHT75CRC-8偵錯、重設(connection reset)、以及睡眠(sleep)動作,因此下列程式僅包含:傳送起始化(TrasnsmitStart)、指令傳送(SendCommand)、讀值(ReadValue)、以及溫度或溼度之轉換(CalcTempValue, CalcHumiValue)四部分。

當感測器供電後,首先須進行與感測器通訊之起始化動作,圖A-1說明初始化指令。當SCK為高位時,將DATA拉至低位(S1),接著將SCK產生一個脈波(pulse, S2),然後當SCK為高位時,再將DATA提升為高位,最後再將SCK拉為低位,完成一個初始化的動作。其中高位與低位須分別高於VDD電壓之90%與低於其10%。本階段程式指令對應於主程式碼中TransmitStart()副程式內。

A-1. 起始化控制

接下來則由SendCommand()副程式對SHT75下指令,指令表如表A-1所示。表中所列之指令前皆須加上「000」,成為8位元長度。例如若要擷取溫度,則命令為「000 00011」(即0x03),擷取溼度則為「000 00101」(即0x05)。SendCommand()副程式中,從命令的第8位元至第1位元執行動作,當該位元為1”時,DATA提升為高位,若該位元為0時,則DATA為低位,且不論DATA之準位高低,SCK則需要將準位做拉高-降低的脈波動作。此程序重複至第1位元止。完成發送令後,將DATA設為輸入狀態後,再將SCK產生一個脈波,作為確認程序完成(ACK)的動作。

A-1. 指令清單

Command

Code

Reserved

0000x

Measure Temperature

00011

Measure Relative Humidity

00101

Read Status Register

00111

Write Status Register

00110

Reserved

0101x-1110x

Soft Reset

11110

第三部份ReadValue()副程式由DATA腳位讀取SHT75之輸出數據,數據為2Byte長度(16bit);第1個輸出位元存於MSb(most significant bit,最高位元),最後一個輸出則存於LSb(least significant bit,最低位元)。此2 Byte資料數據將存於Lx變數,再傳回至CalctempValue()副程式轉換成為可讀的溫度數值。CalcHumiValue()副程式中,Lx即可以下式(1)以及表A-2所列之係數計算濕度

                                                                           (1)

例如若Lx=0000100100110001=2353,則溼度之計算為

       

A-2. 溼度轉換系數表

SORH

c1

c2

c3

12bit

-4

0.0405

-2.8E-6

8bit

-4

0.6480

-7.2E-4

若為擷取溫度,則同樣在執行ReadValue()副程式後,以CalcTempValue()副程式執行轉換,該副程式以如下式(2)之公式以及表A-3所列之系數轉換為可讀的溫度值,須注意當不同的VDD電壓準位驅動SHT75時,其係數會稍有不同。

                                                                                              (2)

A-3. 溫度轉換系數表

VDD

d1()

5.0V

-40.1

4.0V

-39.8

3.5V

-39.7

3.0V

-39.6

2.5V

-39.4

A-2. 主程式碼

signed int16 ReadTemperature(); 

signed int16 ReadHumidity();    

 

// Define clock and data pins

#ifndef SHT7x_SCK

#define SHT7x_SCK    PIN_B6

#define SHT7x_DATA   PIN_B7

#endif

 

// ---------------------------------------------------------------------

// Command byte values     // adr cmd  r/w

#define RESET        0x1e  // 000 1111  0

#define MEASURE_TEMP 0x03  // 000 0001  1

#define MEASURE_HUMI 0x05  // 000 0010  1

#define WrSTATUS_REG 0x06  // 000 0011  0

#define RdSTATUS_REG 0x07  // 000 0011  1

 

#define SHT7x_ACK    0

 

// int1 Acknowledge, chkCRC, error; int8 TimeOut, err;

 

signed int16 CalcTempValue(int16 Lx) // [0.1 deg C], with 14 bit @ 5V

{

   return((signed int16)(-396.5 + 0.1*(float)Lx));

}

 

signed int16 CalcHumiValue(int16 Lx) // [0.1 %RH], with 12 bit @ 5V

{

   float Fx;

   Fx  = -40.0 + 0.405*(float)Lx - 2.8e-5*(float)Lx*(float)Lx;

   Fx += (float)(ReadTemperature()-250)*(0.01+8e-5*(float)Lx); // 溫度補償

   return((signed int16)Fx);

}

 

void TransmitStart()

{

   output_high(SHT7x_DATA);

   output_low (SHT7x_SCK);  delay_us(2);

   output_high(SHT7x_SCK);  delay_us(2);

   output_low (SHT7x_DATA); delay_us(2);

   output_low (SHT7x_SCK);  delay_us(6);

   output_high(SHT7x_SCK);  delay_us(2);

   output_high(SHT7x_DATA); delay_us(2);

   output_low (SHT7x_SCK);  delay_us(2);

}

 

void RST_Connection()

{

   int8 i;

   output_high(SHT7x_DATA);

   for(i=1;i<=10;++i)

   {

      output_high(SHT7x_SCK); delay_us(2);

      output_low (SHT7x_SCK); delay_us(2);

   }

   TransmitStart();

}

 

// void RST_Software(){}

// int8 WriteStatReg(int8 command){}

// int8 ReadStatReg (int8 command){}

 

int16 ReadValue()

{

   int8 i, ByteHigh=0, ByteLow=0; int16 Lx;

   for(i=1;i<=8;++i) // read high byte VALUE from SHT11

   {

      output_high(SHT7x_SCK); delay_us(2);

      shift_left (&ByteHigh, 1, input(SHT7x_DATA) );

      output_low (SHT7x_SCK); delay_us(2);

   }

   output_low  (SHT7x_DATA);  delay_us(2);

   output_high (SHT7x_SCK);   delay_us(2);

   output_low  (SHT7x_SCK);

   output_float(SHT7x_DATA);  delay_us(2);

 

   for(i=1;i<=8;++i) // read low byte VALUE from SHT11

   {

      output_high(SHT7x_SCK); delay_us(2);

      shift_left (&ByteLow, 1, input(SHT7x_DATA) );

      output_low (SHT7x_SCK); delay_us(2);

   }

   output_high (SHT7x_DATA);  delay_us(2);

   output_high (SHT7x_SCK);   delay_us(2);

   output_low  (SHT7x_SCK);

   output_float(SHT7x_DATA);  delay_us(2);

   Lx=make16(ByteHigh,ByteLow);

   return(Lx);

}

 

void SendCommand(int Command)

{

   int8 i;

   for(i=128;i>0;i/=2)

   {

      if(i & Command) output_high(SHT7x_DATA);

      else            output_low (SHT7x_DATA);  delay_us(2);

      output_high(SHT7x_SCK); delay_us(2);

      output_low (SHT7x_SCK);

   }

   output_float(SHT7x_DATA);  delay_us(2);

   output_high (SHT7x_SCK);   delay_us(2);

   output_low  (SHT7x_SCK);

}

 

signed int16 ReadTemperature()

{

   TransmitStart();           SendCommand(MEASURE_TEMP);

   while(input(SHT7x_DATA));  delay_us(2);

   return( CalcTempValue ( ReadValue() ) );

}

 

signed int16 ReadHumidity()

{

   TransmitStart();           SendCommand(MEASURE_HUMI);

   while(input(SHT7x_DATA));  delay_us(2);

   return( CalcHumiValue ( ReadValue() ) );

}

附錄B. 電路設計

電路圖

B-1. 無線溫濕度監測器電路圖

 

B-2. 分散式資料伺服器(DDS v3.7)電路圖

B-3. 分散式資料伺服器(DDS v3.7)ZigBee無線模組電路圖

B-1. 無線溫溼度監測器零件表

料號

件號

封裝型式/尺寸

備註

U1

LM3940

TO-263

3.3V REG

U2

PIC18LF6722

TQFP64

 

J1

CON2

2.54p

PWR IN

J2

CON4

1.27p

SHT75

J3

CON3

2.54p

RS-232

J4

CON6

2.54p

ICP BURN

J5

RES

2.2k

排阻

J6

CON10

2.0p

ZIGBEE

J7

CON10

2.0p

ZIGBEE

S2

SPST

 

 

S3

CON2

2.0p

跳線(JUMPER)

S4

DIP SW4

DIP8

SENSOR ID

S5

CON2

2.54p

跳線(JUMPER)

D1

LED

SMD0808

SLEEP

D2

LED

SMD0805

A4 ICP

D3

LED

SMD0805

ASSOC

D4

LED

SMD0805

PWM

Y1

10MHz

HC49

OSC XTAL

C1

CAP

0.47uF

電解電容

C2

CAP

33uF

電解電容

C3,4,7,8

CAP

SMD0805, 0.1uF(104)

 

C5,6

CAP

SMD0805 22pF (15pF)

 

R5,12

RES

SMD0805 10k

 

R6,8,9,10,11

RES

SMD0805 2.2k

 

R7

RES

SMD0805100

 

R13

RES

SMD0805 20k