[3탄] 전기난방패널 우리엘 PC-1D 원격 제어 설치기 – ESP32 코딩으로 컨트롤 완성하기

1탄과 2탄에서 전기난방패널 우리엘 PC-1D 원격 제어 설치기의 재료 구매부터 실패, 그리고 추가 재료로 문제를 해결하는 과정까지 같이 달려왔죠. 이제 본격적으로 “진짜 동작하게” 만드는 단계만 남았습니다. 이번 3탄에서는 전체 구조 중에서 ESP32 → 릴레이 → 우리엘 PC-1D 구간을 ESP32 코딩으로 직접 완성해 볼 거예요.

“코딩”이라고 하니까 살짝 겁날 수도 있는데, 솔직히 말하면 대부분은 복붙 + 설정 몇 개 변경이면 끝입니다 😎 이번 글에서 ESP32를 난방 전용 미니 웹서버로 만들어 두고, 다음 4탄에서는 이 ESP32를 스마트싱스와 연동해서 앱에서 버튼 한 번으로 난방을 켜고 끄는 자동화까지 이어가 볼게요.

전기난방패널 우리엘 PC-1D 원격 제어 설치

전기난방패널 우리엘 PC-1D 원격 제어 설치기

전기난방패널 우리엘 PC-1D, PC-2D 원격제어 1~4탄!


1. 준비하기 – ESP32 + Arduino IDE 설치

1) 필요한 준비물 정리

항목내용비고
ESP32 보드ESP32 DevkitC, NodeMCU-32 등 개발 보드USB 포트가 있는 제품 추천
릴레이 보드ESP32와 연결할 릴레이 모듈 (3채널 이상)전원, 온도+, 온도- 최소 3채널 필요
USB 케이블ESP32 ↔ PC 연결용보드에 따라 micro USB / USB-C
PCArduino IDE 설치용 (윈도우 기준)맥/리눅스도 가능, 화면만 조금 다름

2) Arduino IDE 설치

1. 브라우저에서 “Arduino IDE 다운로드” 검색 후 공식 사이트 접속
2. Windows Installer 또는 ZIP 버전 중 하나 다운로드
3. 설치 마법사의 기본 옵션으로 쭉 진행하면 완료됩니다.

[아래 그림을 클릭하면 다운로드 페이지로 넘어갑니다.]

image

2. Arduino IDE에 ESP32 보드 추가하기

1) 보드 매니저 URL 등록

ESP32를 쓰려면 먼저 보드 매니저에 ESP32 URL을 등록해야 합니다.

  1. Arduino IDE 실행
  2. 파일 > 기본 설정 메뉴 클릭
  3. “추가 보드 매니저 URLs” 입력란에 ESP32용 URL 추가 (기존 URL이 있다면 쉼표(,)로 구분해서 함께 입력)

2) 보드 매니저에서 ESP32 설치

  1. 도구 > 보드 > 보드 매니저 열기
  2. 검색창에 ESP32 입력
  3. ESP32 by Espressif Systems 항목 선택 후 “설치” 버튼 클릭

설치가 끝나면 이제 Arduino IDE에서 ESP32 보드를 선택할 수 있습니다.

image

3. ESP32 보드·포트 선택 & 새 스케치 준비

1) ESP32 보드 선택

1. 상단 메뉴에서 도구 > 보드 선택
2. “ESP32 Arduino” 카테고리 아래에서 사용하는 보드 선택 (예: ESP32 Dev Module)

2) COM 포트 선택

1. ESP32를 USB 케이블로 PC에 연결
2. 도구 > 포트에서 새로 생긴 포트(COMx)를 선택
3. 포트가 안 보이면 드라이버/케이블/USB 포트 상태를 점검


4. ESP32 난방 컨트롤 코드 전체 보기

이제 우리엘 PC-1D를 제어할 ESP32 코드를 볼 차례입니다. 아래 코드를 통째로 복사해서 Arduino IDE 새 스케치에 붙여넣고, Wi-Fi 이름/비밀번호만 본인 걸로 바꿔주면 기본 준비는 끝이에요.

※ 실제 사용 시에는 공유기 SSID/비밀번호를 꼭 본인 환경에 맞게 수정하세요!

#include <WiFi.h>
#include <WebServer.h>

// ===================== Wi-Fi 설정 =====================
const char* ssid     = "YOUR_WIFI_SSID";       // 공유기 이름
const char* password = "YOUR_WIFI_PASSWORD";   // 비밀번호

// ===================== 릴레이 핀 설정 =====================
#define PIN_R1_POWER   4    // 전원 버튼
#define PIN_R1_UP      5    // 온도 올리기
#define PIN_R1_DOWN    6    // 온도 내리기

// ===================== 버튼 누르는 시간(ms) =====================
const int PRESS_POWER_MS = 500;    // 전원 버튼: 0.5초
const int PRESS_TEMP_MS  = 1000;   // 온도 버튼: 1초

WebServer server(80);

// ===================== 공통: 릴레이 버튼 누르기 함수 =====================
void pressButton(int pin, int pressTimeMs) {
  Serial.print("pressButton ON pin ");
  Serial.print(pin);
  Serial.print(" / time = ");
  Serial.print(pressTimeMs);
  Serial.println(" ms");

  digitalWrite(pin, LOW);          // 릴레이 ON (LED 켜짐, 접점 붙음)
  delay(pressTimeMs);              // 버튼 누르고 유지
  digitalWrite(pin, HIGH);         // 릴레이 OFF (LED 꺼짐, 접점 떨어짐)
}

// ===================== HTTP 핸들러 =====================

// 전원 버튼
void handleR1Power() {
  Serial.println("[HTTP] /r1/power (Room1 Power)");
  pressButton(PIN_R1_POWER, PRESS_POWER_MS);
  server.send(200, "text/plain", "Room1 Power pressed");
}

// 온도 올리기
void handleR1Up() {
  Serial.println("[HTTP] /r1/up (Room1 Temp UP)");
  pressButton(PIN_R1_UP, PRESS_TEMP_MS);
  server.send(200, "text/plain", "Room1 Temp Up pressed");
}

// 온도 내리기
void handleR1Down() {
  Serial.println("[HTTP] /r1/down (Room1 Temp DOWN)");
  pressButton(PIN_R1_DOWN, PRESS_TEMP_MS);
  server.send(200, "text/plain", "Room1 Temp Down pressed");
}

// 상태 확인용
void handlePing() {
  server.send(200, "text/plain", "OK");
}

// 404 처리
void handleNotFound() {
  Serial.print("[HTTP] 404 Not Found: ");
  Serial.println(server.uri());
  server.send(404, "text/plain", "404 Not Found");
}

// ===================== SETUP =====================
void setup() {
  Serial.begin(115200);
  delay(500);
  Serial.println();
  Serial.println("===== ESP32 Heating Controller START =====");

  // 릴레이 핀 모드 설정
  pinMode(PIN_R1_POWER, OUTPUT);
  pinMode(PIN_R1_UP,    OUTPUT);
  pinMode(PIN_R1_DOWN,  OUTPUT);

  // 평소 릴레이 OFF (ACTIVE LOW)
  digitalWrite(PIN_R1_POWER, HIGH);
  digitalWrite(PIN_R1_UP,    HIGH);
  digitalWrite(PIN_R1_DOWN,  HIGH);

  // Wi-Fi 연결
  Serial.print("Wi-Fi 연결 중: ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("Wi-Fi 연결 완료!");

  Serial.print("ESP32 IP 주소: ");
  Serial.println(WiFi.localIP());

  // HTTP 라우팅
  server.on("/r1/power", handleR1Power);
  server.on("/r1/up",    handleR1Up);
  server.on("/r1/down",  handleR1Down);
  server.on("/ping",     handlePing);
  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP 서버 시작 (포트 80)");
}

// ===================== LOOP =====================
void loop() {
  server.handleClient();
}

5. 코드 구조, 블록별로 차근차근 이해하기

5-1) Wi-Fi 설정 블록

// ===================== Wi-Fi 설정 =====================
const char* ssid     = "YOUR_WIFI_SSID";       // 공유기 이름
const char* password = "YOUR_WIFI_PASSWORD";   // 비밀번호
  • ssid / password에 내 집 공유기 이름과 비밀번호를 그대로 적어 줍니다.
  • 대소문자, 특수문자, 띄어쓰기까지 정확히 일치해야 접속이 됩니다.
  • 나중에 스마트싱스도 같은 LAN 안에서 이 ESP32에 접속하게 되니, 고정된 공유기를 쓰는 게 좋아요.

5-2) 릴레이 핀 & 버튼 시간 설정

#define PIN_R1_POWER   4
#define PIN_R1_UP      5
#define PIN_R1_DOWN    6

const int PRESS_POWER_MS = 500;
const int PRESS_TEMP_MS  = 1000;
  • 릴레이 IN 핀이 ESP32의 몇 번 GPIO에 연결됐는지 적는 부분입니다.
  • 실제 배선이 4, 5, 6번이 아니라면, 이 숫자를 배선에 맞게 바꿔주세요.
  • PRESS_POWER_MS / PRESS_TEMP_MS는 “버튼을 얼마나 오래 누를지”를 밀리초(ms)로 지정합니다.
  • 온도 버튼은 인식이 더 잘 되도록 전원 버튼보다 길게(1초) 눌러주도록 설정했습니다.

온도는 올리고 내리는걸 짧게하면 인식이 안되어서 1초로 설정을 했습니다.
단 전원은 시간이 0.2초에도 잘 동작하는데 원격이라 혹시나 해서 0.5초로 설정했습니다.

Tip: 일부 ESP32 보드는 GPIO 6~11이 플래시 메모리용이라 피하는 게 좋습니다. 사용하는 보드 핀맵 한 번 꼭 확인해 주세요.

5-3) 공통 버튼 함수: pressButton()

void pressButton(int pin, int pressTimeMs) {
  Serial.print("pressButton ON pin ");
  Serial.print(pin);
  Serial.print(" / time = ");
  Serial.print(pressTimeMs);
  Serial.println(" ms");

  digitalWrite(pin, LOW);
  delay(pressTimeMs);
  digitalWrite(pin, HIGH);
}
  • “이 핀을 pressTimeMs 만큼 눌렀다가 떼라”를 공통으로 처리하는 함수입니다.
  • 릴레이가 Active LOW 방식이라, LOW = ON(눌림), HIGH = OFF(뗌)으로 동작합니다.
  • Serial 출력으로 어떤 핀을 몇 ms 동안 눌렀는지 로그를 남겨서, 시리얼 모니터에서 디버깅이 쉽습니다.

5-4) HTTP 핸들러: URL → 버튼 동작 매핑

void handleR1Power() {
  Serial.println("[HTTP] /r1/power (Room1 Power)");
  pressButton(PIN_R1_POWER, PRESS_POWER_MS);
  server.send(200, "text/plain", "Room1 Power pressed");
}
  • /r1/power 주소로 HTTP 요청이 들어오면 → 전원 버튼 릴레이를 0.5초 동안 눌러 줍니다.
  • 마찬가지로 /r1/up은 온도 올리기, /r1/down은 온도 내리기 버튼을 눌러 줍니다.
  • /ping은 단순히 “OK”를 반환하는 헬스 체크용 endpoint입니다.
  • 등록되지 않은 URL로 들어오면 handleNotFound()에서 404 응답을 돌려줍니다.

5-5) setup(): 부팅 시 한 번만 실행되는 초기 설정

void setup() {
  Serial.begin(115200);
  ...
  pinMode(PIN_R1_POWER, OUTPUT);
  ...
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  ...
  server.on("/r1/power", handleR1Power);
  ...
  server.begin();
}
  • Serial.begin(115200)으로 시리얼 통신 속도를 설정해 디버깅 로그를 볼 수 있게 합니다.
  • 릴레이 핀들은 OUTPUT 모드로 지정하고, 초기값을 HIGH(꺼짐)으로 설정해 부팅 시 오동작을 막습니다.
  • WiFi.begin()으로 공유기에 접속을 시도하고, 연결될 때까지 반복 대기합니다.
  • server.on(...)으로 각 URL과 핸들러 함수를 연결하고, server.begin()으로 HTTP 서버를 시작합니다.

5-6) loop(): 계속 돌면서 HTTP 요청 처리

void loop() {
  server.handleClient();
}
  • loop()에서는 server.handleClient()만 호출해도 충분합니다.
  • 브라우저나 스마트싱스에서 ESP32 IP로 요청이 오면, 이 함수가 알아서 적절한 핸들러를 호출합니다.
  • 즉, ESP32는 항상 “요청을 기다리는 작은 난방 전용 웹서버”인 셈이에요.

6. 코드 컴파일 & 업로드, 그리고 동작 테스트

1) 컴파일 & 업로드

  1. 상단 왼쪽 ✔(체크) 아이콘 클릭 → 스케치 검증(컴파일)
  2. 에러 없이 끝나면, 오른쪽 →(화살표) 아이콘 클릭 → ESP32에 업로드
  3. 하단 상태창에 “Done uploading” 메시지가 뜨면 업로드 완료

2) 시리얼 모니터로 Wi-Fi 연결 확인

  1. 도구 > 시리얼 모니터 클릭 (또는 우측 상단 돋보기 아이콘)
  2. 오른쪽 하단 속도를 115200 bps로 설정
  3. ESP32 리셋 후, “Wi-Fi 연결 중…”, “Wi-Fi 연결 완료!”, “ESP32 IP 주소: xxx.xxx.xxx.xxx” 로그가 나오는지 확인

3) 브라우저로 직접 HTTP 테스트

1. 같은 집 와이파이에 연결된 PC/스마트폰에서 브라우저 실행
2. 주소창에 http://ESP32_IP주소/ping 입력 (예: http://192.168.0.50/ping)
3. 화면에 “OK”가 뜨면 WebServer + Wi-Fi 연결은 성공입니다 🎉
4. /r1/power, /r1/up, /r1/down도 하나씩 호출해 보며 릴레이 “딸깍” 소리가 나는지 체크해 보세요.


7. 다음 4탄에서 할 일 – 스마트싱스 연동으로 자동화까지

여기까지 오면 ESP32는 이미 우리엘 PC-1D를 위한 전용 난방 컨트롤 서버가 된 상태입니다. 이제 다음 4탄에서는 이 ESP32의 /r1/power /r1/up /r1/down 주소를 스마트싱스 Web Request + 가상 스위치와 연결해서, 앱 버튼 하나로 난방을 제어하는 완전체 자동화를 만들어 볼 거예요.

  • 4탄 목표: 스마트싱스에서 난방 스위치/온도+/온도- 가상 버튼 만들기
  • 각 버튼 → ESP32 URL 호출로 매핑
  • 온도 센서 값을 보고 26~30도 사이로 유지하는 자동화까지 구성

하드웨어는 1·2탄에서, ESP32 코딩은 3탄에서 끝냈으니, 이제 남은 건 “앱에서 예쁘게 눌러 쓰는 것”뿐입니다. 4탄도 같이 달려봐요 🔥

관련 링크

전기난방패널 우리엘 PC-1D, PC-2D 원격제어 1~4탄!

결론

이번 [3탄] 전기난방패널 우리엘 PC-1D 원격 제어 설치기 – ESP32 코딩 편에서는 ① Arduino IDE 설치 → ② ESP32 보드 추가 → ③ Wi-Fi/릴레이 핀 설정 → ④ HTTP 서버 코드 작성 → ⑤ 업로드 & 테스트까지 한 번에 쭉 따라가 봤습니다.

한 줄로 요약하면, 우리는 “URL 하나 들어오면 버튼 하나 대신 눌러주는 작은 난방 서버”를 만든 거예요. 다음 4탄에서 이 서버를 스마트싱스에 연결하면, 출근길에 스마트폰으로 난방 켜놓고 따뜻한 집에 돌아오는 삶이 펼쳐집니다 😄 여기까지 완주하셨다면, 이미 하드웨어+소프트웨어 혼종 프로젝트를 해낸 셈이니 자신감 가져도 됩니다!

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.