이 튜토리얼에서는 BMP280 센서와 Arduino UNO 보드, OLED 디스플레이를 사용하여 온도, 기압, 고도를 측정하는 방법을 설명합니다. BMP280 데이터시트의 주요 사양은 다음과 같습니다.
이 프로젝트에서는 미터법과 야드법 단위로 모두 측정값을 표시합니다. 단위 변환은 코드에서 쉽게 조정할 수 있습니다.
테스트 및 문제 해결
모듈 배선 후, 라이브러리 예제 코드인 BMP280test를 실행하여 센서가 정상적으로 인식되는지 확인하세요. 만약 아래 그림처럼 센서가 감지되지 않는다면:
I2C 스캐너 코드를 실행하세요(이때 LCD나 OLED 같은 다른 I2C 장치는 분리하세요). 센서가 고장 나지 않았고 납땜에 문제가 없다면 스캐너에서 장치 주소를 찾을 수 있습니다.
찾은 주소를 메모한 후 라이브러리의 C++ 파일을 수정해야 합니다. 라이브러리는 보통 Documents/Arduino/Libraries 폴더에 설치되어 있습니다. 적절한 에디터(예: Dev C++)로 파일을 열고 41번째 줄의 _i2caddr 값을 스캐너에서 찾은 주소로 변경하세요.
저장 후 테스트 코드를 다시 실행하면 정상적으로 작동할 것입니다.
테스트 사진
문제가 있으면 댓글로 남겨주세요.
코드
다음 4가지 버전의 코드가 제공됩니다:
bmp280_Serial_metric.ino - 시리얼 모니터 출력 (미터법)
bmp280_Serial_Imperial.ino - 시리얼 모니터 출력 (야드법)
bmp280_OLED_m.ino - OLED 디스플레이 출력 (미터법)
bmp280_OLED_US.ino - OLED 디스플레이 출력 (야드법)
bmp280_Serial_metric.ino (미터법)
/* Adafruit BMP280 미터법 예제
* 온도, 기압, 고도를 시리얼 모니터에 출력
* Adafruit 예제 코드 수정 버전
* 출처: www.surtrtech.com 또는 SurtrTech 유튜브 채널 */
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C 인터페이스
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bmp.begin()) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
/* 데이터시트 기본 설정 */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, // 동작 모드
Adafruit_BMP280::SAMPLING_X2, // 온도 오버샘플링
Adafruit_BMP280::SAMPLING_X16, // 기압 오버샘플링
Adafruit_BMP280::FILTER_X16, // 필터링
Adafruit_BMP280::STANDBY_MS_500); // 대기 시간
}
void loop() {
Serial.print(F("Temperature = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure()/100); // hPa 단위로 표시
Serial.println(" hPa");
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(1019.66)); // 해수면 기압(hPa) 입력, 지역값으로 수정
Serial.println(" m");
Serial.println();
delay(2000);
}
bmp280_Serial_Imperial.ino (야드법)
/* Adafruit BMP280 야드법 예제
* 온도(℉), 기압(inHg), 고도(ft)를 시리얼 모니터에 출력 */
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bmp.begin()) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
}
void loop() {
float f = bmp.readTemperature()*9/5 + 32; // ℃ → ℉ 변환
Serial.print(F("Temperature = "));
Serial.print(f);
Serial.println(" *F");
float P = bmp.readPressure()/3386.39; // Pa → inHg 변환
Serial.print(F("Pressure = "));
Serial.print(P);
Serial.println(" inHg");
float A = bmp.readAltitude(1019.66)*3.28084; // m → ft 변환
Serial.print(F("Approx altitude = "));
Serial.print(A);
Serial.println(" ft");
Serial.println();
delay(2000);
}