024. Arduino 아두이노 - bme280 / bmp280 센서모듈(Using bme280 / bmp 280 sensor module)
얼마전에 얻은 bme280 을 사용해보기로 했다
근데 테스트를 하다보니… BME280가 아니고 BMP280 이였다 이게 문제였다
BME는 온습도/기압을 지원하지만 BMP280은 온도/기압 만을 지원한다
근데 호환 센서라 그런가 똑같이 생겨서 문제가 되었다
판매자 사진을 보면 BME 일경우 E옆에 검은색으로 마크를 해놨다…
마크가 전혀 안되있다 뭔가 속은 느낌..
3.3V 제품군으로 센서 구멍위치가 다르긴한데 워낙 작아서 알아보기도 힘들다
명확하게 구분하는 방법은 BME280 lib를 깔고 sensorID를 확인해보면 알 수 있다
0x58 은 BMP280, 0x60 는 BME280 이다
참고로 가격차이가 좀 많이 난다
I2C Scanner를 이용해서 통신포트(?)를 찾아야하는데 확인해보니 0x76 이였다
I2C Scanner 소스: https://playground.arduino.cc/Main/I2cScanner/
사용을 위해 Adafruit lib를 설치해야한다
- Adafruit Unified Sensors
- Adafruit BME280 Library
- Adafruit BMP280 Library
외국에도 센서 구분을 못해서…
sensor on i2c with 0x76 address doesn't work, BME280 Sensor not working
bme280 humidity not working, bme280 humidity 0
관련 이슈가 있다 전부 BMP280 이라서 생긴문제다...
Library manage
Adafruit_BME280_Library 설치 해주자(v.1.0.9)
이전 버전은 sensorID 확인이 안된다
예제 > Adafruit_BME280_Library > bme280test 를 열어주자
Arduino | BME/P280 |
SDA (A4) | SDA |
SCL (A5) | SCL |
3.3v | VCC |
GND | GND |
예제를 업로드 하고 모니터로 확인하자
SensorID 0xFF 가 나오면
bme.begin() => bme.begin(0x76) 으로 수정해주고, SCL, SDA 연결을 확인해주자
sensorID 0x56~0x58 이 BMP280 라고 나오는데 글씨도 작고 구분이 안돼서 놓치기 쉽다…
검색을 하다보니 Adafruit_BME290.cpp (Arduino\libraries\Adafruit_BME280_Library\Adafruit_BME290.cpp)
수정하라는 글을 찾았는데
origin | modify |
// check if sensor, i.e. the chip ID is correct _sensorID = read8(BME280_REGISTER_CHIPID); if (_sensorID != 0x60) return false; |
// check if sensor, i.e. the chip ID is correct _sensorID = read8(BME280_REGISTER_CHIPID); if (_sensorID != 0x60 && _sensorID == 0x58){} else if(_sensorID == 0x60 && _sensorID != 0x58){} else return false; |
수정하지 말고 BMP280 Lib를 설치하기를 권한다
BME280 가아니고 BMP280 이니 말이다
수정을 했다면..
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
unsigned long delayTime;
void setup() {
Serial.begin(9600);
while(!Serial); // time to get serial running
Serial.println(F("BME280 test"));
unsigned status;
// default settings
// (you can also pass in a Wire library object like &Wire2)
status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
while (1);
}
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");
if(bme.sensorID() == 96){ //BME280 0x60 == 96
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
}
Serial.println();
}
BMP280 일경우는 습도(Humidity)를 무시하도록 구성해놨다
BMP280 테스트
우선 BMP280 lib를 설치하고
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bmp.begin(0x76)) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
}
void loop() {
Serial.print(F("Temperature = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure());
Serial.println(" Pa");
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */
Serial.println(" m");
Serial.println();
delay(2000);
}
예제를 실행해주면 된다
잘 나오는게 확인된다
이번일로 인해 BME280을 새로 주문했다
아무래도 BMP280만으로는 습도가 없어서 아쉽기 때문이다
참고
026. Arduino 아두이노 - Ethernet Shield 사용하기 (0) | 2019.08.24 |
---|---|
025. Arduino 아두이노 - delay에 대한 고촬 (0) | 2019.08.24 |
023. Arduino 아두이노 - DH11 Sensor Module 온습도 센서 모듈 (0) | 2019.07.09 |
022. Arduino 아두이노 - Logic Level Converter Module test(Software Serial) (2) | 2018.01.23 |
021. Arduino 아두이노 - Laser Module 레이저 레이져 모듈 (1) | 2017.11.12 |
댓글 영역