Arduino DHT11 + OLED 실험 – 온습도 센서 디스플레이 만들기

[Sensloop Lab DHT11 #1]

⚠️ 실험 안내 (Safety Notice)

이 글에는 리튬이온 셀·배터리팩·전자부품을 활용한 실험 과정이 포함되어 있습니다. 이 기록은 Sensloop Lab의 통제된 환경에서 수행된 내용입니다.

안전한 실험을 위해 다음을 권장드립니다:

  • 절연 장비와 보호장구(장갑·보안경 등)를 착용하세요.
  • 작업 전 전압 확인과 절연 처리를 진행하세요.
  • 고전압 배터리팩 실험은 숙련자가 진행하는 것이 안전합니다.

1. 서론

연구원 여러분, 안녕하세요.
오늘은 Arduino Mega 2560 보드에 DHT11 온습도 센서를 연결하고,
그 데이터를 작은 OLED 디스플레이에 표시하는 과정을 함께 해보려고 합니다.

이번 실험은 앞으로 진행할 여러 프로젝트의 기본이 되는 단계예요.
센서 데이터를 읽고 → 처리하고 → 눈으로 확인하는 구조를 익히는 게 핵심이죠.

다음 편에서는 온도에 따라 3색 LED 색상을 바꿔서 표시하고,
블루투스 통신으로 데이터를 받아보는 실험도 이어갈 예정입니다.


2. 보드 및 모듈 준비

이번에 준비한 부품은 모두 아두이노 실험에서 자주 사용하는 기본 구성입니다.

아두이노 메가 2560 보드, DHT11 온습도 센서, OLED 디스플레이, 점퍼 케이블 등 이번 실험에 사용된 부품 세트
구분부품명설명
MCUArduino Mega 2560여러 센서와 디스플레이를 동시에 다루기 좋은 보드
센서DHT11 온습도 센서주변 온도와 습도를 디지털 신호로 전송
디스플레이0.91인치 OLED (SSD1306)전력 소모 적고, 시야각이 좋아 작은 프로젝트에 적합
점퍼 케이블M-F 케이블 4EA연결용
USB 케이블Type-B보드 전원 및 PC 연결용

3. 온도센서 연결 & 라이브러리 설치

먼저 DHT11 온습도 센서부터 연결해봅니다.
이 센서는 공기 중의 온도(℃)와 습도(%)를 동시에 측정할 수 있는 간단한 센서입니다.
아날로그 센서처럼 보이지만, 실제로는 디지털 데이터를 한 핀으로 전송합니다.

📍 배선 구성

  • VCC → 5V
  • GND → GND
  • DATA → D2
DHT11 온습도 센서에 점퍼 케이블을 연결한 모습

그다음은 아두이노 IDE에서 DHT11을 쓸 수 있도록 라이브러리 설치를 해야 합니다.

  1. 상단 메뉴에서 스케치 → 라이브러리 포함하기 → 라이브러리 관리
  2. 검색창에 DHT sensor library 입력
  3. Adafruit에서 제공하는 라이브러리 설치
  4. 함께 뜨는 Adafruit Unified Sensor도 같이 설치
아두이노 IDE에서 DHT11 센서 라이브러리를 설치하는 화면

설치가 끝났다면 아래 코드를 업로드합니다.

// ================================================
// [Sensloop Lab] DHT11 온도·습도 측정 기본 예제
// 센서 데이터핀: D2
// 시리얼 속도: 9600bps
// ================================================

#include <DHT.h>           // DHT 센서용 라이브러리

#define DHTPIN 2           // DHT 센서의 데이터 핀을 D2로 설정
#define DHTTYPE DHT11      // 센서 종류를 DHT11로 설정

DHT dht(DHTPIN, DHTTYPE);  // 센서 객체 생성

void setup() {
  Serial.begin(9600);      // 시리얼 모니터 통신속도 9600bps로 설정
  dht.begin();             // 센서 동작 시작
  Serial.println("DHT11 온습도 센서 시작!");
  Serial.println("---------------------------");
}

void loop() {
  // 센서가 안정적으로 측정할 시간을 확보하기 위해 2초 대기
  delay(2000);

  // 온도(섭씨)와 습도 데이터를 읽기
  float h = dht.readHumidity();      // 습도
  float t = dht.readTemperature();   // 온도 (섭씨)

  // 측정 실패 시 NaN(Not a Number)을 반환하므로 확인 필요
  if (isnan(h) || isnan(t)) {
    Serial.println("센서에서 데이터를 읽을 수 없습니다. 배선을 확인하세요!");
    return; // loop의 나머지 부분을 건너뜀
  }

  // 측정값 출력
  Serial.print("현재 습도: ");
  Serial.print(h);
  Serial.print("%  |  온도: ");
  Serial.print(t);
  Serial.println("°C");
}

4. 센서 데이터 확인

이제 업로드가 끝났으면,
시리얼 모니터(9600bps)를 열어봅니다.

잠시 기다리면 아래처럼 출력됩니다.

시리얼 모니터에 출력된 DHT11 센서의 온도와 습도 데이터

값이 정상적으로 나온다면 센서가 잘 작동하는 상태입니다.
여기까지가 온도·습도 센싱 기본 단계입니다.


5. 디스플레이 연결 & 라이브러리 설치

이제 값을 눈으로 직접 볼 수 있도록 OLED 디스플레이를 연결해봅니다.

이 디스플레이는 SSD1306 칩셋을 사용하는 0.91인치 OLED 모듈로,
I2C 방식이라 SDA와 SCL 두 핀만으로 데이터 통신이 가능합니다.
작고 전력 소모도 적어서, 센서 테스트용으로 정말 자주 쓰이는 모듈이에요.

📍 배선 구성 (Arduino Mega 기준)

  • VCC → 5V
  • GND → GND
  • SCL → 21
  • SDA → 20
I2C 방식 OLED 디스플레이 모듈에 전원선과 데이터선을 연결한 준비 상태

다음으로 필요한 라이브러리를 설치합니다.

  • Adafruit SSD1306
  • Adafruit GFX Library
아두이노 IDE에서 oled 디스플레이 라이브러리를 설치하는 화면

이제 아래 코드를 업로드합니다.

// ================================================
// [Sensloop Lab] DHT11 + OLED(SSD1306) 기본 예제
// 보드: Arduino Mega 2560
// 센서: DHT11 (DATA: D2)
// 디스플레이: 0.91" OLED I2C
// 시리얼: 9600bps
// ================================================

#include <Wire.h>               // I2C 통신용
#include <Adafruit_GFX.h>       // 그래픽 기본 라이브러리
#include <Adafruit_SSD1306.h>   // SSD1306용 라이브러리
#include <DHT.h>                // DHT 센서 라이브러리

// ---- DHT 설정 ----
#define DHTPIN   2
#define DHTTYPE  DHT11
DHT dht(DHTPIN, DHTTYPE);

// ---- OLED 설정 ----
#define SCREEN_WIDTH   128
#define SCREEN_HEIGHT   32
#define OLED_ADDRESS  0x3C       // 안 보이면 0x3D로 변경

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// ---- 샘플링 주기(권장: 2초) ----
const unsigned long SAMPLE_MS = 2000;

void setup() {
  Serial.begin(9600);                      // 시리얼 모니터 속도
  dht.begin();                             // DHT 시작

  // OLED 시작 (I2C 주소 확인)
  if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) {
    Serial.println(F("OLED 초기화 실패! I2C 주소(0x3C/0x3D) 및 배선 확인"));
    while (1) { delay(10); }               // 치명적 오류 시 멈춤
  }

  // 부팅 화면(간단한 안내)
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);                  // 글자 크기(1: 작게)
  display.setCursor(0, 0);
  display.println(F("Sensloop Lab"));
  display.println(F("DHT11 + OLED demo"));
  display.display();
  delay(1200);
}

void loop() {
  static unsigned long last = 0;
  if (millis() - last < SAMPLE_MS) return;
  last = millis();

  // ---- 센서 읽기 ----
  float h = dht.readHumidity();        // 습도(%)
  float t = dht.readTemperature();     // 온도(섭씨)

  // 읽기 실패 시 안내
  if (isnan(h) || isnan(t)) {
    Serial.println(F("센서 읽기 실패! 배선/전원 확인"));
    showErrorOnOLED("Read Fail");
    return;
  }

  // ---- 시리얼 출력(디버깅) ----
  Serial.print(F("H: "));
  Serial.print(h, 1);
  Serial.print(F("%  |  T: "));
  Serial.print(t, 1);
  Serial.println(F("C"));

  // ---- OLED 표시 ----
  display.clearDisplay();

  // 제목 라인
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print(F("T: "));
  display.print(t, 1);
  display.print(F("C  ")); // 공백 약간
  display.print(F("H: "));
  display.print(h, 1);
  display.println(F("%"));

  // 큰 글씨로 온도 강조 (두 번째 줄)
  display.setTextSize(2);              // 크게 표시
  display.setCursor(0, 14);            // y=14부터(128x32 기준)
  display.print(t, 1);
  display.print(F("C"));

  // 간단한 습도 막대(우측)
  // 막대 높이(0~20px)를 습도(0~100%)에 맞춰 스케일
  int barMaxH = 20;
  int barH = (int)(barMaxH * constrain(h, 0, 100) / 100.0);
  int barX = 100, barY = 12;           // 우측 위치
  display.drawRect(barX, barY, 24, barMaxH, SSD1306_WHITE);       // 테두리
  display.fillRect(barX+2, barY + (barMaxH - barH), 20, barH, SSD1306_WHITE); // 내부 채움

  display.display();
}

// ---- 오류 화면을 간단히 띄우는 함수 ----
void showErrorOnOLED(const char* msg) {
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(2);
  display.setCursor(0, 8);
  display.println(F("ERROR"));
  display.setTextSize(1);
  display.setCursor(0, 26 - 8);
  display.println(msg);
  display.display();
}

6. 디스플레이 결과

정상적으로 작동하면 OLED 화면에 다음처럼 표시됩니다.

  • 처음엔 “Sensloop Lab / DHT11 + OLED demo”
  • 이후엔 실시간으로 온도와 습도 값이 2초마다 갱신
OLED 디스플레이에 실시간으로 표시된 온도와 습도 데이터 화면

작지만 디스플레이에 숫자가 갱신되는 걸 보면 꽤 뿌듯합니다.
센서가 실제로 측정한 데이터를 눈으로 확인할 수 있다는 게 바로 임베디드의 매력이죠.

디스플레이온도표기 테스트 영상

7. 결론

오늘은 아두이노를 이용해
온습도 센서(DHT11)의 데이터를 읽고,
OLED 디스플레이에 출력하는 과정까지 진행했습니다.

이 단계를 마치면 앞으로의 실험에서
LED, 블루투스, 혹은 Wi-Fi 모듈을 연결하더라도
데이터 흐름을 훨씬 쉽게 이해할 수 있을 거예요.

아두이노 메가 보드에 DHT11 센서와 OLED 디스플레이를 함께 연결한 전체 구성

8️⃣ 연구원 코멘트

이번 실험은 Sensloop Lab 임베디드 시리즈의 첫 시작이었습니다.
센서 하나, 디스플레이 하나지만,
“센서 입력 → 데이터 처리 → 시각 출력”이라는 구조를 직접 체험하는 게 중요했어요.

다음 포스팅에서는
온도에 따라 LED 색이 달라지게 제어해보고,
추가로 블루투스를 통해 데이터를 스마트폰으로 받아볼 예정입니다.

연구원 여러분도 이번 코드를 기반으로 자유롭게 응용해보세요.
작은 변화들이 쌓이면, 어느새 하나의 완성된 시스템이 만들어집니다.


🔗 다음에 같이 보면 좋은 글

🧠 초음파 센서와 WS2812B LED 실험 센서 입력값을 실시간으로 LED 색상으로 표현하는 시각화 실험.

Arduino Mega 보드 비교 – I/O 핀 구성과 확장성 분석 실험에 사용한 Mega와 UNO를 비교해봤습니다.

🔋 SKI E600 리튬폴리머 셀 충·방전 데이터 로그 전기자동차에 들어가는 배터리셀을 분석해봤습니다.

댓글 남기기