电子说
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
全部0条评论
快来发表一下你的评论吧 !