BMP180 是博世Sensortec的新一代數字氣壓和溫度傳感器。在本教程中,我們將簡要回顧該設備并描述如何將其與Arduino Uno板連接以測量周圍的溫度和壓力。我們還將討論從壓力讀數中檢索傳感器高度的問題。
使用BMP180的溫度,壓力和高度測量
實驗設置
Bosch Sensortag的BMP180是一款超低功耗數字溫度和壓力傳感器,具有高精度和穩定性。它由壓阻傳感器,模數轉換器,帶EEPROM和串行I2C接口的控制單元組成.BMP180傳感器對壓力和溫度的原始測量必須使用校準數據補償溫度影響和其他參數。保存到EEPROM中。在本教程中,我們將使用Arduino開發板從BMP180傳感器讀取溫度和氣壓測量值,并在基于1.44英寸ILI9163的TFT顯示器上顯示數據。如果您想重復此實驗,則需要做以下事情。
1。任何以3.3V電壓運行的Arduino開發板 。我正在使用Elecrow的 Crowduino Uno 板,它具有一個板載滑動開關,可在3.3V至5.0V之間選擇工作電壓。如果要使用此板,請確保將開關滑動到3.3V位置。
Elecrow的Crowduino Uno板
2。 BMP180傳感器模塊
BMP180傳感器突破模塊
3。基于ILI9163的TFT顯示屏 (我使用的是Elecrow的1.44“尺寸顯示屏)。
1.44” TFT顯示屏(ILI9163驅動程序)
4。 一塊面包板和少量跳線,用于將傳感器和顯示器連接到Arduino板上。
下圖描述了本教程的實驗設置。 BMP180和TFT顯示屏均由3.3V供電。 BMP180支持I2C接口,因此SDA和SCL引腳連接到Arduino板的A4和A5引腳。 ILI9163 TFT驅動器支持SPI接口。下圖右側所示的表描述了顯示器和Arduino之間的接線。 I2C和SPI引腳名稱印在BMP180和TFT顯示模塊的底層絲網上。
傳感器和顯示設置
這是在實驗板上進行的該實驗的實際設置。
與Arduino的BMP180傳感器連接
Arduino固件
對于傳感器讀數,我使用的是Love Electronics Ltd.的BMP180 Arduino庫(我不確定這家公司現在是否存在,或者它在庫中的含義是不是) 。您需要下載它(下面提供的鏈接)并將此庫安裝到Arduino/庫/位置。
下載BMP180庫
用于ILI9163 TFT LCD,我正在使用另一個免費的開源Arduino庫TFT_ILI9163C,您可以從以下鏈接下載。
下載TFT_ILI9163C Arduino庫
TFT庫將Adafruit_GFX庫用于字體,因此您也需要下載并安裝它。
下載Adafruit_GFX_Library
這兩個庫都安裝好了為Arduino編寫固件。我在下面編寫和共享的固件以攝氏度和華氏度為單位顯示溫度,以毫巴和inHg為單位的大氣壓力。為了計算傳感器高度,我們需要了解以下部分中討論的參考表面壓力值。
關于檢索傳感器高度的重要說明
請注意,BMP180傳感器提供溫度和壓力的絕對測量值,但不提供海拔高度的直接輸出。由于大氣壓力隨高度降低,因此您可以通過了解地面的參考壓力值來找出傳感器的垂直位移。例如,為了從海平面計算傳感器高度,您需要知道您當地的當前平均海平面壓力。平均海平面壓力不是恒定的,而是隨環境溫度和天氣模式而變化。找出當前海平面壓力的最簡單方法是查看您最近的機場或國家氣象服務的網站。他們通常每小時大約在其網站上更新一次。我住在弗吉尼亞州的威廉斯堡,我從Weather.gov網站檢查了平均海平面壓力。在我進行此實驗時,平均海平面壓力為1027.7毫巴或102770帕斯卡。在下面的Arduino代碼中( float seaLevelPressure = 102770; ),我使用此值作為平均海平面壓力,并使用傳感器讀取壓力的差值和該值來計算傳感器位置的高度,那是我在弗吉尼亞州威廉斯堡的房子的二樓。因此,為了計算傳感器位置的高度,您必須用當前的本地海平面壓力值(帕斯卡)(1毫巴= 100帕斯卡)替換該值。有了本地海平面壓力的知識,下面的Arduino固件也以英尺和米為單位顯示海平面上方的高度。
平均海平面壓力數據
這是此項目的完整Arduino代碼。我建議使用下面的下載文件,而不是從此處復制和粘貼代碼,這有時無法正常工作。
#include
#include
#include
#include
#include // Define pins for ILI9163 SPI display
#define __CS 10
#define __DC 9 // Labeled as A0 in some modules
#define __RST 8
// Connect SDA to Arduino pin 11 (MOSI), and SCK to 13 (SCK) // Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define TRANSPARENT -1
TFT_ILI9163C display = TFT_ILI9163C(__CS, __DC, __RST); // Store an instance of the BMP180 sensor.
BMP180 barometer;
// Store the current sea level pressure at your location in Pascals.
float seaLevelPressure = 102770; // Williamsburg, VA on Dec 31, 2014, 14:54 Eastern Time void setup()
{
display.begin();
display.setBitrate(24000000);
display.setRotation(2);
display.clearScreen();
// We start the serial library to output our messages.
Serial.begin(9600);
// We start the I2C on the Arduino for communication with the BMP180 sensor.
Wire.begin();
// We create an instance of our BMP180 sensor.
barometer = BMP180();
// We check to see if we can connect to the sensor.
if(barometer.EnsureConnected())
{
Serial.println(“Connected to BMP180.”); // Output we are connected to the computer.
// When we have connected, we reset the device to ensure a clean start.
barometer.SoftReset();
// Now we initialize the sensor and pull the calibration data.
barometer.Initialize();
}
else
{
Serial.println(“No sensor found.”);
}
} void loop()
{
if(barometer.IsConnected)
{
// Retrive the current pressure in Pascals.
long currentPressureP = barometer.GetPressure();
float currentPressuremb = currentPressureP/100.0;
float currentPressureinHg = currentPressuremb*0.02953;
// Print out the Pressure.
Serial.print(“Pressure: ”);
Serial.print(currentPressureP);
Serial.println(“ Pa”);
Serial.print(“Pressure: ”);
Serial.print(currentPressuremb);
Serial.println(“ mbar”);
Serial.print(“Pressure: ”);
Serial.print(currentPressureinHg);
Serial.println(“ inHg”);
// Retrive the current altitude (in meters)。 Current Sea Level Pressure is required for this.
float altitudem = barometer.GetAltitude(seaLevelPressure);
float altitudeft = altitudem*3.2808;
// Print out the Altitude.
Serial.print(“ Altitude: ”);
Serial.print(altitudem);
Serial.print(“ m”);
Serial.print(“ Altitude: ”);
Serial.print(altitudeft);
Serial.print(“ ft”);
// Retrive the current temperature in degrees celcius.
float currentTemperatureC = barometer.GetTemperature();
float currentTemperatureF = (9.0/5.0)*currentTemperatureC+32.0;
// Print out the Temperature
Serial.print(“ Temperature: ”);
Serial.print(currentTemperatureC);
Serial.write(176);
Serial.print(“C”);
Serial.print(currentTemperatureF);
Serial.write(176);
Serial.print(“F”);
Serial.println(); // Start a new line.
// Now display results on LCD
display.fillScreen();
display.setCursor(0, 0);
display.setTextColor(WHITE);
display.setTextSize(1);
display.print(“BMP180 Sensor Demo”);
// Display temperature in F
display.setCursor(0, 16);
display.setTextColor(YELLOW);
display.setTextSize(2);
display.print(“T=”);
display.print(currentTemperatureF);
display.setTextSize(1);
display.print(“ o”);
display.setTextSize(2);
display.print(“F”);
// Display temperature in C
display.setCursor(24, 32);
display.print(currentTemperatureC);
display.setTextSize(1);
display.print(“ o”);
display.setTextSize(2);
display.print(“C”);
//Now display pressure in mbar
display.setCursor(0, 48);
display.setTextColor(CYAN);
display.setTextSize(2);
display.print(“P=”);
display.print(currentPressuremb,1);
display.print(“mb”);
// Display pressure in inHg
display.setCursor(24, 64);
display.setTextColor(CYAN);
display.print(currentPressureinHg,1);
display.print(“inHg”);
//Now display pressure in mbar
display.setCursor(0, 80);
display.setTextColor(WHITE);
display.setTextSize(2);
display.print(“H=”);
display.print(altitudeft,1);
display.print(“ft”);
// Display pressure in inHg
display.setCursor(24, 96);
display.setTextColor(WHITE);
display.print(altitudem,1);
display.print(“m”);
delay(5000); // Show new results every second.
}
}
在此處下載Arduino草圖
輸出
所示的傳感器高度大約是海拔88英尺,與此處發布的城市數據相比是正確的:http://en.wikipedia.org/wiki/威廉斯堡,_弗吉尼亞州
二樓測量值
傳感器對高度非常敏感。通過將傳感器放在我一樓的餐桌上進行以下測量。高度降低了約8英尺,這似乎是合理的。
一樓的測量
責任編輯:wv
-
傳感器
+關注
關注
2548文章
50740瀏覽量
752147 -
bmp180
+關注
關注
2文章
7瀏覽量
11517
發布評論請先 登錄
相關推薦
評論