본문 바로가기

카테고리 없음

(아두이노) BMP-280 기압 센서 & OLED에 출력

https://smartstore.naver.com/misoparts/products/5734060599

 

아두이노 BMP280 고도 기압 센서 : 알파마이크로

[알파마이크로] 빠른배송 전자부품전문몰. 아두이노, 라즈베리파이, 모듈, 키트 등 전자부품 최저가 판매

smartstore.naver.com

 

adafruit_BMP280 라이브러리를 설치하고 나서, example의 bmp280test 스케치를 실행해도 오류가 남. 주소를 못 찾는데, 6개 중 4개 선(VCC, GND, SDA, SCL)만 I2C 방식으로 연결하고, 주소를 0x76으로 설정하고 실행하면 됨. 그리고 현재 내가 사는 곳의 기압을 설정해야 하는데, 구글에서 '부천시 기압'을 검색하면 알려줌. (약간 낮은 지대의 빌라 4층에 센서가 위치해 있음)

 

I2C scanner로 주소를 검색했는데 0x76,이 나왔음. 이 주소로 I2C 방식으로 점프선을 연결하고, 스케치에서는 핀 연결 정보를 주지 않아도 됨.

#include <Wire.h>
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp; // I2C

void setup() {
  Serial.begin(9600);
  while (!Serial) delay(100);
  Serial.println("BMP280 test");
  unsigned status = bmp.begin(0x76, BMP280_CHIPID);

  if (!status) {
    Serial.println("Could not find a valid BMP280 sensor, check wiring or try a different address!");
    while (1) delay(10);
  }

  // Default settings from datasheet
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,  // operating mode
                  Adafruit_BMP280::SAMPLING_X2,  // temp. oversampling
                  Adafruit_BMP280::SAMPLING_X16, // pressure oversampling
                  Adafruit_BMP280::FILTER_X16,   // filtering
                  Adafruit_BMP280::STANDBY_MS_500); // standby time
}

void loop() {
  Serial.print("Temperature : ");
  Serial.print(bmp.readTemperature());
  Serial.println(" *C");

  Serial.print("Pressure : ");
  Serial.print(bmp.readPressure());
  Serial.println(" Pa");

  Serial.print("Approx altitude : ");
  Serial.print(bmp.readAltitude(1013.9));  // for Bucheon city (2025.06.12) : 1013.9 (mb)
  Serial.println(" m");

  Serial.println();
  delay(2000);
}

 

 

2. 고도를 0.96인치 OLED에 출력하기

보드: Wemos d1 mini clone

라이브러리: Adafruit SSD1306 : 128x64 I2C

주소: 0x3C

#include <Wire.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, -1);

void setup() {
  Serial.begin(9600);
  while (!Serial) delay(100);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  
  Serial.println("BMP280 test");
  unsigned status = bmp.begin(0x76); //, BMP280_CHIPID);
  if (!status) {
    Serial.println("Could not find a valid BMP280 sensor, check wiring or try a different address!");
    while (1) delay(10);
  }
  // Default settings from datasheet
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,  // operating mode
                  Adafruit_BMP280::SAMPLING_X2,  // temp. oversampling
                  Adafruit_BMP280::SAMPLING_X16, // pressure oversampling
                  Adafruit_BMP280::FILTER_X16,   // filtering
                  Adafruit_BMP280::STANDBY_MS_500); // standby time
}

void loop() {
  int temp = bmp.readTemperature();
  Serial.print("Temperature : ");
  Serial.print(temp);
  Serial.println(" *C");

  int pressure = bmp.readPressure();
  Serial.print("Pressure : ");
  Serial.print(pressure);
  Serial.println(" Pa");

  int altitude = bmp.readAltitude(1013.9); // for Bucheon city (2025.06.12) : 1013.9 (mb)
  Serial.print("Approx altitude : ");
  Serial.print(altitude); 
  Serial.println(" m");
  Serial.println();
  
  
  display.clearDisplay();
  display.setTextSize(2);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE); 
  display.setCursor(0,0);             // Start at top-left corner
  display.print(temp);
  display.println(" *C");
  display.print(altitude);
  display.println(" m");
  display.display();

  delay(1000);
}

빌라 4층인데 8M로 나온다. 6층 옥상으로 올라가니 16M로 나오고, 지상으로 내려가니 1M로 나온다. 빌라 계단을 올라보니 대체로 믿을 만하다. 뒷산으로 올라가보니 값이 잘 나온다. 400원짜리 칩인데 제법 쓸만한 녀석이다. 앞으로 등산하면서 가끔 사용해보면 재미있겠다. 습도까지 지원하는 BME-280류를 사용해보고 싶고, 나침반 센서를 부착해서 동서남북(진북)도 가려내고 싶다. 

https://smartstore.naver.com/misoparts/products/9945203957

 

온도 습도 및 공기압 센서 AHT20 + BMP280 고정밀 디지털 온도 습도 공기압 모듈 : 알파마이크로

[알파마이크로] 빠른배송 전자부품전문몰. 아두이노, 라즈베리파이, 모듈, 키트 등 전자부품 최저가 판매

smartstore.naver.com

3. DHT-11 센서를 붙여서 온도,습도를 추가로 뽑아오기

위의 코드에 DHT-11을 붙여서, 온도와 습도를 추가로 뽑아온다. 

#include <Wire.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C

#include "DHT.h"
#define DHTPIN    D7
#define DHTTYPE   DHT11
DHT dht(DHTPIN, DHT11);

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 32, &Wire, -1);

void setup() {
  Serial.begin(9600);
  while (!Serial) delay(100);

  Serial.println("BMP280 test");
  unsigned status = bmp.begin(0x76); //, BMP280_CHIPID);
  if (!status) {
    Serial.println("Could not find a valid BMP280 sensor, check wiring or try a different address!");
    while (1) delay(10);
  }
  // Default settings from datasheet
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,  // operating mode
                  Adafruit_BMP280::SAMPLING_X2,  // temp. oversampling
                  Adafruit_BMP280::SAMPLING_X16, // pressure oversampling
                  Adafruit_BMP280::FILTER_X16,   // filtering
                  Adafruit_BMP280::STANDBY_MS_500); // standby time

  dht.begin();

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
}

void loop() {
  int temp = bmp.readTemperature();
  Serial.print("Temperature : ");
  Serial.print(temp);
  Serial.println(" *C");

  int pressure = bmp.readPressure();
  Serial.print("Pressure : ");
  Serial.print(pressure);
  Serial.println(" Pa");

  int altitude = bmp.readAltitude(999.3); // for Bucheon city (2025.06.12) : 1013.9 (mb)
  Serial.print("Approx altitude : ");
  Serial.print(altitude); 
  Serial.println(" m");
  Serial.println();
  
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  Serial.print("DHT11: ");
  Serial.print(h);
  Serial.print("%  Temp: ");
  Serial.print(t);
  Serial.println("°C");

  display.clearDisplay();
  //display.setTextSize(2);             // Normal 1:1 pixel scale
  //display.setTextColor(SSD1306_WHITE); 
  display.setCursor(0,0);             // Start at top-left corner
  display.print(temp);
  display.print(char(247));
  display.print("C ");
  display.print(altitude);
  display.println(" m");
  display.print(int(t));
  display.print(char(247));
  display.print("C ");
  display.print(int(h));
  display.println("%");

  display.display();

  delay(1000);
}

OLED의 첫번째 줄이 BMP-280의 값이고, 밑엣줄이 DHT11 센서값이다. DHT11 센서의 온도가 BMP-280보다 0.5도 정도 높고, 전원을 켜면 DHT11은 2초 정도 지나서야 값을 읽어온다. BMP-280은 곧바로 값을 읽어온다. BME-280 계열을 구입하여, 습도까지 함께 출력하도록 하면, 굳이 DHT-11이 필요없어서 효율적이겠다. 빵판 밑의 흰것은 USB 배터리인데, 이렇게 전원을 넣어서 들고다니면, 고도 및 온도, 습도 측정을 야외에서도 편하게 할 수 있다. 뒤쪽에 나침반 센서를 붙여놓았는데, 아직 코드를 작성해서 넣지는 않았다.