아두이노 코딩-86: 대기압 측정센서 BMP180에 의한 NodeMCU보드의 I2C 센서 인터페이스 D1(GPIO5), D2(GPIO4) 검증
BMP180 대기압/온도/고도 센서는 자동차 부품 메이커로 유명한 보쉬(Bosch)사 제품이다. 아두이노 보드에서 BMP180을 사용하여 대기압을 측정하기 위해 I2C 인터페이스를 사용한다. 특히 아두이노 보드 중에 WiFi 지원이 가능한 NodeMCU 보드를 사용할 때에 데이터 핀들의 배치가 아두이노 우노와 판이하게 다르기 때문에 어느 핀들을 사용해야 될지 알아보기로 한다.
I2C 인터페이스를 사용하는 BMP180 센서에 의해 NodeMCU 보드를 사용하여 대기 압력을 측정하려면 SCL, SDA에 해당하는 D1 핀과 D2 핀을 사용하도록 한다. 사진을 참고로 하여 BMP 180센서를 NodeMCU에서 다음과 같이 배선 작업을 수행한다.
SCL -> D1 GPIO 5
SDA -> D2 GPIO 4
GND -> GND
3V3 -> 3V3
BMP180에 가해주는 전압은 3.3∼5V 이며 저전력 보드인 NodeMCU에서 3.3V 핀을 사용하도록 하자. 여기에서는 NodeMCU 의 와이파이 기능을 사용하지 않고 단순히 아두이노 우노 보드를 사용하듯이 측정 대기압과 온도값을 시리얼모니터로 관찰하기로 하자. BMP180 센서로 측정이 가능한 대기압 범위는 300∼1100 hPa 이다. 맑은 가을날 기준 지상에서 1기압은 1013 hPa에 해당하며 태풍이 부는 장마철 저기압 때는 대략 990 hPa 안팎의 값을 보여 준다. 아울러 온도 값도 측정이 가능한데 오차 범위가 ∓2℃ 이다.
사진에서는 NodeMCU 보드에 DHT11 온습도 센서도 이미 설치되어 있다. 하지만 이번 코딩과는 아무런 연관성이 없음에 유의하자.
I2C 인터페이스 사용 시 헤더 영역에서 Wire.h 라이브러리 설치가 필수적이다. 아울러 BMP180 센서 사용에 따라 Adafruit 사가 지원하는 Adafruit_BMP085_U.h 라이브러리를 반드시 설치하도록 하자. 이 라이브러리 zip 파일은 필요하면 다음의 필자의 사이트를 방문하여 다운 받도록 하자. http://blog.daum.net/ejleep1/329
NodeMCU_barometer_01 코드를 컴파일 업로딩하여 시리얼 모니터 데이터를 살펴보자.
현재 대기압이 태풍의 영향권에 있어 다소 저기압인 988 hPa 로 표시되고 있다. 1기압이 1013 hPa 임을 참조하자.
BMP180센서는 아두이노 우노 보드에도 설치가 가능하다. 아날로그 핀 A4, A5 가 각각 SDA, SCL 에 해당한다. 반대편의 SCL, SDA 핀들에 직접 연결해도 무방하다.
//NodeMCU_barometer_01
#include <Wire.h>
#include <Adafruit_BMP085_U.h>
/*
NodeMCU I2C Pin Connections
===========
Connect SCL to D 1: GPIO 5
Connect SDA to D 2: GPIO 4
Connect VDD to 3.3V DC
Connect GROUND to common ground
*/
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
void displaySensorDetails(void) {
sensor_t sensor;
bmp.getSensor(&sensor);
Serial.println("------------------------------------");
Serial.print ("Sensor: "); Serial.println(sensor.name);
Serial.print ("Driver Ver: "); Serial.println(sensor.version);
Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id);
Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" hPa");
Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" hPa");
Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" hPa");
Serial.println("------------------------------------");
Serial.println("");
delay(500);
}
void setup(void)
{
Serial.begin(9600);
Serial.println("Pressure Sensor Test"); Serial.println("");
/* Initialise the sensor /
if(!bmp.begin())
{
/ There was a problem detecting the BMP085 ... check your connections */
Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");
while(1);
}
/* Display some basic information on this sensor */
displaySensorDetails();
}
void loop(void)
{
/* Get a new sensor event */
sensors_event_t event;
bmp.getEvent(&event);
/* Display the results (barometric pressure is measure in hPa) /
if (event.pressure)
{
/ Display atmospheric pressue in hPa */
Serial.print("Pressure: ");
Serial.print(event.pressure);
Serial.println(" hPa");
float temperature;
bmp.getTemperature(&temperature);
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" C");
}
else
{
Serial.println("Sensor error");
}
delay(1000);
}//프로그램 끝