基于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>

3SFE_BMP180 pressure;

4double baseline; // baseline pressure

5

6void setup()

7{

8 Serial.begin(9600);

9 Serial.print("重启中");

10 Serial.print(",正在获取最新校准值");

11if (pressure.begin())

12 {

13int i;

14for(i=0;i<3;i++){

15 Serial.print(".");

16 delay(1000);}

17 Serial.println();

18 Serial.println("BMP180传感器初始化成功");

19 }

20else

21 {

22 Serial.println("BMP180传感器初始化失败 (请检查连接是否正确)

");

23while(1);

24 }

25 baseline = getPressure();

26 Serial.print("海平面气压: ");

27 Serial.print(baseline);

28 Serial.println(" 百帕");

29}

30

31void loop()

32{

33double 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("相对高度: ");

40if (a >= 0.0) Serial.print(""); // add a space for positive numbers

41 Serial.print(a,2);

42 Serial.print(" 米, ");

43 status = pressure.startTemperature();

44if(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

56double getPressure()

57{

58char status;

59double T,P,p0,a;

60 status = pressure.startTemperature();

61if (status != 0)

62 {

63 delay(status);

64 status = pressure.getTemperature(T);

65if (status != 0)

66 {

67 status = pressure.startPressure(3);

68if (status != 0)

69 {

70for a number of pressure measurements.)

71 status = pressure.getPressure(P,T);

72if (status != 0)

73 {

74return(P);

75 }

76else Serial.println("error retrieving pressure measurement

");

77 }

78else Serial.println("error starting pressure measurement

");

79 }

80else Serial.println("error retrieving temperature measurement

");

81 }

82else Serial.println("error starting temperature measurement

");

83 }

工作原理:

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

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

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

4、输出打印。


 

 总结:

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

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

以上是 基于arduino的气象站 的全部内容, 来源链接: utcz.com/z/513699.html

回到顶部