본문 바로가기

아두이노

BMP180 : 고도센서, 기압센서, 온도센서 아두이노 실습코드

반응형


BMP180 : 고도센서, 기압센서, 온도센서 아두이노 실습코드


BMP180은 BMP085의 상위모델로 기압센서다. 기압 측정값을 이용해서 고도로 변환이 가능하다. 우선 BMP180 디지털 압력센서 데이터 쉬트는 아래 링크를 참고한다. 

BMP180 Digital pressure sensor - https://cdn-shop.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf

센서 사용법과 데이터 쉬트에 대한 자세한 설명은 아래 링크를 참고한다.

BMP180 고도/압력 Barometer GY-68 3.3/5V 레귤레이터 내장형 센서 메뉴얼 - http://www.jkelec.co.kr/img/sensors/manual/bmp180_gy68/bmp180_gy68_manual.html

일단 라이브러리를 다운 받는데 Git 사이트에 가면 판매처를 안내하는 아래 링크가 있다. 참고 한다. 

A powerful but easy to use BMP085/BMP180 Library 

라이브러리 다운은 아래에서 하는데 오른쪽 clone or download 버튼을 클릭하고 download zip 항목을 선택하여 다운 받는다.

압축을 풀면 다음 폴더가 생긴다. Adafruit-BMP085-Library-master 폴더를 통채로 카피하여 아두이노가 설치된 폴더의 라이브러리 폴더에 카피한다. 보통 C:\Program Files (x86)\Arduino\libraries 아래에 카피하면 될 것이다. 

이름이 180이 아니라 085 인 것은 상관 없다 동일한 결과를 출력한다. 

아두이노 스케치를 종료하고 다시 실행시킨다. [파일 - 예제] 항목에서 [모든 보드의 예제] 아래에 보면 방금 라이브러리 폴더에 카피한 Adafruit BMP085 Library 항목을 선택하여 파일 이름이 BMP085test 인 파일을 연다. 

연결 회로도는 아래 그림을 참고한다.

BMP180 아두이노 회로 구성도( BMP180 Arduino circuit diagram )

이미지 출처: https://fishpoint.tistory.com/2761 [기린]

아래의 BMP180 Sample Source 코드 샘플 3개를 참고한다. 

파이선 소스 출처: https://driz2le.tistory.com/64

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <Wire.h>
#include <Adafruit_BMP085.h>
 
void setup() {
  Serial.begin(9600);
  BMP180init();
}
 
void loop() {
 BMP180exec();
 delay(1000); 
}
 
Adafruit_BMP085 bmp;
 
void BMP180init() {
    if (!bmp.begin(BMP085_ULTRAHIGHRES)) {
        Serial.println("BMP180 센서를 찾을 수 없습니다. 연결을 확인해 주세요!");
    }
}
 
void BMP180exec() {
    float Ftemperature = 0.0;    // 온도 측정 값
    float Fpressure    = 0.0;    // 기압 측정 값
    float Faltitude    = 0.0;    // 고도 측정 값
 
    Ftemperature =  bmp.readTemperature();
    Fpressure    =  bmp.readPressure();
    Faltitude    =  bmp.readAltitude( 100560 );     // 101560 : 서울 해면기압, 101325 : 표준기압
 
    char CAtemperature [20= ""
    char CApressure    [20= ""
    char CAaltitude    [20= ""
    char CAbuffer      [254= "";
    dtostrf( Ftemperature, 102, CAtemperature );
    dtostrf( Fpressure   , 102, CApressure    );
    dtostrf( Faltitude   , 102, CAaltitude    );
 
    // 온도 압력 고도
    sprintf( CAbuffer, "Temp(C): %s\tPres(PA): %s\tAlt(M): %s", CAtemperature, CApressure, CAaltitude );
    Serial.println( CAbuffer );
    // TEST
    //Serial.print( "temp(C): "    ); Serial.print  ( Ftemperature );
    //Serial.print( "\tpres(Pa): " ); Serial.print  ( Fpressure    );
    //Serial.print( "\talti(M) : " ); Serial.println( Faltitude    );
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <Wire.h>
#include <Adafruit_BMP085.h>
 
 
void setup() {
  Serial.begin(9600);
  BMP180init();
}
  
void loop() {
 BMP180exec();
 delay(1000); 
}
 
 
Adafruit_BMP085 bmp;
 
void BMP180init() {
 if (!bmp.begin(BMP085_ULTRAHIGHRES)) {
  Serial.println("BMP180 센서를 찾을 수 없습니다. 연결을 확인해 주세요!");
 }
}
  
void BMP180exec() {
 float temperature = 0.0;  // 온도 측정 값들
 float pressure    = 0.0;     // 기압 측정 값들
 float altitude    = 0.0;     // 고도 측정 값들
 
    temperature =  bmp.readTemperature();
    pressure    =  bmp.readPressure();
    altitude =  bmp.readAltitude(101340);
 
    Serial.print("temperature(℃): "); Serial.print(temperature);
    Serial.print("\tpressure(Pa): "); Serial.print(pressure);
    Serial.print("\taltitude(M): ");  Serial.print(altitude);
 
    /*
     * 고도 계산을 표준 기압 1013.25 millibar를 사용하여 계산합니다.
     * 1013.25 mbar = 101325 Pa(Pascal)입니다.
     */
    Serial.print("\tbase altitude(M): ");   Serial.print(bmp.readAltitude());
    Serial.print("\tSea Level(Pa - X): "); Serial.print(bmp.readSealevelPressure());
    Serial.println( " " );
 
/*
 * 기상청 지역별상세관측자료(AWS)에 들어가면 해면 기압 정보를 얻을 수
 * 있습니다. 이 mbar(millibar)값에 100을 곱하면 Pa(Pascal) 값을 얻을
 * 수 있습니다.
 *
 * 1 hPa =  100 Pa =  1 mbar
 * 1 kPa = 1000 Pa = 10 mbar
 *
 * http://www.kma.go.kr/weather/observation/aws_table_popup.jsp
 *
 * 2014/09/11/22:21 - 1013.4 mbar
 *
 */


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*************************************************** 
  This is an example for the BMP085 Barometric Pressure & Temp Sensor
 
  Designed specifically to work with the Adafruit BMP085 Breakout 
  ----> https://www.adafruit.com/products/391
 
  These displays use I2C to communicate, 2 pins are required to  
  interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!
 
  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/
 
#include <Wire.h>
#include <Adafruit_BMP085.h>
 
const int CIrowSize = 20;
 
int index = 0;                    // 현재 센서값을 넣어야 할 인덱스
float temperatures[CIrowSize];  // 온도 측정 값들
float pressures[CIrowSize];     // 기압 측정 값들
float altitudes[CIrowSize];     // 고도 측정 값들
float totalTemperature = 0.0;     // 온도 총합
float totalPressure = 0.0;        // 기압 총합
float totalAltitude = 0.0;        // 고도 총합
 
/*
 * mode :
 *        BMP085_ULTRALOWPOWER 0
 *        BMP085_STANDARD      1
 *        BMP085_HIGHRES       2
 *        BMP085_ULTRAHIGHRES  3
 *
 */
void setup() {
  Serial.begin(9600);
  BMP180init();
}
  
void loop() {
 BMP180exec();
 delay(1000); 
}
 
 
Adafruit_BMP085 bmp;
 
void BMP180init() {
 if (!bmp.begin(BMP085_ULTRAHIGHRES)) {
  Serial.println("BMP180 센서를 찾을 수 없습니다. 연결을 확인해 주세요!");
 }
 
 for(int i = 0; i < CIrowSize; i++) {
  temperatures[i] = 0.0;
  pressures[i] = 0.0;
 }
}
  
void BMP180exec() {
 
 
    totalTemperature    =  totalTemperature - temperatures[index];
    temperatures[index] =  bmp.readTemperature();
    totalTemperature    += temperatures[index];
   
    totalPressure   =  totalPressure - pressures[index];
    pressures[index]  =  bmp.readPressure();
    totalPressure   += pressures[index];
 
 
    totalAltitude   =  totalAltitude - altitudes[index];
    altitudes[index]  =  bmp.readAltitude(101340);
    totalAltitude   += altitudes[index];
 
 
    Serial.print("측정 온도(℃): "); Serial.print(totalTemperature / CIrowSize);
    Serial.print("측정 압력(Pa): "); Serial.print(totalPressure / CIrowSize);
    Serial.print("측정 고도(M): ");  Serial.print(totalAltitude / CIrowSize);
 
    /*
     * 고도 계산을 표준 기압 1013.25 millibar를 사용하여 계산합니다.
     * 1013.25 mbar = 101325 Pa(Pascal)입니다.
     */
    Serial.print("표준 고도(M): ");  Serial.print(bmp.readAltitude());
    Serial.print("해면 기압(Pa - X): ");  Serial.print(bmp.readSealevelPressure());
    Serial.println( " " );
 
/*
 * 기상청 지역별상세관측자료(AWS)에 들어가면 해면 기압 정보를 얻을 수
 * 있습니다. 이 mbar(millibar)값에 100을 곱하면 Pa(Pascal) 값을 얻을
 * 수 있습니다.
 *
 * 1 hPa =  100 Pa =  1 mbar
 * 1 kPa = 1000 Pa = 10 mbar
 *
 * http://www.kma.go.kr/weather/observation/aws_table_popup.jsp
 *
 * 2014/09/11/22:21 - 1013.4 mbar
 *
 */
 
 
 
    ++index;
    
  // 만약 배열의 끝에 있다면...
  if (index >= CIrowSize)              
    // ...배열의 처음으로 돌아가게 합니다: 
    index = 0;
     
 
}


반응형