ESP32 다중 페이지 웹 서버 예제

웹 서버 예제 - 다중 페이지 웹 서버

개요

이 예제는 ESP32에서 홈 페이지, 온도 모니터링 및 LED 제어를 위한 서로 연결된 여러 페이지를 갖춘 다중 페이지 웹 서버를 만드는 방법을 보여줍니다.

주요 기능

  • 다중 페이지 네비게이션 매끄러운 페이지 전환 제공
  • 홈 페이지 네비게이션 메뉴와 시스템 정보를 포함
  • 온도 모니터링 페이지 실시간 온도 표시와 새로고침 기능 포함
  • LED 제어 페이지 온/오프 토글 기능 포함
  • 템플릿 기반 HTML 동적 콘텐츠 교체 포함
  • 헬퍼 함수들로 깨끗하고 유지보수 가능한 코드 작성

준비물

1×ESP32 ESP-WROOM-32 개발 모듈 쿠팡 | 아마존
1×USB 케이블 타입-A to 타입-C (USB-A PC용) 쿠팡 | 아마존
1×USB 케이블 타입-C to 타입-C (USB-C PC용) 아마존
1×(추천) ESP32용 스크루 터미널 확장 보드 쿠팡 | 아마존
1×(추천) Breakout Expansion Board for ESP32 쿠팡 | 아마존
1×(추천) ESP32용 전원 분배기 쿠팡 | 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

라이브러리 설치

다음 지침을 단계별로 따라가세요:

  • ESP32를 처음 사용하는 경우, Arduino IDE에서 ESP32 환경 설정 튜토리얼을 참조하십시오(ESP32를 위한 Arduino IDE에서의 환경 설정 튜토리얼).
  • ESP32 보드를 USB 케이블로 컴퓨터에 연결합니다.
  • 컴퓨터에서 Arduino IDE를 실행합니다.
  • 올바른 ESP32 보드(예: ESP32)와 COM 포트를 선택합니다.
  • Arduino IDE의 왼쪽에 있는 Library Manager 아이콘을 클릭하여 라이브러리 관리자를 엽니다.
  • Web Server for ESP32를 검색하고 DIYables의 mWebSockets를 찾습니다.
  • Install 버튼을 클릭하여 mWebSockets 라이브러리를 추가합니다.
ESP32 웹 서버 라이브러리

웹 서버 예제

  • Arduino IDE에서, 예제 코드를 열려면 File 예제 ESP32용 웹 서버 WebServer 예제로 이동합니다.

회로 연결

외부 부품이 필요하지 않습니다 - 이 예제는 핀 13의 내장 LED를 사용합니다.

코드 구조

  1. home.h: 홈 페이지 HTML 템플릿
  2. temperature.h: 온도 모니터링 페이지 템플릿
  3. led.h: LED 제어 페이지 템플릿
  4. WebServer.ino: 주요 서버 로직

설정 안내

1. 네트워크 구성

WebServer.ino 파일에서 와이파이 자격 증명을 직접 편집하십시오:

const char WIFI_SSID[] = "YOUR_WIFI_SSID"; const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD";

2. 코드 업로드 및 출력 모니터링

  1. ESP32를 컴퓨터에 연결하세요
  2. Arduino IDE에서 올바른 보드와 포트를 선택하세요
  3. WebServer.ino 스케치를 업로드하세요
  4. 시리얼 모니터를 여세요(9600 baud)
  5. WiFi 연결을 기다리세요
  6. 표시된 IP 주소를 메모해 두세요
  7. 시리얼 모니터에서 IP 주소가 보이지 않으면 ESP32 보드의 리셋 버튼을 누르세요

사용 방법

웹 브라우저를 열고 시리얼 모니터에 표시된 IP 주소를 입력하여 ESP32 웹 서버에 접속하십시오.

ESP32 웹 서버

온도 모니터링 기능 테스트:

  • "온도" 메뉴를 클릭합니다.
  • 온도 표시를 봅니다.
ESP32 웹 서버 온도

LED 제어 기능 테스트:

  • "LED Control" 메뉴를 클릭하세요. 아래와 같은 웹 인터페이스가 표시됩니다:
LED 제어 페이지 데모
  • 제공된 버튼으로 LED를 켜고 끄십시오.
  • ESP32 보드의 내장 LED 상태가 즉시 업데이트되는 것을 관찰하십시오.

이용 가능한 페이지

홈 페이지 (`/`)
  • 웹 주소: http://your-esp32-ip/
  • 주요 기능:
  • 시스템 정보가 포함된 환영 메시지
  • 모든 페이지로 이동하는 네비게이션 메뉴
  • 깔끔하고 전문적인 레이아웃
온도 페이지 (`/temperature`)
  • 웹 주소: http://your-esp32-ip/temperature
  • 특징:
  • 실시간 섭씨 온도 표시
  • 5초마다 자동 새로고침
  • 수동 새로고침 버튼
  • 홈으로 돌아가기
LED 제어 페이지 (`/led`)
  • URL: http://your-esp32-ip/led
  • ON URL: http://your-esp32-ip/led/on
  • OFF URL: http://your-esp32-ip/led/off
  • 특징:
  • 현재 LED 상태 표시
  • 켜기 및 끄기 동작에 대한 별도의 경로
  • 상태 변경 직후의 즉각적인 상태 업데이트
  • 홈으로 돌아가기

코드 설명

서버 라우트

// Configure routes with custom handler functions server.addRoute("/", handleHome); server.addRoute("/temperature", handleTemperature); server.addRoute("/led", handleLed); server.addRoute("/led/on", handleLedOn); server.addRoute("/led/off", handleLedOff); // Handler function examples void handleHome(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) { server.sendResponse(client, HOME_PAGE); } void handleTemperature(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) { float tempC = 25.5; // Simulated temperature value String response = TEMPERATURE_PAGE; response.replace("%TEMP_C%", String(tempC, 1)); server.sendResponse(client, response.c_str()); } void handleLedOn(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) { ledState = HIGH; digitalWrite(LED_PIN, ledState); sendLedPage(client); } void handleLedOff(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) { ledState = LOW; digitalWrite(LED_PIN, ledState); sendLedPage(client); }

템플릿 시스템

예제는 동적 콘텐츠를 위한 자리 표시자 대체 시스템을 사용합니다:

  • %TEMP_C%: 현재 섭씨 온도 값으로 대체됩니다
  • %LED_STATUS%: 현재 LED 상태로 대체됩니다 ("ON" 또는 "OFF")

헬퍼 함수

// Helper function to send LED page with current status void sendLedPage(WiFiClient& client) { String ledStatus = (ledState == HIGH) ? "ON" : "OFF"; String response = LED_PAGE; response.replace("%LED_STATUS%", ledStatus); server.sendResponse(client, response.c_str()); } // LED state tracking int ledState = LOW; // Track LED state (LOW = OFF, HIGH = ON)

맞춤화

새 페이지 추가

  1. 새 헤더 파일에 HTML 템플릿 만들기
  2. 메인 루프에 라우트 핸들러 추가하기
  3. 기존 페이지의 네비게이션 메뉴 업데이트하기

스타일링

HTML 템플릿의 CSS를 수정하여 외관을 변경:

<style> body { font-family: Arial, sans-serif; margin: 40px; } .container { max-width: 600px; margin: 0 auto; } /* Add your custom styles here */ </style>

센서 추가

시뮬레이션된 온도 값을 실제 센서 측정값으로 대체합니다:

void handleTemperature(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) { // Replace with actual sensor reading // e.g., DHT22, DS18B20, etc. float tempC = readActualTemperatureSensor(); // Your sensor function here String response = TEMPERATURE_PAGE; response.replace("%TEMP_C%", String(tempC, 1)); server.sendResponse(client, response.c_str()); }

문제 해결

일반적인 문제

와이파이 연결에 실패했습니다

  • WebServer.ino 파일에서 SSID와 비밀번호를 확인합니다
  • WiFi 네트워크 이용 가능 여부를 확인합니다
  • ESP32가 WiFi 범위 내에 있는지 확인합니다

페이지가 로드되지 않음

  • 시리얼 모니터에서 IP 주소를 확인하십시오
  • 브라우저의 웹 주소가 ESP32의 IP 주소와 일치하는지 확인하십시오
  • 페이지를 새로 고침해 보세요

LED가 응답하지 않음

  • LED가 핀 13에 연결되어 있는지 확인합니다
  • 시리얼 모니터에서 디버그 메시지를 확인합니다
  • 라우트 핸들러가 등록되었는지 확인합니다

디버그 출력

Serial.println() 문장을 추가하여 추가 디버깅을 활성화합니다.

void handleLed(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) { Serial.println("LED route accessed"); Serial.println("Method: " + method); Serial.println("Request: " + request); sendLedPage(client); }

다음 단계

  • REST API 개발을 위한 WebServerJson.ino 예제 탐색
  • 고급 매개변수 처리를 위한 WebServerQueryStrings.ino 사용해보기
  • 실시간 통신을 위한 WebServerWithWebSocket.ino 확인해보기

학습 자료