BME280 I2C 온습도 대기압 센서
I2C BME280 Environmental Sensor (Temperature, Humidity, Barometer)
BME280 센서 모듈은 온도, 습도, 기압을 측정할 수 있는 고정밀 센서모듈입니다. 주의할 점은 원래 제품은 Gravity 씨리즈의 센서인데 여기서는 기능이 같고 i2c 인터페이스만 지원되는 비교적 가격이 저렴한 센서에 대해 알아봅니다. 혹시 아래에 두 가지 제품의 설명이나 연결이 섞여 있어도 동일한 i2c 인터페이스에 의해 동작하는 방법만 알아두면 본 포스팅의 역할은 다 한 것입니다.
참고로 Gravity 센서 시리즈에 대해 알아 보면 "Gravity 인터페이스의 BME280 기반 기압, 온도, 습도 측정 센서입니다. SPI 및 I2C 인터페이스가 지원되며, 고정밀 및 다양한 기능이 부여된 소형 센서입니다. Gravity 시리즈는 모든 제품에 대한 사용방법(Wiki)을 제공하며, 표준화된 커넥터를 통해 손쉬운 방법으로 연결할 수 있는 제품입니다. 아두이노, 라즈베리파이 등 다양한 플랫폼과 사용할 수 있으며, Gravity 확장쉴드를 사용하면 아두이노와 Gravity 시리즈를 더 손쉽게 연결/사용할 수 있습니다. 동일 센서/모듈들에 비해 비교적 저렴하며, 연결 케이블(Female to Female)이 포함되어 있습니다."
외형 이미지
위 제품은 디바이스마트에서 판매하는 센서로 솔더링(납땜)으로 i2c 주소를 선택하는 설명의 사진인데 답글에 보면 "제품 설명에 납땜으로 점핑시켜서 I2C 주소를 확정해야 사용할 수 있다고 써있는데 잘못된 설명이구요. 점핑없이 0x76으로 사용하실 수 있습니다."라고 나와 있으니 참고하세요.
아래 이미지는 Gravity 시리즈의 정품으로 보이며 마찬가지로 SPI 포트를 지원되며 가격차이가 주된 차이입니다. ^^ 참고하십시요.
보드 상세 이미지
핀 다이어그램
Num | Label | Description |
1 | + | 3.3~5V |
2 | - | GND |
3 | C | SCL |
4 | D | SDA |
특징
- 3.3V / 5V 마이크로 컨트롤러와 호환
- 환경 모니터링 : 온도, 습도 및 기압계
- Gravity I2C 인터페이스 및 예비 XH2.54 SPI 인터페이스
- 설치하게 편리한 소형
응용분야
- 상황 인식 (예 : 피부 감지, 방 변화 감지)
- 홈 자동화 제어 (제어 난방, 환기, 에어컨 (HVAC))
- 사물 인터넷
- GPS 향상 (예 : 최초 수정 시간 개선, 추측 항법, 경사 감지)
- 실내 내비게이션 (층 변경 감지, 엘리베이터 감지)
- 야외 내비게이션, 레저 및 스포츠 애플리케이션
- 일기 예보
- 수직 속도 표시 (상승 / 싱크 속도)
전기와 기구 사양
- 작동 전압 : 3.3V ~ 5.0V
- 작동 전류 : 2mA
- 작동 온도 : -40 ℃ ~ + 85 ℃
- 온도 측정 범위 : -40 ℃ ~ + 85 ℃, 분해능 0.1 ℃, 편차 ± 0.5 ℃
- 습도 측정 범위 : 0 ~ 100 % RH, 분해능 0.1 % RH, 편차 ± 2 % RH
- 압력 측정 범위 : 300 ~ 1100hPa 습도
- 샘플링 시간 : 1 초
- 치수 : 22 * 25mm / 0.87 * 0.98 인치
- 무게 : 12g
사용법은 아두이노 IDE에서 직접 프로그래밍하여 테스트 하는데 우선 러이브러리를 설치하여야 합니다.
아래는 사이트 참고 하시고 적용하지 마세요. 그 아래 설명부터 적용하십시요.
Arduino IDE (Version requirement: V1.8) 다운받는 곳은 Click to Download Arduino IDE from Arduino®
라이브러리 다운받는 곳 BME280 Environmental Sensor Arduino Library (Github)
라이브러리 설치하는 방법 How to install Libraries in Arduino IDE
적용: Nano 33 IoT와 BME280 I2C 연결도는 아래 그림을 참고합니다. 우리는 가장 쉬운 방법으로 테스트 합니다. 복잡한 것은 체질에 맞지 않습니다. ^^
그럼 이제 adafruit 의 라이브러리를 아래 그림을 참고하여 설치합니다.
여기까지 했으면 거의 다 한 겁니다. 예제에서 찾아보면 아래와 같은 샘플코드가 있으니 파일 - 열기 해서 불러옵니다. 아래는 불러온 코드를 보여줍니다.
/***************************************************************************
This is a library for the BME280 humidity, temperature & pressure sensor
Designed specifically to work with the Adafruit BME280 Breakout
----> http://www.adafruit.com/products/2650
These sensors use I2C or SPI to communicate, 2 or 4 pins are required
to interface. The device's I2C address is either 0x76 or 0x77.
Adafruit invests time and resources providing this open source code,
please support Adafruit andopen-source hardware by purchasing products
from Adafruit!
Written by Limor Fried & Kevin Townsend for Adafruit Industries.
BSD license, all text above must be included in any redistribution
See the LICENSE file for details.
***************************************************************************/
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
unsigned long delayTime;
void setup() {
Serial.begin(9600);
while(!Serial); // time to get serial running
Serial.println(F("BME280 test"));
unsigned status;
// default settings
status = bme.begin();
// You can also pass in a Wire library object like &Wire2
// status = bme.begin(0x76, &Wire2)
status = bme.begin(0x76, &Wire);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
Serial.print(" ID of 0x60 represents a BME 280.\n");
Serial.print(" ID of 0x61 represents a BME 680.\n");
while (1) delay(10);
}
Serial.println("-- Default Test --");
delayTime = 1000;
Serial.println();
}
void loop() {
printValues();
delay(delayTime);
}
void printValues() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println(" hPa");
Serial.print("Approx. Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.println();
}
여기서 눈여겨 볼 것과 원래 소스에서 수정할 분분입니다. 아래는 눈여겨 볼 것입니다. 우리는 I2C 인터페이스를 사용하여 데이터를 볼 것입니다. 그러니 주석 포함하여 30 줄은 아래와 같이 나와야 합니다.
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
그리고 수정할 곳은 바로 44~48 라인을 아래와 같이 수정합니다. 명심하세요. 그러니까 예전 부분을 주석처리하고 새로운 줄을 집어 넣은 겁니다. BME280 의 i2c 주소는 위에 빨간 글씨로 표현한 0x76 입니다.
// default settings
//status = bme.begin();
// You can also pass in a Wire library object like &Wire2
// status = bme.begin(0x76, &Wire2)
status = bme.begin(0x76, &Wire);
자, 여기까지 하고 업로딩 하면 아래와 같이 아름다운 결과를 얻습니다. 아래는 씨리얼 모니터로 출력하는 결과 입니다.
아래는 무시하셔도 됩니다. 고생하셨습니다. ^^
참고로 정품을 사용할 경우 SPI 인터페이스 연결도면입니다.
더 많은 문서는 아래를 참고하세요.
BME280 series humidity sensor design guide
이미지 소스들 Gravity I2C BME280 Environmental Sensor Temperature, Humidity, Barometer SKU SEN0236
여기 반드시 참고할 것!!! waveshare BME280 Environmental Sensor
Datasheet:
참고문서
'개발자 > Arduino' 카테고리의 다른 글
아두이노 나노 PCB 사이즈 (0) | 2021.04.14 |
---|---|
Adafruit APDS-9960 Proximity, Light, RGB, and Gesture Sensor (0) | 2021.04.08 |
Beginning Arduino Nano 33 IoT , Agus Kurniawan (0) | 2021.04.07 |
Arduino Nano 업로드할 때 오류 avrdude : stk500_recv( ) 해결 (0) | 2021.04.01 |
LSM6DS3 Breakout Hookup Guide (0) | 2021.03.24 |
아두이노 타이머 라이브러리 목록 (0) | 2021.03.19 |
Nano 33 IoT 보드 Interrupt 사용 (0) | 2021.03.15 |
Arduino Serial Monitor에 온도 섭씨 기호를 출력하는 쉬운 방법 (0) | 2021.03.14 |
더욱 좋은 정보를 제공하겠습니다.~ ^^