산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

BMP280과 Arduino UNO로 온도, 기압, 고도 정확히 측정하기

부품 및 소모품

Arduino UNO 1
Adafruit BMP280 센서 모듈 1
Adafruit OLED 128x32 I2C 디스플레이 1

프로젝트 소개

이 튜토리얼에서는 BMP280 센서와 Arduino UNO 보드, OLED 디스플레이를 사용하여 온도, 기압, 고도를 측정하는 방법을 설명합니다. BMP280 데이터시트의 주요 사양은 다음과 같습니다.

BMP280과 Arduino UNO로 온도, 기압, 고도 정확히 측정하기

이 프로젝트에서는 미터법과 야드법 단위로 모두 측정값을 표시합니다. 단위 변환은 코드에서 쉽게 조정할 수 있습니다.

테스트 및 문제 해결

모듈 배선 후, 라이브러리 예제 코드인 BMP280test를 실행하여 센서가 정상적으로 인식되는지 확인하세요. 만약 아래 그림처럼 센서가 감지되지 않는다면:

BMP280과 Arduino UNO로 온도, 기압, 고도 정확히 측정하기

I2C 스캐너 코드를 실행하세요(이때 LCD나 OLED 같은 다른 I2C 장치는 분리하세요). 센서가 고장 나지 않았고 납땜에 문제가 없다면 스캐너에서 장치 주소를 찾을 수 있습니다.

BMP280과 Arduino UNO로 온도, 기압, 고도 정확히 측정하기

찾은 주소를 메모한 후 라이브러리의 C++ 파일을 수정해야 합니다. 라이브러리는 보통 Documents/Arduino/Libraries 폴더에 설치되어 있습니다. 적절한 에디터(예: Dev C++)로 파일을 열고 41번째 줄의 _i2caddr 값을 스캐너에서 찾은 주소로 변경하세요.

BMP280과 Arduino UNO로 온도, 기압, 고도 정확히 측정하기
BMP280과 Arduino UNO로 온도, 기압, 고도 정확히 측정하기
BMP280과 Arduino UNO로 온도, 기압, 고도 정확히 측정하기

저장 후 테스트 코드를 다시 실행하면 정상적으로 작동할 것입니다.

BMP280과 Arduino UNO로 온도, 기압, 고도 정확히 측정하기

테스트 사진

BMP280과 Arduino UNO로 온도, 기압, 고도 정확히 측정하기
BMP280과 Arduino UNO로 온도, 기압, 고도 정확히 측정하기

문제가 있으면 댓글로 남겨주세요.

코드

다음 4가지 버전의 코드가 제공됩니다:

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);
}

bmp280_OLED_m.ino (OLED 미터법)

/* Adafruit BMP280 + OLED (미터법)
 * 온도, 기압, 고도를 OLED에 출력 */
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;

void setup() {
  bmp.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.display();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.print("SurtrTech");
  display.setCursor(32,12);
  display.setTextSize(2);
  display.println("BMP280");
  display.display();
  delay(2000);
}

void loop() {
  display.clearDisplay();
  float T = bmp.readTemperature();
  float P = bmp.readPressure()/100;
  float A = bmp.readAltitude(1019.66);

  display.setCursor(0,0);
  display.setTextColor(WHITE);
  display.setTextSize(2);
  display.print("Temp");
  display.setCursor(0,18);
  display.print(T,1);
  display.setCursor(50,17);
  display.setTextSize(1);
  display.print("C");
  display.setTextSize(1);
  display.setCursor(65,0);
  display.print("Pres");
  display.setCursor(65,10);
  display.print(P);
  display.setCursor(110,10);
  display.print("hPa");
  display.setCursor(65,25);
  display.print("Alt");
  display.setCursor(90,25);
  display.print(A,0);
  display.setCursor(110,25);
  display.print("m");
  display.display();
  delay(2000);
}

bmp280_OLED_US.ino (OLED 야드법)

/* Adafruit BMP280 + OLED (야드법) */
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;

void setup() {
  bmp.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.display();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.print("SurtrTech");
  display.setCursor(32,12);
  display.setTextSize(2);
  display.println("BMP280");
  display.display();
  delay(2000);
}

void loop() {
  display.clearDisplay();
  float T = bmp.readTemperature()*9/5 + 32;
  float P = bmp.readPressure()/3386.39;
  float A = bmp.readAltitude(1019.66)*3.28084;

  display.setCursor(0,0);
  display.setTextColor(WHITE);
  display.setTextSize(2);
  display.print("Temp");
  display.setCursor(0,18);
  display.print(T,1);
  display.setCursor(50,17);
  display.setTextSize(1);
  display.print("F");
  display.setTextSize(1);
  display.setCursor(65,0);
  display.print("Pres");
  display.setCursor(65,10);
  display.print(P);
  display.setCursor(100,10);
  display.print("inHg");
  display.setCursor(65,25);
  display.print("Alt");
  display.setCursor(90,25);
  display.print(A,0);
  display.setCursor(110,25);
  display.print("ft");
  display.display();
  delay(2000);
}

참고 라이브러리

회로도

두 모듈 모두 I2C 인터페이스를 사용합니다. SDA/SCL은 Arduino의 A4, A5 핀에 연결합니다. BMP280은 5V로, OLED는 3.3V로 전원 공급합니다.

BMP280과 Arduino UNO로 온도, 기압, 고도 정확히 측정하기

제조공정

  1. 통합 QR, RFID, 온도 검증 출입 통제 시스템
  2. 라즈베리 파이 다중 DS18B20 1-와이어 센서 연결으로 정확한 온도 모니터링
  3. 라즈베리 파이와 파이썬으로 원격 온도 센서 만들기 – 단계별 가이드
  4. 라즈베리 파이에서 EzTemp로 매끄러운 온도 및 습도 모니터링
  5. DIY 홈브루 온도 제어: 아두이노로 모니터링 및 조절하기
  6. 라즈베리 파이 BMP085: I2C로 정확한 온도 및 기압 측정하기
  7. 실험실 및 과학 실험을 위한 정밀 열전대 측정 및 로깅
  8. 라즈베리 파이 & DS18B20으로 다중 센서 온도 & 조도 모니터링 시스템 구축
  9. 아날로그 센서로 정밀 압력 및 공기유속 측정 장치 만들기
  10. 아두이노 DHT11 이더넷 실드 온습도 데이터 로거