重新將 Arduino、BMP085 和 HIH-4000 接駁起來量度房間內的溫度、濕度和氣壓

之前我曾利用 Arduino 去量度房間內的溫度、濕度和氣壓,再利用 WiShield 將 Arduino 變成網頁伺服器將數據傳送出去。因著一些原因,之前要停止運作。

現在嘗試重新接駁,但只用了 BMP085 氣壓及溫度濕度感測器和 HIH-4000 濕度感測器。以前用的 DS18B20 溫度感測器不是不好,但 BMP085 氣壓感測器已經有溫度感測功能,而且 DS18B20 利用了比較少用的 1-Wire 去傳送資料,而 BMP085 則用了比較常用的 I2C,再移植到其他硬件上會比較方便。HIH-4000 則利用了 0V-5V 間的電壓去表示濕度。

接駁方式類似如下,由於我先前在淘寶訂購的 BMP085 太闊,所以要用兩塊麵包板去接駁。BMP085 用上了 3.3V,HIH-4000 則用 5V 電源。因為我正用 Arduino Uno,所以一定以 Arduino 板上的 A4、A5 接駁使用 I2C 的 BMP085(詳細資料),而 HIH-4000 則隨意駁上可讀取電壓值的 A2:
IMG_2990

Arduino 的程式碼如下,每兩秒讀取數據一次,然後以 Serial Port 的形式,經 USB 傳送到電腦。我利用了 Adafruit 提供的 C++ Class,放在 Arduino 的 Libraries 資料夾內,雖然它指明是用於 Adafruit 所售的 BMP085,但一樣可套用在我這裡:
#include <Wire.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;
int HIH_Pin = 2;
float HIH_humid = 0;
float temperature = 0;

void setup() {
  Serial.begin(9600);
  bmp.begin(); 
}

void loop() {
    temperature = bmp.readTemperature();
    Serial.print("Temperature = ");
    Serial.print(temperature);
    Serial.println(" *C");

    Serial.print("Pressure = ");
    Serial.print(bmp.readPressure());
    Serial.println(" Pa");
   
    HIH_humid = ((5 * analogRead(HIH_Pin) / 1024.0)/5 - 0.16) / 0.0062;
    //temperature compensation
    HIH_humid = HIH_humid / (1.0546 - 0.00216 * temperature);
    Serial.print("RH = ");
    Serial.print(HIH_humid);
    Serial.println(" %");
   
    Serial.println();
    delay(2000);
}

結果如下:
IMG_2991

由於這裡量度的氣壓受感測器所處海拔高度影響,所以要以公式轉換成平均海平面氣壓,算式如下:

p0=p((1-0.0065z/(t+0.0065z+273.15))^(-5.257))

z 為海拔高度(米)
t 為攝氏溫度
p 為量得氣壓(hPa)
p0 為平均海平面氣壓(hPa)

或以網上轉換器轉換。

由於我的感測器處於約海拔 50 米,轉換成的平均海平面氣壓約為 1,013 hPa,跟香港天文台的數據接近。

相關資料:
Honeywell HIH-4000 Series
learn.adafruit.com - Bosch BMP085 Breakout Board
O'Reilly Media - Designing Embedded Hardware, 2nd Edition

本文連結