• 基于arduino的气象站


    bmp180的简介:

    • 压力范围:300~1100hPa(海拔 9000 米~-500 米)
    
    • 电源电压:1.8V~3.6V(VDDA), 1.62V~3.6V(VDDD)
    
    • 尺寸:3.6mmx3.8x0.93mm
    
    • 低功耗:5μA,在标准模式
    
    • 高精度:低功耗模式下,分辨率为 0.06hPa(0.5 米)
    
    • 高线性模式下,分辨率为 0.03hPa(0.25 米)
    
    • 含温度输出
    
    • I2C 接口
    
    • 温度补偿
    
    • MSL 1 反应时间:7.5ms
    
    • 待机电流:0.1μA

    可以同时获得所处环境的温度和气压,甚至还可以通过气压、温度间接求出海拔,此换算过程较为复杂,可自行百度,在此给出数值较为粗糙的公式:(p0指的是标准海平面大气压,并不是此时此地的海拔为0m的大气压,p0=101.325kpa)

                                                     

    凭个人观点,相比于温湿度传感器dht11,实现的功能可能会更多一些,但不知道,两者哪个精度会高一点。dht11是数字信号输入,bmp系列是模拟信号输入,但是我发现利用公式测算的海拔高度altitude时钟为负值,不知道这是什么情况,暂时且用fabs函数套上,转换为绝对值。

    年前tb了一个bmp180的传感器,想用arduino获得实现的可能。当然bmp085也可以,我才用的库就是bmp085的库,当时网络上找不到bmp180的库,甚至动用了某工具。还有,最近在国内似乎连不上arduino的库管理器,于是我从GitHub那获得了库文件,链接在此:https://github.com/drophair/BMP180-BMP085(这个库比较早,而且bmp085已经停产了,其中计算海拔的方法粗在错误)https://github.com/drophair/bmp180(这个是专门用于bmp180的,不妨两个都试一下,而且不用自己去推算海拔,有自己封装的函数,直接就可以用了)

    注意,利用以上公式求的是绝对海拔,误差较大;相比之下,可以计算相对海拔,其计算原理下文详细介绍。

    接线方式:
    arduino bmp180
    ---------------------- VIN VCC GND GND SCL A5 SDA A4

     代码:

     1 #include <SFE_BMP180.h>
     2 #include <Wire.h>
     3 SFE_BMP180 pressure;
     4 double baseline; // baseline pressure
     5 
     6 void setup()
     7 {
     8   Serial.begin(9600);
     9   Serial.print("重启中");
    10   Serial.print(",正在获取最新校准值");
    11   if (pressure.begin())
    12   {
    13     int i;
    14     for(i=0;i<3;i++){
    15     Serial.print(".");
    16     delay(1000);}
    17     Serial.println();
    18     Serial.println("BMP180传感器初始化成功");
    19   }
    20   else
    21   {
    22     Serial.println("BMP180传感器初始化失败  (请检查连接是否正确)
    
    ");
    23     while(1); 
    24   }
    25   baseline = getPressure();
    26   Serial.print("海平面气压: ");
    27   Serial.print(baseline);
    28   Serial.println(" 百帕");  
    29 }
    30 
    31 void loop()
    32 {
    33   double a,P,T,status;
    34   P = getPressure();
    35   a = pressure.altitude(P,baseline);
    36   Serial.print("实时气压: ");
    37   Serial.print(P,2);
    38   Serial.print(" 百帕, ");
    39   Serial.print("相对高度: ");
    40   if (a >= 0.0) Serial.print(" "); // add a space for positive numbers
    41   Serial.print(a,2);
    42   Serial.print(" 米, ");
    43   status = pressure.startTemperature();
    44   if(status!=0)
    45   {
    46     delay(status);
    47     status = pressure.getTemperature(T);
    48   
    49   Serial.print("温度: ");
    50   Serial.print(T,2);
    51   Serial.println(" 摄氏度");
    52   }
    53   delay(1000);
    54 }
    55  
    56 double getPressure()
    57 {
    58   char status;
    59   double T,P,p0,a;
    60   status = pressure.startTemperature();
    61   if (status != 0)
    62   {
    63     delay(status);
    64     status = pressure.getTemperature(T);
    65     if (status != 0)
    66     {
    67       status = pressure.startPressure(3);
    68       if (status != 0)
    69       {
    70          for a number of pressure measurements.)
    71                status = pressure.getPressure(P,T);
    72         if (status != 0)
    73         {
    74           return(P);
    75         }
    76         else Serial.println("error retrieving pressure measurement
    ");
    77       }
    78       else Serial.println("error starting pressure measurement
    ");
    79     }
    80     else Serial.println("error retrieving temperature measurement
    ");
    81   }
    82   else Serial.println("error starting temperature measurement
    ");
    83 }

    工作原理:

    1、首先传感器会进行一次重启,之后才会正常工作;

    2、内部先进行10次大气压的测量,然后计算平均值,作为基准压强(baseline);

    3、先测一次温度,然后再测大气压,若大气压的值较为稳定则利用内部的封装函数,直接求得(至于封装函数是怎么样的就不去深究了),若大气压不稳定就会一直等待稳定的时候,因此不管怎么设置delay,时间间隔都会有偏差;

    4、输出打印。


     总结:

    代码在example中就有只是将多个示例结合为一个整体代码。

    目前只在arduino上进行搭建,未来还会继续增加温湿度传感器dht11;由于对软串口、串口通讯等方面的不了解,无法在esp8266上实现一旦时机成熟最终会整体移植到esp8266、树莓派上。

  • 相关阅读:
    UI涂鸦板设计代码
    UI简单计算器设计代码
    用户需求、己、竞争对手的关系
    总结一下,以软件开发生命周期来说明不同的测试的使用情况
    谈软件工程和计算机科学的区别
    有人认为,”中文编程“是解决中国程序员编程效率的秘密武器,请问它是一个“银弹”吗?
    安装Eclipse SVN插件
    UI中横屏竖屏切换的一些方法(转)
    Object-C总结
    js备忘录
  • 原文地址:https://www.cnblogs.com/jackwang-sparrow/p/12327562.html
Copyright © 2020-2023  润新知