본문 바로가기

개발자/부품

전자 종이 e-paper 디스플레이의 기상 관측소

반응형

 

전자 종이 디스플레이의 기상 관측소 

 

지역 또는 인터넷 날씨 정보를 전자종이 디스플레이에 표시하는 ESP32로 기상 관측소를 만드는 방법을 알아보세요.

 

이 튜토리얼에서는 ESP32 딥 슬립 모드와 전자종이 디스플레이를 사용하여 장시간 작동하는 배터리 구동 기상 관측소를 만드는 방법을 배웁니다. 실제로 두 가지 버전을 만들 것입니다. 한 버전은 BME280 센서를 통해 수집한 주변 온도, 습도 및 기압을 표시합니다. 다른 버전은 OpenWeather를 사용하여 인터넷에서 날씨 데이터를 읽고 ESP32-e-Paper-Weather-Display 소프트웨어를 사용하여 이를 표시합니다.  

 

 

 

 

 

 

 

 

 

전자 종이 연결 및 테스트

 

멋진 기능을 시도하기 전에 전자 종이의 기능을 연결하고 테스트해 보겠습니다. 다음 그림은 전원 및 SPI의 전체 배선을 보여줍니다. 

 

 

 

GxEPD2 라이브러리 설치

 

전자 종이 디스플레이를 사용하려면 먼저 두 개의 라이브러리를 설치해야 합니다. Adafruit_GFX 라이브러리는 그래픽 기본 요소(텍스트, 점, 선, 원 등)의 공통 세트를 제공하는 핵심 그래픽 라이브러리입니다. 그리고 GxEPD2 라이브러리는 SPI를 통해 전자 종이 디스플레이를 제어하기 위한 그래픽 드라이버 소프트웨어를 제공합니다.

 

 

 

테스트 코드 다음은 디스플레이에 "Hello Makers!"라는 텍스트를 표시하는 간단한 테스트 코드입니다. 먼저 전체 코드를 살펴본 다음 몇 가지 세부 사항에 대해 논의해 보겠습니다. 

 

#define ENABLE_GxEPD2_GFX 0

#include "GxEPD2_BW.h"
#include "Fonts/FreeMonoBold9pt7b.h"

//CS(SS)=5, SCL(SCK)=18, SDA(MOSI)=23, BUSY=15, RES(RST)=2, DC=0
GxEPD2_BW<GxEPD2_290_BS, GxEPD2_290_BS::HEIGHT> epd(GxEPD2_290_BS(5, 0, 2, 15));

void initDisplay() {
  epd.init(115200, true, 50, false);
  epd.setRotation(1);
  epd.setFont(&FreeMonoBold9pt7b);
  epd.setTextColor(GxEPD_BLACK);   
  epd.setFullWindow();
  epd.fillScreen(GxEPD_WHITE);   
}

void displayText() {
  epd.setCursor(20, 20);
  epd.print("Hello");
  epd.setCursor(20, 40);
  epd.print("Makers!");    
}

void setup() {
  initDisplay();
  displayText();
  epd.display();
  epd.hibernate();
}

void loop() {
}

 

 

e-Paper와 BME280을 ESP32에 연결하기

 

BME280 센서를 사용하여 주변 온도, 습도 및 기압을 표시하고 싶습니다. I2C 인터페이스 덕분에 센서를 쉽게 추가할 수 있습니다. 아래 그림과 같이 SDA를 33번 핀에 연결하고 SCL을 25번 핀에 연결하기만 하면 됩니다. 

 

 

 

 

 

지역 기상 관측소용 코드 다음 코드는 5분마다 BME280에서 주변 온도, 습도 및 기압을 읽고 해당 정보와 함께 고도를 전자 종이 디스플레이에 표시합니다. 출력은 다음과 같습니다: 

 

 

 

 

인터넷 기상 관측소용 코드

 

#define ENABLE_GxEPD2_GFX 0

#include "Wire.h"
#include "GxEPD2_BW.h"
#include "Fonts/FreeMonoBold9pt7b.h"
#include "Fonts/FreeMono9pt7b.h"
#include "Fonts/FreeMonoBold18pt7b.h"
#include "Adafruit_BME280.h"
#include "esp_sleep.h"

#define SECONDS (1000 * 1000)
#define SEALEVELPRESSURE_HPA 1013.25
#define BME280_ADDRESS 0x76

Adafruit_BME280 bme;
GxEPD2_BW<GxEPD2_290_BS, GxEPD2_290_BS::HEIGHT> epd(GxEPD2_290_BS(5, 0, 2, 15));

void initDisplay() {
  epd.init(115200, true, 50, false);
  epd.setRotation(0);
  epd.setFullWindow();
  epd.setTextColor(GxEPD_BLACK);
  epd.fillScreen(GxEPD_WHITE);
}

void initSensor() {
  Wire.begin(33, 25);  // Software I2C for BME280
  bme.begin(BME280_ADDRESS, &Wire);
  bme.setSampling(Adafruit_BME280::MODE_FORCED,
                  Adafruit_BME280::SAMPLING_X1,  // temperature
                  Adafruit_BME280::SAMPLING_X1,  // pressure
                  Adafruit_BME280::SAMPLING_X1,  // humidity
                  Adafruit_BME280::FILTER_OFF);
}

void displayText(int x, int y, const GFXfont* f, const char* text) {
  epd.setFont(f);
  epd.setCursor(x, y);
  epd.print(text);
}

void displayHLine(int y) {
  int o = 8;
  epd.drawFastHLine(o, y, 128 - 2 * o, GxEPD_BLACK);
}

void displayLargeValue(int y, const char* name, float val, const char* unit) {
  static char buffer[32];
  sprintf(buffer, "%7.1f", val);

  displayText(8, y, &FreeMono9pt7b, name);
  displayText(4, y + 30, &FreeMonoBold9pt7b, buffer);
  displayText(86, y + 30, &FreeMono9pt7b, unit);
  displayHLine(y + 50);
}

void displaySmallValue(int y, char* name, float val, char* unit) {
  static char buffer[32];
  sprintf(buffer, "%5.1f", val);

  displayText(8, y, &FreeMono9pt7b, name);
  displayText(4, y + 35, &FreeMonoBold18pt7b, buffer);
  displayText(110, y + 35, &FreeMono9pt7b, unit);
  displayHLine(y + 50);
}

void setup() {
  initSensor();
  initDisplay();

  int o = 20, d = 76;
  bme.takeForcedMeasurement();
  float temp = bme.readTemperature();
  displaySmallValue(o, "temp", temp, "C");
  float hum = bme.readHumidity();
  displaySmallValue(o + d, "hum", hum, "%");
  float alt = bme.readAltitude(SEALEVELPRESSURE_HPA);
  displayLargeValue(o + 2 * d, "alt", alt, "m");
  float pres = bme.readPressure() / 100.0;
  displayLargeValue(o + 3 * d, "pres", pres, "hPa");
  
  epd.display();
  epd.hibernate();

  esp_sleep_enable_timer_wakeup(5 * 60 * SECONDS);
  esp_deep_sleep_start();
}

void loop() {
}

 

 

인터넷 기상 관측소 코드

 

인터넷에서 데이터를 검색하는 고급 기상 관측소를 원한다면 환상적인 ESP32-e-Paper-Weather-Display 라이브러리가 있습니다. 디스플레이 크기에 따라 온도, 습도, 기압, 풍향, 달의 위상, 기상 조건, 일기 예보 등을 표시합니다. 여기서 사용하고 있는 2.9인치 전자 종이 디스플레이에서는 다음과 같이 표시됩니다.

 

2.9인치 전자 종이 디스플레이에서 ESP32-e-Paper-Wather-Display의 출력

 

 

 ESP32-e-Paper-Wather-Display 라이브러리 설치

 

ESP32-e-Paper-Wather-Display 라이브러리를 설치하려면 github 저장소에서 zip 파일을 다운로드한 다음 Sketch -> 라이브러리 포함 -> .ZIP 라이브러리 추가 ....를 통해 설치해야 합니다. 

 

 

 

GxEPD2 라이브러리와 Adafruit_GFX 라이브러리도 필요하지만 위 섹션에서 이미 설치되어 있습니다.

 

ESP32-e-Paper-Weather-Display 라이브러리 설정

 

ESP32-e-Paper-Weather-Display 라이브러리를 사용하여 인터넷 날씨 데이터를 표시하려면 약간의 작업을 수행해야 합니다. 먼저 OpenWeather에서 API 키를 받은 다음 디스플레이용 예제 코드를 다운로드하고, 마지막으로 예제 코드의 설정 파일을 API 키와 Wi-Fi 자격 증명으로 업데이트해야 합니다.

 

OpenWeather API 키

 

ESP32-e-Paper-Weather-Display 라이브러리는 무료 OpenWeather 서비스를 사용하여 인터넷에서 날씨 데이터를 수신합니다. OpenWeather API를 사용하려면 먼저 API 키가 필요하며 이를 위해서는 계정이 필요합니다. 무료 계정을 만들려면 가입 페이지로 이동하여 세부 정보를 입력하세요. 

 

 

 

그런 다음 API 키 생성 페이지로 이동하여 API 키를 생성합니다. API 키는 아래 스크린샷에서 볼 수 있는 긴 문자열 "sdfd87fakeby6apikeysf4z"입니다. 회원님의 키는 제 키와 다르게 보일 것입니다. 

 

 

 

도움이 더 필요하면 튜토리얼을 참조하세요: 간단한 ESP32 인터넷 기상 관측소.

 

그런 다음 ESP32-e-Paper-Weather-Display 라이브러리의 github 리포지토리에서 디스플레이 크기와 유형에 맞는 예제 코드를 다운로드합니다. 예를 들어, 저는 Waveshare_2_9 예제 코드를 다운로드했습니다. 또는 모든 예제는 아니지만 일부 예제가 있는 Arduino IDE를 사용할 수도 있습니다: 

 

 

 

 

설정 파일 owm_credential.h

 

마지막으로, Arduino IDE에서 .ino 파일(예: Waveshare_2_9.ino)을 열고 owm_credential.h 파일 탭을 클릭합니다. 이 파일에는 위치, 단위, 언어, 시간대 등과 같은 기상 관측소에 대한 모든 특정 설정이 포함되어 있습니다. 가장 중요한 것은 Wi-Fi 자격 증명에 대한 상수(ssid, 비밀번호)와 여기에 설정해야 하는 OpenWeather 아피키가 있다는 것입니다.

 

 

 

 

ESP32-e-Paper-Weather-Display에 대한 설정이 포함된 owm_credential.h 파일 앞서 언급한 대로, e-Paper 디스플레이의 크기에 따라 ESP32-e-Paper-Weather-Display 라이브러리는 다소 자세한 날씨 정보를 표시합니다. 대형 7.5인치 디스플레이에서는 매우 풍부한 날씨 데이터를 볼 수 있으며 정말 환상적으로 보입니다: 

 

 

 

배터리 모니터

 

마지막으로, GPIO-35를 ADC 입력으로 사용하는 롤린 D32 보드를 사용하는 경우 ESP32-e-Paper-Wather-Display 라이브러리는 기본적으로 배터리 정보도 표시합니다.

 

 

다른 보드에서는 코드에서 analogRead(35) 문을 변경하고 전압 모니터가 연결된 핀을 지정해야 합니다.

 

 

ESP32-e-Paper-Wather-Display 라이브러리의 analogRead(35) 문 전압 모니터는 배터리 단자에 연결된 간단한 전압 분배기가 될 수 있습니다.

 

이에 대한 자세한 내용은 배터리로 구동되는 프로젝트의 배터리 전압 모니터링 방법을 참조하세요. 배터리 충전량을 더 정확하게 추정하려면 MAX1704X와 같은 특정 배터리 모니터 IC를 사용할 수 있습니다. 

 

 

결론

 

이 튜토리얼에서는 ESP32, BME280 센서 및 전자 종이 디스플레이로 배터리로 작동하는 기상 관측소를 만드는 방법을 배웠습니다. BME280 센서를 사용하여 주변 온도, 습도 및 기압을 측정했습니다.

 

그리고 인터넷의 날씨 데이터를 표시하기 위해 ESP32 e-종이 날씨 디스플레이 소프트웨어를 사용했습니다.

 

이를 통해 인터넷 날씨 데이터와 지역 날씨 정보를 결합할 수 있는 나만의 버전을 만들 수 있는 모든 구성 요소를 갖추게 되었습니다.

 

원격 센서에서 정보를 수집하여 디스플레이에 추가할 수도 있습니다. 즐거운 시간 보내시고 궁금한 점이 있으면 언제든지 문의해 주세요 😉. 

 

 

내용을 간략히 요약했다. 전체 문서 참고는 이 링크를 따라가세요.

 

배움을 멈추지 마세요.

 

 

반응형

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