重新將 Arduino、BMP085 和 HIH-4000 接駁起來量度房間內的溫度、濕度和氣壓
現在嘗試重新接駁,但只用了 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:
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); }
結果如下:
由於這裡量度的氣壓受感測器所處海拔高度影響,所以要以公式轉換成平均海平面氣壓,算式如下:
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
本文連結