본문 바로가기

ESP32

ESP32 BME280 압력, 온도, 습도 데이터 읽기

반응형

 

 

Arduino IDE를 사용한 BME280 센서가 있는 ESP32(압력, 온도, 습도)

 

이 가이드에서는 Arduino IDE를 사용하여 압력, 온도, 습도를 읽고 고도를 추정하기 위해 ESP32와 함께 BME280 센서 모듈을 사용하는 방법을 보여줍니다. BME280 센서는 I2C 또는 SPI 통신 프로토콜을 사용하여 마이크로컨트롤러와 데이터를 교환합니다.

 

Arduino IDE를 사용한 BME280 센서가 있는 ESP32 압력, 온도 및 습도

 

센서를 ESP32에 연결하는 방법, 필요한 라이브러리를 설치하는 방법, 센서 판독값을 표시하는 간단한 스케치를 작성하는 방법을 보여드리겠습니다.

 

추천 자료: BME280이 있는 ESP32 웹 서버 - 기상 관측소

 

이 튜토리얼을 진행하기 전에 Arduino IDE에 ESP32 애드온이 설치되어 있어야 합니다. 아직 설치하지 않았다면 다음 튜토리얼을 따라 Arduino IDE에 ESP32를 설치하세요.

 

Arduino IDE에서 ESP32 보드 설치(Windows, Mac OS X 및 Linux 지침)

 

다른 BME280 가이드도 읽어보시면 좋을 듯합니다.

 

  • BME280이 있는 ESP32 웹 서버 - 기상 관측소
  • Arduino IDE를 사용하는 BME280이 있는 ESP8266
  • MicroPython을 사용하는 BME280이 있는 ESP32/ESP8266
  • BME280이 있는 Arduino 보드

 

BME280 센서 모듈 소개

 

BME280 센서 모듈은 기압, 온도 및 습도를 읽습니다. 기압은 고도에 따라 변하기 때문에 고도를 추정할 수도 있습니다. 이 센서 모듈에는 여러 버전이 있습니다. 아래 그림에 나와 있는 모듈을 사용하고 있습니다.

 

BME280 센서 I2C 모듈은 기압, 온도 및 습도를 읽습니다.

 

이 센서는 I2C 통신 프로토콜을 사용하여 통신하므로 배선이 매우 간단합니다. 다음 표에 표시된 대로 기본 ESP32 I2C 핀을 사용할 수 있습니다.

 

BME280 ESP32
Vin 3.3V
GND GND
SCL GPIO 22
SDA GPIO 21

 

 

 

다음 그림에 표시된 모듈과 같이 SPI 또는 I2C 통신 프로토콜을 사용할 수 있는 이 센서의 다른 버전이 있습니다.

 

BME280 센서 모듈 SPI 또는 I2C 통신 프로토콜

 

이러한 센서 중 하나를 사용하는 경우 I2C 통신 프로토콜을 사용하려면 다음 핀을 사용하세요.

 

BME280 ESP32
SCK (SCL Pin) GPIO 22
SDI (SDA pin) GPIO 21

 

 

SPI 통신 프로토콜을 사용하는 경우 다음 핀을 사용해야 합니다.

 

https://passionelectronique.fr/tutorial-bme280/

 

 

BME280 ESP32
SCK (SPI Clock) GPIO 18
SDO (MISO) GPIO 19
SDI (MOSI) GPIO 23
CS (Chip Select) GPIO 5

 

 

필요한 부품

 

이 튜토리얼을 완료하려면 다음 부품이 필요합니다.

 

  • BME280 센서 모듈
  • ESP32(최고의 ESP32 개발 보드 읽기)
  • 브레드보드
  • 점퍼 와이어

 

이전 링크를 사용하거나 MakerAdvisor.com/tools로 직접 이동하여 프로젝트에 필요한 모든 부품을 최고의 가격으로 찾을 수 있습니다!

 

 

회로도 - I2C를 사용하는 BME280이 있는 ESP32

 

BME280 센서 모듈과 I2C 통신을 사용할 것입니다. 이를 위해 다음 회로도에 표시된 대로 센서를 ESP32 SDA 및 SCL 핀에 연결합니다.

 

ESP32와 BME280 배선 회로도 I2C

 

추천 자료: ESP32 핀아웃 참조 가이드

 

BME280 라이브러리 설치

 

BME280 센서 모듈에서 판독값을 얻으려면 Adafruit_BME280 라이브러리를 사용해야 합니다. Arduino IDE에 라이브러리를 설치하려면 다음 단계를 따르세요.

 

Arduino IDE를 열고 Sketch > Include Library > Manage Libraries로 이동합니다. Library Manager가 열립니다.

 

검색 상자에서 "adafruit bme280"을 검색하여 라이브러리를 설치합니다.

 

Arduino IDE에 BME280 라이브러리 설치

 

Adafruit_Sensor 라이브러리 설치

 

BME280 라이브러리를 사용하려면 Adafruit_Sensor 라이브러리도 설치해야 합니다. Arduino IDE에 라이브러리를 설치하려면 다음 단계를 따르세요.

 

Sketch > Include Library > Manage Libraries로 이동하여 검색 상자에 "Adafruit Unified Sensor"를 입력합니다. 맨 아래로 스크롤하여 라이브러리를 찾아 설치합니다.

 

Adafruit Unified Sensor Driver 라이브러리 설치

 

라이브러리를 설치한 후 Arduino IDE를 다시 시작합니다.

 

압력, 온도 및 습도 읽기

 

압력, 온도 및 습도를 읽기 위해 라이브러리의 스케치 예를 사용합니다.

 

BME280 기압 센서를 탑재하고 Arduino IDE로 프로그래밍한 ESP32

 

BME280 라이브러리와 Adafruit_Sensor 라이브러리를 설치한 후 Arduino IDE를 열고 파일 > 예제 > Adafruit BME280 라이브러리 > bme280 테스트로 이동합니다.

 

/*********
  Complete project details at https://randomnerdtutorials.com  
*********/

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/

#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);
  Serial.println(F("BME280 test"));

  bool 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!");
    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");
  
  // Convert temperature to Fahrenheit
  /*Serial.print("Temperature = ");
  Serial.print(1.8 * bme.readTemperature() + 32);
  Serial.println(" *F");*/
  
  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();
}

 

ESP32와 완벽하게 호환되도록 스케치를 약간 수정했습니다.

 

코드 작동 방식

 

코드 작동 방식을 알아보려면 이 섹션을 계속 읽거나 "데모" 섹션으로 건너뜁니다.

 

라이브러리

 

코드는 필요한 라이브러리를 포함하는 것으로 시작합니다. I2C를 사용하기 위한 와이어 라이브러리와 BME280 센서와 인터페이스하기 위한 Adafruit_Sensor 및 Adafruit_BME280 라이브러리입니다.

 

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

 

SPI 통신

 

I2C 통신을 사용하므로 SPI 핀을 정의하는 다음 줄에 주석을 달았습니다.

 

/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/

 

참고: SPI 통신을 사용하는 경우 ESP32 SPI 핀을 사용합니다. ESP32에서 SPI 통신을 사용하는 경우 다음 표에 표시된 대로 HSPI 또는 VSPI 핀을 사용할 수 있습니다.

 

SPI MOSI MISO CLK CS
HSPI GPIO 13 GPIO 12 GPIO 14 GPIO 15
VSPI GPIO 23 GPIO 19 GPIO 18 GPIO 5

 

해수면 기압

 

SEALEVELPRESSURE_HPA라는 변수가 생성됩니다.

 

#define SEALEVELPRESSURE_HPA (1013.25)

 

이 변수는 해수면 기압을 헥토파스칼(밀리바와 동일)로 저장합니다. 이 변수는 해수면 기압과 비교하여 주어진 기압에 대한 고도를 추정하는 데 사용됩니다. 이 예에서는 기본값을 사용하지만 보다 정확한 결과를 얻으려면 값을 현재 위치의 해수면 기압으로 바꾸세요.

 

I2C

 

이 예제는 기본적으로 I2C 통신 프로토콜을 사용합니다. 보시다시피, bme라는 Adafruit_BME280 객체를 생성하기만 하면 됩니다.

 

Adafruit_BME280 bme; // I2C

 

SPI를 사용하려면 이전 줄에 주석을 달고 하드웨어 또는 소프트웨어 SPI를 사용하는지 여부에 따라 다음 줄 중 하나의 주석을 해제해야 합니다(하드웨어 SPI는 ESP32 기본 HSPI 핀을 사용하고 소프트웨어 SPI는 코드에 정의된 핀을 사용합니다).

 

//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

 

setup()

 

setup()에서 직렬 통신을 시작합니다.

 

Serial.begin(9600);

 

그리고 센서를 초기화합니다.

 

status = bme.begin(0x76); 
if (!status) {
  Serial.println("Could not find a valid BME280 sensor, check wiring!");
  while (1);
}

 

센서를 0x76 주소로 초기화합니다. 센서 판독값을 받지 못하는 경우 센서의 I2C 주소를 확인하세요. BME280 센서를 ESP32에 연결한 후 이 I2C 스캐너 스케치를 실행하여 센서의 주소를 확인하세요. 그런 다음 필요한 경우 주소를 변경하세요.

 

값 인쇄

 

loop()에서 printValues() 함수는 BME280에서 값을 읽고 직렬 모니터에 결과를 인쇄합니다.

 

void loop() { 
  printValues();
  delay(delayTime);
}

 

온도, 습도, 압력 및 추정 고도를 읽는 것은 bme 객체에서 다음 메서드를 사용하는 것만큼 간단합니다.

 

  • bme.readTemperature() – 섭씨 온도를 읽습니다.
  • bme.readHumidity() – 절대 습도를 읽습니다.
  • bme.readPressure() – hPa(헥토파스칼 = 밀리바) 단위로 압력을 읽습니다.
  • bme.readAltitude(SEALEVELPRESSURE_HPA) – 해수면 압력을 기준으로 고도를 미터 단위로 추정합니다.

 

데모

 

ESP32에 코드를 업로드하고, 시리얼 모니터를 9600의 전송 속도로 엽니다. 온보드 RST 버튼을 눌러 코드를 실행합니다. 시리얼 모니터에 판독값이 표시됩니다.

 

Arduino IDE 시리얼 모니터에서 ESP32로 BME280 압력, 온도 및 습도 판독값 인쇄

 

BME280 센서가 있는 ESP32 웹 서버 기상 관측소

 

BME280 센서는 온도, 습도 및 압력을 측정합니다. 따라서 ESP32로 만든 웹 서버를 사용하여 소형 기상 관측소를 쉽게 만들고 측정값을 모니터링할 수 있습니다.

 

이를 위해 이 튜토리얼을 따르세요: BME280 기상 관측소가 있는 ESP32 웹 서버

 

 

BME280 센서 기상 관측소가 있는 ESP32 웹 서버

 

 

마무리

 

이 문서는 Arduino IDE를 사용하여 ESP32로 BME280 센서에서 압력, 온도 및 습도 판독값을 얻는 방법에 대한 간단한 가이드였습니다.

 

이제 이 프로젝트를 더 발전시켜 OLED 디스플레이에 센서 판독값을 표시하거나, 데이터로거를 만들거나, 최신 센서 판독값을 표시하는 웹 서버를 만들 수 있습니다. 다음은 이러한 아이디어에 도움이 될 수 있는 프로젝트 목록입니다.

 

ESP32 Google 시트에 센서 판독값 게시

Arduino IDE가 있는 ESP32 OLED 디스플레이

BME280이 있는 ESP32 웹 서버 - 기상 관측소

저전력 기상 관측소 데이터로거(MicroPython)

ESP32/ESP8266 PHP와 Arduino IDE를 사용하여 MySQL 데이터베이스에 데이터 삽입

 

ESP32에 대해 자세히 알아보려면 "Arduino IDE로 ESP32 배우기" 과정에 등록하세요.

 

읽어주셔서 감사합니다. 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^