树莓派连接BMP180气压传感器

树莓派连接BMP180气压传感器,第1张

作为最常见的传感器,本篇(来自于知乎某大神的文章)实现气压传感的交互:

1.先说明BMP180的特点

注意了该传感器是I2C接口的,因此在后续步骤要稍加注意。

2. 接线

I2C 有两个总线:SCL 为时钟信号,和 SDA 为双向数据传输。 每个 I2C 器件采用独特的 7 位地址,这意味着你可以有超过 120 个独特的 I2C 器件共享总线, 并且可以同时控制这些器件一起工作。岩绝

将 BMP180 的 VCC 引脚用红色跳线连接树莓派的 3V3 ( 3.3 伏电源)。将 BMP180 的 SDA 引脚 接入树莓派的 SDA 引脚并将 BMP180 SCL 引脚接入树莓派的 SCL 引脚,该引脚提供一个规律的 时钟信号。SDA 传递数据信号。BMP180 的 GND 引脚档渣通过黑色跳线连接树莓派的接地( GND) 引脚。 在上电前,一定多检查两次接线的准确性。

3. 环境和程序部分

配置文件 /boot/config.txt:

dtparam=i2c_arm=on

重启树莓派,用如下命令查看传感器是否接上:

i2cdetect -y 1

如果接上了的话会显示下粗蠢姿图:

编写 BMP180.py:

然后编写调用函数bmp180_example.py:

执行./bmp180_example.py就可以在终端看到实时的温度/气压输出。

方法一: photoshop,是常用的图片编辑软件,论坛中即有下载。具体步骤如下:步骤一:用 photoshop软件打开所要编辑的图片文件。点击标题栏--图象--图象大小。 步骤二:在图象大小的d出对话框中,填写具体尺寸,一般来说,600*400,或者400*600的文件大小比较适合网页的浏览习惯。注意,要将约束比例一栏打勾。步骤三:完让铅成 *** 作,保存文件。点击文件-保存为--,在保存为的d出对话框中,填写文件名,以及要保存的地址,保存。步骤四:此时,会出现jpeg的对话框,移动选择条,将文件品质调整为10,最佳。确定。

方法二: 如果您的电脑上没有安装photoshop软件,还有一个简单的办法。就是使用windows系统自带的画图软件,点击系统的开始--所有程序--附件--画图。步骤一:打开你所要编辑的文件。点击标题栏--图象--拉伸/扭曲--d出窗口,如下图。在拉伸栏中填写相应缩小比例,注意,水平和垂直栏一定要填写相同大小。以2048*1536的图片尺寸而言,填写30%的比例,缩小后图片为600*400,大小适中。 图片要从大向小调整,避免发生缩小后再放大的情况,图片的画面质量坦数好将被破坏。如果您觉得图片调整过于小了,请重新打开文件再缩小,而不是在已经缩小的图片上做放大处毕判理,切记。步骤二:保存。特别提示大家,尽量使用“另存为”,以免对原图片发生修改。

以Arduino Uno为例:VCC 接3.3v,GND接GND,SCL接A5,SDA接A4

代码如下

#include <SFE_BMP180.h>

#include <Wire.h>

SFE_BMP180 pressure// 创建一个气压计对象

double baseline// 基准气压

void setup()

{

Serial.begin(9600)

Serial.println("REBOOT")

// 初始化传感器

if (pressure.begin())

  Serial.println("BMP180 init success")

else

{

  // 糟糕,气压计出问题了,多半是连线有问题

  Serial.println("BMP180 init fail (disconnected?)\n\n")

  while(1)// 暂停

}

//获得基准气压

baseline = getP()

Serial.print("baseline pressure: ")

Serial.print(baseline)

Serial.println(" hPa")

}

void loop()

{

double a,p,t

p = getP()// 获得一个气压值

a = pressure.altitude(p,baseline)//获得基于基准气压的高度值

Serial.print("relative altitude: ")

if (a >= 0.0) Serial.print(" ")// 调整正数显示格式

Serial.print(a,1)

Serial.print(" meters ")

t = getT()// 获得一个温度值

Serial.print("temperature: ")

Serial.print(t,1)

Serial.println(" degrees")

delay(500)//刷新率

}

double getP()

{

char status

double T,P,p0,a

// You must first get a temperature measurement to perform a pressure reading.

// Start a temperature measurement:

// If request is successful, the number of ms to wait is returned.

// If request is unsuccessful, 0 is returned.

status = pressure.startTemperature()

if (status != 0)

{

  // Wait for the measurement to complete:

  delay(status)

  // Retrieve the completed temperature measurement:

  // Note that the measurement is stored in the variable T.

  // Use '&T' to provide the address of T to the function.

  // Function returns 1 if successful, 0 if failure.

  status = pressure.getTemperature(T)

  if (status != 0)

  {

    // Start a pressure measurement:

    // The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).

    // If request is successful, the number of ms to wait is returned.

    // If request is unsuccessful, 0 is returned.

    status = pressure.startPressure(3)

    if (status != 0)

    {

      // Wait for the measurement to complete:

      delay(status)

      // Retrieve the completed pressure measurement:

      // Note that the measurement is stored in the variable P.

      // Use '&P' to provide the address of P.

      // Note also that the function requires the previous temperature measurement (T).

      // (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)

      // Function returns 1 if successful, 0 if failure.

      status = pressure.getPressure(P,T)

      if (status != 0)

      {

        return P

      }

      else Serial.println("error retrieving pressure measurement\n")

    }

    else Serial.println("error starting pressure measurement\n")

  }

  else Serial.println("error retrieving temperature measurement\n")

}

else Serial.println("error starting temperature measurement\n")

}

double getT()

{

char status

double T,p0

status = pressure.startTemperature()

if (status != 0)

{

  delay(status)

  status = pressure.getTemperature(T)

  if (status != 0)

  {

    status = pressure.startPressure(3)

    return T

  }

  else Serial.println("error retrieving temperature measurement\n")

}

else Serial.println("error starting temperature measurement\n")

}

注意:串口会同时输出两组数据,A较精确


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12513470.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-25
下一篇2025-08-25

发表评论

登录后才能评论

评论列表(0条)

    保存