【物聯網開發系列】多對一小型溫濕度暨亮度感測裝置之實作(單一微型裝置篇)

  • 文/曹永忠

本篇是「物聯網開發」系列中「多對一小型溫濕度暨亮度感測裝置之實作」的首篇。

物聯網時代來臨,筆者寫過許多智慧家居的文章(詳見下方參考文章),但是對於人類發展而言,食衣住行育樂,居住的舒適性總是人們最重視第一位,隨著舒適生活的關鍵性,在家庭之中單一感測裝置已經無法滿足現在的需求,如果可以透過分散式的感測裝置,透過網路來提供感測資料,將是非常夢幻的一件事。

由於無線連網的開發板價格昂貴,真實環境中,熱點也不是每一個房間都可以順利連網,所以如果可以簡化感測裝置,透過多對一的傳輸方式,統一由一台無線連網的開發板來集中資料,我們可以使用簡單、微型、低階的開發版整合少數感測器運作,透過低功耗的無線傳輸模組(chtseng, 2018),多對一的方式傳輸感測資料,將監控與收集溫溼度等相關資訊傳送到資料展示/儲存中心,這樣的應用或許可能為智慧家居應用上的一大契機。

Arduino nano 硬體

Arduino Nano 是 Arduino USB 介面的微型版本,最大的不同是沒有電源插座以及 USB 介面是 Mini-B 型插座(曹永忠, 許智誠, & 蔡英德, 2015a, 2015b, 2016a, 2016c)。

Arduino Nano是尺寸非常小的而且可以直接插在麵包板上使用。其處理器核心是「ATmega168」(Nano2.x)和「ATmega328」(Nano3.0),同時具有 14 路數位輸入/輸出腳位(其中6路腳位可作為PWM輸出),8 路類比輸入腳位,一個 16MHz 晶體振盪器,一個 mini-B USB 口,一個 ICSP header 和一個重置按鈕。

系統規格

  • 微控制器 ATmega328
  • 工作電壓:5 V
  • 輸入電壓:7-12 V
  • 輸入電壓(極限值):6-20 V
  • 數位I/O :14 個(其中6個提供PWM輸出)
  • 模擬輸入:8 個
  • 每個I/O DC電流:40 mA
  • Flash Memory:32 KB (ATmega328),其中2 KB被BootLoader佔用
  • SRAM:2 KB (ATmega328)
  • EEPROM: 1 KB (ATmega328)
  • 時鐘速度:16 MHz
  • 尺寸: 73″ x 1.70″
  • 長度 :45 mm
  • 寬度:18 mm
  • 電源:Arduino Nano可通過Mini-B USB連接、6-20V未穩壓外部電源(引腳30)或5V穩壓外部電源(引腳27)供電。會自動選擇電壓最高的電源。
  • 記憶體:ATmega328具有32 KB Flash Memory(2 KB被BootLoader佔用)。ATmega328還具有2KB SRAM和1KB EEPROM。
  • 輸入和輸出:利用pinMode()、digitalWrite()和digitalRead()函數,Nano上的14個數字引腳都可用作輸入或輸出。它們的工作電壓為5V。每個引腳都可以提供或接受最高40 mA的電流,都有1個20-50 kΩ的內部上拉電阻器(默認情況下斷開)。此外,某些引腳還具有特殊功能:
    • 串列埠: D0 (RX) and D1 (TX) 用於接收(RX)和發送(TX)TTL串列數據。這些GPIO與FTDI USB轉TTL串列晶片的相連。
    • 外部中斷:D2和 這些GPIO可以配置成在LOW、上升或下降沿或者數值變化時觸發中斷。詳情請參照attachInterrupt()函數。
    • PWM:D3, D5, D6, D9, D10,和D11 . 為8位元PWM輸出,提供analogWrite()函數使用。
    • SPI:D10 (SS), D11 (MOSI), D12 (MISO), D13 (SCK)。這些GPIO支持SPI通信,由Hardware提供。
    • LED:D13。有1個內置式LED連至數位腳位D13。在高電位時,LED開啟;在低電位時,LED關閉。
    • Nano有8個類比輸入,每一個提供10位元的解析度’(即1024個不同的數值)。預設情況下,它們的電壓為0~5V,雖然可以利用analogReference()函數改變其範圍的上限值。腳位6和腳位 7無法用作為數位腳位。
    • I2C:A4 (SDA)和A5 (SCL) . 透過One Ware函式庫庫可進行I2C(TWI)通信。
    • 電路板上還有另外2個腳位:
      • AREF:作為類比輸入的參考電壓。與analogReference()一起使用。
      • Reset: 控制系統重置(Reset)使用。
    • 通信:Arduino Nano可以和另一個Arduino或其它微控制器通信之用。ATmega328提供了可在數位腳位D0(RX)和D(TX)上進行的UART TTL(5V)串列通信。開發板上的FTDI /FT232RL會通過USB進行該串列通信,FTDI驅動後,可以整合Sketch IDE開發環境中軟體串列埠,可以使用Serial來偵錯。
      ArduinoSketch IDE開發環境包含1個串列埠監控器,使得簡單的文字資料能夠發送到或者從Arduino開發板上發出。當通過電腦上的FTDI通訊晶片和USB連接傳輸數據時,開發板上的RX和TX LED會閃爍,也可使用SoftwareSerial庫可以在Nano的任何數位腳位上進行串列通信。
    • ATmega328還支持I2C(TWI)和SPI通信。
    • Arduino Nano開發板上的ATmega328預先燒錄了Boot Loader,從而無需使用外部任何硬體,就可以透過USB上傳程式到Arduino Nano開發板。

圖 1:Arduino Nano 控制器開發板外觀圖

溫濕度感測模組(DHT21/22)

本實驗介紹 DHT22 溫濕度感測模組(如下圖所示)(曹永忠, 許智誠, & 蔡英德, 2015c, 2016b, 2016d),本模組只要將 Vcc 接到 Arduino 開發板 +5V 腳位,Gnd 接到 Arduino 開發板 Gnd 腳位,DAT 接到 Arduino 開發板 Digital Input  腳位 2,對於 Arduino 開發板外部插斷接腳不太了解的讀者,可以參閱此指示,再執行下列程式。

圖 2:DHT22溫濕度感測模組

表 1:DHT22 溫濕度感測模組接腳圖

其餘關於 DHT22 溫濕度感測器的細部資料,本文使用的 DHT-22 函式庫,是採用網路上 Seeed-Studio 針對 DHT22 Temperature and Humidity Sensor 所攥寫的 Arduino library,Seeed-Studio 在 GitHub, Inc. 撰寫之程式碼,可在下載,特此感謝分享。

我們將下表之 DHT22 溫濕度感測器讀取溫濕度測試程式攥寫好之後,編譯完成後上傳到 Arduino 開發板。

表 2:DHT22溫濕度感測器讀取溫濕度測試程式

DHT22溫濕度感測器讀取溫濕度測試程式(DHT22_Test)
// Example testing sketch for various DHT humidity/temperature sensors

// Written by ladyada, public domain

 

#include “DHT.h”

 

#define DHTPIN 2 // 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 A0 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溫濕度感測器讀取溫濕度測試程式畫面結果,也可以輕易讀到外界的溫度與濕度了。

圖 3:DHT22 溫濕度感測器讀取溫濕度測試程式畫面結果。

低功耗的無線傳輸模組

凌陽創新科技 (Sunplus Innovation Technology Inc.)開發了一系列簡單、便宜、好用的 RF UART 系列模組,可以參考該公司產品官網。其中,有如下圖所示的 MUART0-S-1-1 無線序列埠傳輸模組(1 對 1)、MUART0-P-1-2 無線序列埠傳輸模組(1 對 2),還有 MUART0-PP-1-N 無線序列埠傳輸模組(1 對 N)包含 1:3、1:4、1:5、1:6、1:7、1:8 多種規格讓使用者自由選擇購買,它能將傳統 1 對 1 的 UART 連接埠輕易的升級至最多 1 對 8 的無線 UART 傳輸,此外還支援單向的廣播模式,以及二組 I/O pin,讓您在開發各種裝置功能時,更加的得心應手。

產品特點

  • MUART0-PP 系列模組支援的 Baud rate 為 9,600,過電後,若 root 端的 CTS Pin 未 接地則預設會與 Device #1 自動連線,若 root 端的 CTS Pin 腳接地,則 root 端會以廣播 方式將 Uart 或I/O Port 資訊傳送至所有的 Devices。
  • 每套皆有兩種模組:分別為 Root 及 Device,Root Device 固定一個,Device 數量 視型號而定
  • 操作電壓:3~5.5V
  • RF 頻率:2400MHz~2480MHz
  • 耗電量:傳送約 24mA@+5dBm,接收約 23mA
  • 發射功率:+5dBm
  • 傳輸速率:250Kbps
  • 傳輸距離:空曠處約 80~100m
  • Baud rate:9,600bps
  • 可選擇指定連接模式或廣播模式。

圖 4:MUART0-S-1-1 無線序列埠傳輸模組

凌陽創新科技所推出的 RF UART 系列模組擁有以下三個特色,可讓我們馬上就能以最簡單 的方式搭建起雙向的物聯網環境:

  1. 穩定的 UART/TTL 無線傳輸。
  2. IO port 支援:讓感測器直接具備雙向溝通能力。
  3. 支援各種不同的情境需求:支援 1 對 1、1 對多(3~8)…等功能。

接下來我們修改表 2 之 DHT22 溫濕度感測器讀取溫濕度測試程式(DHT22_Test),將下表:MUART0-S-1-1 無線序列埠 Root 模組與表 4:MUART0-S-1-1 無線序列埠 Client 模組接腳圖的零件加入電路之中,形成下圖所示之無線傳輸接收序列模組電路圖。

表 3:MUART0-S-1-1 無線序列埠Root模組接腳圖

表 4:MUART0-S-1-1 無線序列埠 Client 模組接腳圖

如下圖所示,我們完成整合DHT22溫濕度感測模組與無線序列模組之傳輸接收電路圖。

圖 5:無線傳輸接收序列模組電路圖

接下來我們修改如表 2 之 DHT22 溫濕度感測器讀取溫濕度測試程式,將傳輸與接收的功能整合進新的程式,整合 DHT22 溫濕度感測器,我們將下表之自體無線傳輸接 DHT22 溫濕度感測器資料測試程式攥寫好之後,編譯完成後上傳到 Arduino 開發板。

表 5:自體無線傳輸接DHT22溫濕度感測器資料測試程式

自體無線傳輸接DHT22溫濕度感測器資料測試程式(DHT_22_test1)
#include <SoftwareSerial.h>

#define RXPin1 5

#define TXPin1 6

#define RXPin2 11

#define TXPin2 12

 

SoftwareSerial root(RXPin1, TXPin1); // RX, TX

SoftwareSerial client(RXPin2, TXPin2); // RX, TX

 

#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);

String SendStr ;

 

void setup()

{

Serial.begin(9600);

Serial.println(“DHTxx test!”);

root.begin(9600) ;

client.begin(9600) ;

Serial.println(“RF Module init”);

// init RF device

dht.begin();

Serial.println(“DHT22 init”);

// init dht sensor

}

 

void loop()

{

// Reading temperature or humidity takes about 250 milliseconds!

// Sensor readings may also be up to A0 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

{

SendStr =”” ;

SendStr.concat(“Humidity: “);

SendStr.concat(h)  ;

SendStr.concat(” %\t”);

SendStr.concat(“Temperature: “);

SendStr.concat(t);

SendStr.concat(” *C “);

Serial.println(SendStr);

Serial.println(“Finish Read DHT22”);

}

// here send data

root.println(SendStr) ;

delay(1000) ;

while (client.available() > 0)

{

Serial.print(client.read()) ;

}

delay(2000) ;

}

  • 程式下載點在

上述程式執行後,可以見到下圖之自體無線傳輸接 DHT22 溫濕度感測器資料測試程式畫面結果,我們可以將讀到外界的溫度與濕度,透過無線傳輸模組傳送到另一端後,在透過 UART 讀取後,將資訊傳出。

圖 6:自體無線傳輸接DHT22溫濕度感測器資料測試程式畫面結果

到此,我們已經完成讀取 DHT22 溫濕度感測器之溫濕度資料,並透過凌陽創新科技之 MUART0-S-1-1 無線序列埠傳輸模組(1對1),透過無線射頻(RF)方式來傳輸資料,並在遠方接收端將資料呈現。

後續

本篇是「物聯網開發」系列中「多對一小型溫濕度暨亮度感測裝置之實作」的首篇:單一微型裝置篇,主要告訴讀者,感測裝置微小化與無線化將是未來物聯網與雲端資料中心連接並顯示的未來發展中不可或缺的技術,希望透過筆者經驗與心得,讓大家可以在未來一統使用這樣的技術應用。

後續筆者還會繼續發表「物聯網開發」系列的文章,在未來我們可以創造出更優質,更具未來性的物聯網(Internet of Thing:IOT)產品開發相關技術。

敬請期待更多的文章。

作者介紹

曹永忠(Yung-Chung Tsao):目前為自由作家,專注於軟體工程、軟體開發與設計、物件導向程式設計、物聯網系統開發、Arduino開發、嵌入式系統開發,商品攝影及人像攝影。長期投入資訊系統設計與開發、企業應用系統開發、軟體工程、物聯網系統開發、軟硬體技術整合等領域,並持續發表作品及相關專業著作。

Email:prgbruce@gmail.com/Line ID:dr.brucetsao/作者網頁臉書社群(Arduino.Taiwan)Github 網站Youtube

參考文獻

分享到社群

曹永忠

曹永忠 (Yung-Chung Tsao) ,目前為自由作家暨專業Maker,專研於軟體工程、軟體開發與設計、物件導向程式設計,商品攝影及人像攝影。長期投入創客運動、資訊系統設計與開發、企業應用系統開發、軟體工程、新產品開發管理、商品及人像攝影等領域,並持續發表作品及相關專業著作。 Email:prgbruce@gmail.com Line ID:dr.brucetsao 作者網站:https://www.cs.pu.edu.tw/~yctsao/ 臉書社群(Arduino.Taiwan):https://www.facebook.com/groups/Arduino.Taiwan/ Github網站:https://github.com/brucetsao/ Youtube:https://www.youtube.com/channel/UCcYG2yY_u0m1aotcA4hrRgQ