极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: eagler8

【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)

[复制链接]
 楼主| 发表于 2019-7-24 20:35:19 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-24 20:38:24 | 显示全部楼层
主要特点
压力范围:300~1100hPa(海拔9000米~-500米)
电源电压:1.8V~3.6V(VDDA),1.62V~3.6V(VDDD) VIN需要5V
LCC8封装:无铅陶瓷载体封装(LCC)
低功耗:5μA,在标准模式
高精度:低功耗模式下,分辨率为0.06hPa(0.5米)
高线性模式下,分辨率为0.03hPa(0.25米)
含温度输出
I2C接口
温度补偿
无铅,符合RoHS规范
MSL 1反应时间:7.5ms
待机电流:0.1μA
无需外部时钟电路

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-24 20:50:44 | 显示全部楼层
技术数据
压力范围300……1100 hPa
均方根噪声中表达压力0.06 hPa typ。(超低功耗模式)
0.02 hPa typ。(超高分辨率模式)
均方根噪声中表达高度0.5 m,typ。(超低功耗模式)
0.17米,typ。(超高分辨率模式)
相对精度的压力
VDD = 3.3 v 950……1050 hPa / hPa±0.12
@ 25°C / m±1.0
700年……900 hPa / hPa±0.12
25…40°C / m±1.0
绝对精度
p = 300…1100 hpa
(温度= 0…+ 65°C,VDD = 3.3。-4.0 V)压力:……+ 2.0 hPa
温度:±1°C,typ。
平均电流消耗(1 Hz刷新率数据)
峰值电流3μA典型(超低功耗模式)
32μA,典型的(高级模式)
650μA,典型的
待机电流1.62……3.6 V
电源电压vddio 1.62……3.6 V
电源电压vdd 1.8……3.6 V
操作温度。
范围全面准确”40…+ 85°C
0…+ 65°C
conv压力。5毫秒,典型的(标准模式)
I2C传输速率3.4 MHz,马克斯。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-24 21:00:47 | 显示全部楼层
典型应用
GPS精准导航(航位推算,上下桥检测等)
室内室外导航
休闲、体育和医疗健康等监测
天气预报
垂直速度指示(上升/下沉速度)
风扇功率控制
体育设备,如高度剖面

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-24 21:04:28 | 显示全部楼层
BMP180 新款 BOSCH温度模块气压传感器

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-25 06:33:52 | 显示全部楼层
BMP180气压模块是一款高精度、小体积、低能耗的压力传感器,可以应用在移动设备中,它的性能卓越,绝对精度最低可以达到0.03hPa,并且耗电极低,只有3μA。BMP180采用强大的8-pin陶瓷无引线芯片承载(LCC)超薄封装,可以通过I2C总线直接与各种微处理器相连。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-25 06:36:46 | 显示全部楼层
特性曲线

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-25 07:29:22 | 显示全部楼层
模块电原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-25 07:33:53 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-25 07:53:41 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-25 08:06:51 | 显示全部楼层
需要用的 “SFE_BMP180” 库文件如下
SFE_BMP180.h
  1. /*
  2. 【Arduino】66种传感器模块系列实验(68)
  3. 实验六十八:BMP180 新款 BOSCH温度模块气压传感器(代替BMP085)
  4. SFE_BMP180.h
  5. */

  6. #ifndef SFE_BMP180_h
  7. #define SFE_BMP180_h

  8. #if defined(ARDUINO) && ARDUINO >= 100
  9. #include "Arduino.h"
  10. #else
  11. #include "WProgram.h"
  12. #endif

  13. class SFE_BMP180
  14. {
  15.     public:
  16.         SFE_BMP180();

  17.         char begin();
  18.             shorted?)
  19.         
  20.         char startTemperature(void);
  21.            
  22.         char getTemperature(double &T);
  23.             startTemperature command
  24.             
  25.         char startPressure(char oversampling);
  26.             
  27.         char getPressure(double &P, double &T);
  28.             startPressure command           

  29.         double sealevel(double P, double A);
  30.            weather data)
  31.            
  32.         double altitude(double P, double P0);
  33.            sea-level, runway, etc.)
  34.             
  35.         char getError(void);
  36.             
  37.     private:
  38.    
  39.         char readInt(char address, int16_t &value);
  40.            
  41.         char readUInt(char address, uint16_t &value);
  42.          
  43.         char readBytes(unsigned char *values, char length);
  44.             
  45.             
  46.         char writeBytes(unsigned char *values, char length);
  47.             subsequent registers)
  48.             
  49.         int16_t AC1,AC2,AC3,VB1,VB2,MB,MC,MD;
  50.         uint16_t AC4,AC5,AC6;
  51.         double c5,c6,mc,md,x0,x1,x2,y0,y1,y2,p0,p1,p2;
  52.         char _error;
  53. };

  54. #define BMP180_ADDR 0x77

  55. #define BMP180_REG_CONTROL 0xF4
  56. #define BMP180_REG_RESULT 0xF6

  57. #define BMP180_COMMAND_TEMPERATURE 0x2E
  58. #define BMP180_COMMAND_PRESSURE0 0x34
  59. #define BMP180_COMMAND_PRESSURE1 0x74
  60. #define BMP180_COMMAND_PRESSURE2 0xB4
  61. #define BMP180_COMMAND_PRESSURE3 0xF4
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-25 08:20:11 | 显示全部楼层
SFE_BMP180.cp
  1. /*
  2. 【Arduino】66种传感器模块系列实验(68)
  3. 实验六十八:BMP180 新款 BOSCH温度模块气压传感器(代替BMP085)
  4. SFE_BMP180.cp
  5. */

  6. #include <SFE_BMP180.h>
  7. #include <Wire.h>
  8. #include <stdio.h>
  9. #include <math.h>

  10. SFE_BMP180::SFE_BMP180()
  11. {
  12. }

  13. char SFE_BMP180::begin()

  14. {
  15.     double c3,c4,b1;
  16.    
  17.     Wire.begin();

  18.     if (readInt(0xAA,AC1) &&
  19.         readInt(0xAC,AC2) &&
  20.         readInt(0xAE,AC3) &&
  21.         readUInt(0xB0,AC4) &&
  22.         readUInt(0xB2,AC5) &&
  23.         readUInt(0xB4,AC6) &&
  24.         readInt(0xB6,VB1) &&
  25.         readInt(0xB8,VB2) &&
  26.         readInt(0xBA,MB) &&
  27.         readInt(0xBC,MC) &&
  28.         readInt(0xBE,MD))
  29.     {

  30. AC6 = 23153;
  31.         
  32. Calcs.pdf
  33.         
  34. 25671; AC6 = 18974;

  35.         c3 = 160.0 * pow(2,-15) * AC3;
  36.         c4 = pow(10,-3) * pow(2,-15) * AC4;
  37.         b1 = pow(160,2) * pow(2,-30) * VB1;
  38.         c5 = (pow(2,-15) / 160) * AC5;
  39.         c6 = AC6;
  40.         mc = (pow(2,11) / pow(160,2)) * MC;
  41.         md = MD / 160.0;
  42.         x0 = AC1;
  43.         x1 = 160.0 * pow(2,-13) * AC2;
  44.         x2 = pow(160,2) * pow(2,-25) * VB2;
  45.         y0 = c4 * pow(2,15);
  46.         y1 = c4 * c3;
  47.         y2 = c4 * b1;
  48.         p0 = (3791.0 - 8.0) / 1600.0;
  49.         p1 = 1.0 - 7357.0 * pow(2,-20);
  50.         p2 = 3038.0 * 100.0 * pow(2,-36);

  51.         return(1);
  52.     }
  53.     else
  54.     {
  55.       
  56.         return(0);
  57.     }
  58. }

  59. char SFE_BMP180::readInt(char address, int16_t &value)

  60. {
  61.     unsigned char data[2];

  62.     data[0] = address;
  63.     if (readBytes(data,2))
  64.     {
  65.         value = (int16_t)((data[0]<<8)|data[1]);
  66.         
  67. negative
  68.         return(1);
  69.     }
  70.     value = 0;
  71.     return(0);
  72. }

  73. char SFE_BMP180::readUInt(char address, uint16_t &value)

  74. {
  75.     unsigned char data[2];

  76.     data[0] = address;
  77.     if (readBytes(data,2))
  78.     {
  79.         value = (((uint16_t)data[0]<<8)|(uint16_t)data[1]);
  80.         return(1);
  81.     }
  82.     value = 0;
  83.     return(0);
  84. }

  85. char SFE_BMP180::readBytes(unsigned char *values, char length)

  86. {
  87.     char x;

  88.     Wire.beginTransmission(BMP180_ADDR);
  89.     Wire.write(values[0]);
  90.     _error = Wire.endTransmission();
  91.     if (_error == 0)
  92.     {
  93.         Wire.requestFrom(BMP180_ADDR,length);
  94.         while(Wire.available() != length) ;
  95.         for(x=0;x<length;x++)
  96.         {
  97.             values[x] = Wire.read();
  98.         }
  99.         return(1);
  100.     }
  101.     return(0);
  102. }

  103. char SFE_BMP180::writeBytes(unsigned char *values, char length)

  104. {
  105.     char x;
  106.    
  107.     Wire.beginTransmission(BMP180_ADDR);
  108.     Wire.write(values,length);
  109.     _error = Wire.endTransmission();
  110.     if (_error == 0)
  111.         return(1);
  112.     else
  113.         return(0);
  114. }

  115. char SFE_BMP180::startTemperature(void)

  116. {
  117.     unsigned char data[2], result;
  118.    
  119.     data[0] = BMP180_REG_CONTROL;
  120.     data[1] = BMP180_COMMAND_TEMPERATURE;
  121.     result = writeBytes(data, 2);
  122.     if (result)
  123.         return(5);
  124.     else
  125.         return(0);
  126. }

  127. char SFE_BMP180::getTemperature(double &T)

  128. {
  129.     unsigned char data[2];
  130.     char result;
  131.     double tu, a;
  132.    
  133.     data[0] = BMP180_REG_RESULT;

  134.     result = readBytes(data, 2);
  135.     if (result)
  136.     {
  137.         tu = (data[0] * 256.0) + data[1];
  138.         
  139.         a = c5 * (tu - c6);
  140.         T = a + (mc / (a + md));

  141.     }
  142.     return(result);
  143. }


  144. char SFE_BMP180::startPressure(char oversampling)

  145. {
  146.     unsigned char data[2], result, delay;
  147.    
  148.     data[0] = BMP180_REG_CONTROL;

  149.     switch (oversampling)
  150.     {
  151.         case 0:
  152.             data[1] = BMP180_COMMAND_PRESSURE0;
  153.             delay = 5;
  154.         break;
  155.         case 1:
  156.             data[1] = BMP180_COMMAND_PRESSURE1;
  157.             delay = 8;
  158.         break;
  159.         case 2:
  160.             data[1] = BMP180_COMMAND_PRESSURE2;
  161.             delay = 14;
  162.         break;
  163.         case 3:
  164.             data[1] = BMP180_COMMAND_PRESSURE3;
  165.             delay = 26;
  166.         break;
  167.         default:
  168.             data[1] = BMP180_COMMAND_PRESSURE0;
  169.             delay = 5;
  170.         break;
  171.     }
  172.     result = writeBytes(data, 2);
  173.     if (result)
  174.         return(delay);
  175.     else
  176.         return(0);
  177. }


  178. char SFE_BMP180::getPressure(double &P, double &T)

  179. sealevel().
  180. {
  181.     unsigned char data[3];
  182.     char result;
  183.     double pu,s,x,y,z;
  184.    
  185.     data[0] = BMP180_REG_RESULT;

  186.     result = readBytes(data, 3);
  187.     if (result)
  188.     {
  189.         pu = (data[0] * 256.0) + data[1] + (data[2]/256.0);
  190.         
  191.         s = T - 25.0;
  192.         x = (x2 * pow(s,2)) + (x1 * s) + x0;
  193.         y = (y2 * pow(s,2)) + (y1 * s) + y0;
  194.         z = (pu - x) / y;
  195.         P = (p2 * pow(z,2)) + (p1 * z) + p0;

  196.     }
  197.     return(result);
  198. }


  199. double SFE_BMP180::sealevel(double P, double A)

  200. {
  201.     return(P/pow(1-(A/44330.0),5.255));
  202. }

  203. double SFE_BMP180::altitude(double P, double P0)

  204. {
  205.     return(44330.0*(1-pow(P/P0,1/5.255)));
  206. }


  207. char SFE_BMP180::getError(void)
  208.    
  209. {
  210.     return(_error);
  211. }

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-25 08:38:56 | 显示全部楼层
接线方式
1.先连接芯片与单片机(通过I2C接口),按照如下方式连接
5V—VIN
GND–GND
A5—SCL
A4—SDA
2.然后UNO通过usb与PC电脑连接
3.拷贝后面的代码烧录进Arduino

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-25 11:05:48 | 显示全部楼层
  1. /*
  2. 【Arduino】66种传感器模块系列实验(68)
  3. 实验六十八:BMP180 新款 BOSCH温度模块气压传感器(代替BMP085)
  4. 程序之一
  5. */

  6. #include <SFE_BMP180.h>

  7. SFE_BMP180 AirPresure;
  8. char presureDelayTime;
  9. double presureP, presureT;

  10. void setup() {
  11.   Serial.begin(9600);
  12.   AirPresure.begin();
  13. }

  14. void loop()
  15. {
  16.   presureDelayTime = AirPresure.startPressure(3);
  17.   if (presureDelayTime != 0)
  18.   {
  19.     delay(presureDelayTime);
  20.     presureDelayTime = AirPresure.getPressure(presureP, presureT);
  21.     if (presureDelayTime != 0)
  22.     {
  23.       
  24.       Serial.print("Current Preasure: ");
  25.       Serial.print(presureP);
  26.       Serial.println(" bar");

  27.       Serial.print(presureP);
  28.       Serial.print(" bar is");
  29.       Serial.print(presureP / 1000.0);
  30.       Serial.println(" atm");
  31.     }
  32.     else
  33.     {
  34.       Serial.println("ERROR");
  35.     }
  36.   }
  37.   else
  38.   {
  39.     Serial.println("ERROR");
  40.   }
  41.   delay(1000);
  42. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-25 11:13:13 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-10 02:46 , Processed in 0.043410 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表