요구 사항
- ESP32 38P 핀
- DS3231 RTC 모듈(권장)
- 1~16채널 5V 릴레이
- 암-암 듀폰 와이어
- DS3231 없이도 NTP/RTC 동기화를 위한 안정적인 Wi-Fi 연결
- 5V 3-5A 전원 공급 장치
깃허브 소스 사이트
Optional
- 5V UPS (DS3231 없이 RTC 시간 유지)
- 솔리드 스테이트 릴레이(SSR DC-AC) (고부하 설정)
- 미니 냉각 팬 (ESP32 냉각용)
- 아두이노Json
- NTP클라이언트
- RTClib 1.14.1
⚠️다운로드 및 설치
- CH340G: https://sparks.gogo.co.nz/ch340.html
- CP2102: https://www.silabs.com/software-and-tools/usb-to-uart-bridge-vcp-drivers?tab=downloads
esptool --port <PORT> write_flash 0x0 esp32-firmware-0x0.bin
- 펌웨어를 다운로드 하고 플래싱하세요.
- 오프셋 주소
esp32-dump-0x0.bin: 0x0
- WiFi SSID:ESP32_16CH_Timer_Switch
- 비밀번호:ESP32-admin
최초 설정
° 온라인
- Wifi settings집 와이파이에 연결하면 모든 것이 정상적으로 작동할 것입니다 .
° 오프라인
- 해당 위치로 이동하여 Time settings클릭하면 Sync Browser 모든 것이 정상적으로 작동합니다.
- 릴레이 이름을 두 번 클릭하여 편집하세요.
⚠️해당 국가 시간에 맞춰 설정하세요. 예를 들어 필리핀의 경우 (UTC+8.0) 28800초입니다.
- 해당 국가를 검색 gmt offsets in seconds하고 시간 -> GMT 오프셋에 붙여넣으세요.
- mDNS:esp32-16ch-timer-switch.local
- 캡티브 포털:Auto redirect
- 게이트웨이:192.168.4.1
- WAN: 192.168.1.123 ° 글로벌:Enable Port Forwarding on your router to access anywhere
- 잘못된 개방형 Wi-Fi 네트워크 SSID에 연결하지 마십시오. 연결 끊김 현상이 발생할 수 있습니다. 해결 방법은 Wi-Fi 스테이션 모드를 끄는 것입니다.
- BOOT 버튼을 5초 동안 길게 눌러 공장 초기화를 진행하세요.
- EN 버튼을 눌러 재시작하세요
RELAY | ESP32 38P
VCC _____ 5VIN
IN1 _____ 15 Relay 1
IN2 _____ 2 Relay 2
IN3 _____ 4 Relay 3
IN4 _____ 5 Relay 4
IN5 _____ 18 Relay 5
IN6 _____ 19 Relay 6
IN7 _____ 3 Relay 7
IN8 _____ 1 Relay 8
IN9 _____ 23 Relay 9
IN10 _____ 13 Relay 10
IN11 _____ 14 Relay 11
IN12 _____ 27 Relay 12
IN13 _____ 26 Relay 13
IN14 _____ 25 Relay 14
IN15 _____ 33 Relay 15
IN16 _____ 32 Relay 16
GND _____ GND
- 추가 GPIO 핀
최대 16개의 릴레이, GPIO 핀 재할당을 위한 예비용으로만 사용 가능
IN17 _____ 16 Relay 17
IN18 _____ 17 Relay 18
IN19 _____ 21 Relay 19 (assign if no ds3231)
IN20 _____ 22 Relay 20 (assign if no ds3231)
DS3231 | ESP32 38P
VCC → 3.3V
SDA → 21
SCL → 22
GND → GND
- 개요
- 특징
- 하드웨어 요구 사항
- 핀 구성
- 설치 및 설정
- 웹 인터페이스 가이드
- API 참조
- 구성 시스템
- 시간 관리
- 스케줄 엔진
- 자가 치유 시스템
- GPIO 관리
- 공장 초기화
- 문제 해결
- 기술 사양
ESP32 16채널 릴레이 스마트 스위치는 가정, 기업 및 농장 자동화를 위해 설계된 생산 등급 자동화 시스템입니다. 주요 특징은 다음과 같습니다.
- 개별 스케줄링이 가능한 16개의 독립적인 중계 채널
- Wi-Fi를 통해 접속 가능한 웹 기반 구성 인터페이스
- DS3231 RTC는 전원 사이클 전반에 걸쳐 시간 유지를 위한 장치입니다.
- NTP 시간 동기화 (대체 서버 사용)
- 브라우저 기반 시간 동기화는 최후의 수단입니다.
- 자가 복구 기능 으로 안정적인 작동 보장
- 펌웨어 변경 없이 GPIO 재구성
특징설명
| 16개의 릴레이 | 릴레이당 8개의 스케줄을 통한 독립적인 제어 |
| 웹 인터페이스 | 브라우저를 통한 전체 구성 |
| mDNS 지원 | 접근 방법:http://esp32.local |
| NTP 동기화 | 자동 시간 동기화 |
| DS3231 RTC | 배터리 백업 실시간 시계 |
| 수동 재정의 | 일정 변경 없는 임시 통제 |
| 영구 저장소 | 전원이 꺼져도 모든 설정이 유지됩니다. |
- 액티브 로우/하이 구성 - 릴레이별 또는 전체 레벨 제어
- 유연한 근무 시간 - 매일, 평일, 주말, 특정 월 등 원하는 날짜에 근무 가능
- 야간 근무 일정 - 자정을 포함하는 근무 일정 지원
- 와이파이 스캔 - 네트워크 검색 및 연결 자동 일시 중지
- 브라우저 시간 동기화 - NTP를 사용할 수 없을 때의 대체 기능
- 자가 복구 - WiFi, mDNS, DNS, 웹 서버의 자동 복구
- 임계 상태 복구 - 전원 손실 후 릴레이 상태 복원
- 공장 초기화 - 버튼 또는 웹 인터페이스를 통해
요소사양수량
| ESP32 보드 | ESP32-WROOM-32 (38핀) | 1 |
| 릴레이 모듈 | 16채널, 5V/12V | 1 |
| DS3231 RTC | I2C 인터페이스 | 1 |
| 전원 공급 장치 | 5V @ 2A (최소) | 1 |
| 점퍼 와이어 | 여성-여성 | 20세 이상 |
- 릴레이 전원 라인에 100µF 커패시터를 사용하여 안정성을 확보합니다.
- 푸시 버튼 - 하드웨어 공장 초기화용 (부팅 버튼 내장)
- LED 표시등 - 상태 시각화용
ESP32 핀연결
| GPIO21 | DS3231 SDA |
| GPIO22 | DS3231 SCL |
| GPIO0 | 부팅 버튼(공장 초기화) |
| GPIO1-33 | 릴레이 1~16 (핀 표 참조) |
참고 : GPIO 6~11은 내부 플래시 메모리에 사용되므로 사용할 수 없습니다.
계전기GPIO계전기GPIO
| 1 | 15 | 9 | 23 |
| 2 | 2 | 10 | 13 |
| 3 | 4 | 11 | 14 |
| 4 | 5 | 12 | 27 |
| 5 | 18 | 13 | 26 |
| 6 | 19 | 14 | 25 |
| 7 | 3 | 15 | 33 |
| 8 | 1 | 16 | 32 |
이 시스템은 재컴파일 없이 동적 GPIO 재할당을 지원합니다.
- GPIO 구성 페이지 로 이동합니다.
- 드롭다운 메뉴를 사용하여 릴레이를 추가/제거하세요.
- 릴레이 별 활성 레벨 (낮음/높음) 전환
- 균일한 동작을 위해 글로벌 액티브 모드를 활성화하세요 .
활성 레벨 설명 :
- 액티브 로우(Active LOW) : 핀이 로우(0V)일 때 릴레이가 작동합니다.
- 액티브 하이(Active HIGH) : 핀이 하이(3.3V/5V)일 때 릴레이가 작동합니다.
# Using Arduino IDE
1. Install ESP32 board support
2. Install required libraries:
- WiFi.h (built-in)
- WebServer.h (built-in)
- DNSServer.h (built-in)
- Preferences.h (built-in)
- ArduinoJson (version 6)
- NTPClient (by Fabrice Weinberg)
- RTClib (by Adafruit)
3. Select ESP32 board (e.g., ESP32 Dev Module)
4. Compile and upload
ESP32는 Wi-Fi 액세스 포인트를 생성합니다.
환경값
| SSID | ESP32_16CH_Timer_Switch |
| 비밀번호 | ESP32-admin |
| IP 주소 | 192.168.4.1 |
- ESP32의 Wi-Fi 네트워크에 연결하세요
- 브라우저를 열어http://192.168.4.1
- 와이파이 페이지 로 이동
- 네트워크를 검색하고 Wi-Fi에 연결하세요.
- 시간대와 NTP 서버를 설정하세요.
- 필요에 따라 릴레이를 구성하십시오.
네트워크에 연결한 후:
- 로컬 액세스 : http://esp32.local(mDNS)
- IP 접속 :http://[ESP32-IP-Address]
┌─────────────────────────────────────────────────────────────┐
│ [Relays] [WiFi] [Time] [AP] [GPIO] [System] │
├─────────────────────────────────────────────────────────────┤
│ │
│ Status Indicators: ● WiFi Status ● Time Source │
│ Current Time: HH:MM:SS │
└─────────────────────────────────────────────────────────────┘
특징:
- 실시간 릴레이 상태 (켜짐/꺼짐/수동)
- 수동 조작 버튼 (켜짐/꺼짐/자동)
- 일정 관리 (릴레이당 8개의 일정)
- 릴레이 이름을 두 번 클릭하여 이름을 변경하세요.
- 시각적 일정 편집기
일정 옵션:
- 시작/정지 시간 (초 단위까지)
- 요일 선택
- 해당 월의 일수 선택 (1-31일)
- 활성화/비활성화 토글
- 야간 일정 지원
특징:
- 현재 연결 상태를 확인하세요
- 사용 가능한 네트워크를 검색합니다.
- SSID와 비밀번호를 입력하세요
- RSSI 신호 강도 표시기
- 설정 변경 시 자동 재연결
특징:
- NTP 서버 구성
- GMT 오프셋(초)
- 일광 절약 시간제 적용
- 동기화 간격(1~24시간)
- 수동 NTP 동기화 버튼
- 브라우저 시간 동기화 (대체 기능)
특징:
- 액세스 포인트 SSID 변경
- AP 비밀번호를 설정하세요 (최소 8자)
- 와이파이 채널(1~13)을 선택하세요.
- SSID 표시 여부 전환(숨김 모드)
특징:
- 현재 릴레이 핀을 확인하세요
- 릴레이 채널 추가/제거
- 릴레이별 활성 상태(낮음/높음) 전환
- 전역 활성 모드 재정의
- 기본 핀 설정으로 재설정
특징:
- 시스템 정보 표시
- IP 주소(STA 및 AP)
- 힙 메모리 해제
- 가동 시간
- WiFi RSSI
- 시간 소스 상태
- NTP 동기화 기간
- 표류 보정
- RTC 존재
- 서비스 확인 버튼
- 공장 초기화 버튼
방법엔드포인트설명
| 얻다 | /api/relays | 모든 릴레이 주 및 일정을 확인하세요 |
| 우편 | /api/relay/manual | 수동 릴레이 상태 설정 |
| 우편 | /api/relay/reset | 릴레이를 자동 모드로 복귀 |
| 우편 | /api/relay/save | 일정 설정을 저장합니다 |
| 우편 | /api/relay/name | 릴레이 이름 설정 |
| 얻다 | /api/time | 현재 시간과 상태를 확인하세요 |
| 우편 | /api/time/browser-sync | 브라우저에서 시간 동기화 |
| 얻다 | /api/wifi | WiFi 설정 가져오기 |
| 우편 | /api/wifi | 와이파이 설정 저장 |
| 우편 | /api/wifi/scan | 와이파이 스캔 시작 |
| 얻다 | /api/wifi/scan | 스캔 결과 보기 |
| 얻다 | /api/ntp | NTP 설정 가져오기 |
| 우편 | /api/ntp | NTP 설정 저장 |
| 우편 | /api/ntp/sync | NTP 동기화 트리거 |
| 얻다 | /api/ap | AP 설정 가져오기 |
| 우편 | /api/ap | AP 설정 저장 |
| 얻다 | /api/gpio | GPIO 구성 가져오기 |
| 우편 | /api/gpio/save | GPIO 설정을 저장합니다. |
| 우편 | /api/gpio/add | 릴레이 핀을 추가합니다. |
| 우편 | /api/gpio/delete | 릴레이 핀 삭제 |
| 우편 | /api/gpio/toggle-active-low | 활성 레벨 전환 |
| 얻다 | /api/gpio/global-mode | 전역 활성 모드 가져오기 |
| 우편 | /api/gpio/global-mode | 전역 활성 모드 설정 |
| 얻다 | /api/system | 시스템 정보를 가져오세요 |
| 우편 | /api/reset | 검증 서비스 |
| 우편 | /api/factory-reset | 공장 초기화 기기 |
curl -X POST http://esp32.local/api/relay/manual \
-H "Content-Type: application/json" \
-d '{"relay":0,"state":true}'
curl -X POST http://esp32.local/api/time/browser-sync \
-H "Content-Type: application/json" \
-d '{"utc_epoch":1700000000}'
curl http://esp32.local/api/relays
[
{
"state": true,
"manual": false,
"name": "Living Room Light",
"pin": 15,
"schedules": [
{
"startHour": 6,
"startMinute": 0,
"startSecond": 0,
"stopHour": 22,
"stopMinute": 0,
"stopSecond": 0,
"enabled": true,
"days": 62,
"monthDays": 0
}
]
}
]
모든 설정은 ESP32의 비휘발성 저장소(NVS)에 저장됩니다.
구성크기설명
| sysConfig | 약 150바이트 | 시스템 설정(Wi-Fi, NTP, RTC) |
| extConfig | 약 40바이트 | 확장 설정(채널, 동기화 간격) |
| relayConfigs | 약 3KB | 스케줄이 포함된 16가지 릴레이 구성 |
| gpioConfig | 약 68바이트 | GPIO 핀 매핑 |
| criticalState | 약 44바이트 | 마지막으로 알려진 릴레이 상태 |
struct SystemConfig {
uint16_t magic; // Validation (0x1234)
uint8_t version; // Config version (9)
char sta_ssid[32]; // WiFi SSID
char sta_password[64]; // WiFi password
char ap_ssid[32]; // AP SSID
char ap_password[32]; // AP password
char ntp_server[48]; // NTP server
int32_t gmt_offset; // GMT offset (seconds)
int32_t daylight_offset; // DST offset (seconds)
time_t last_rtc_epoch; // Last RTC epoch
float rtc_drift; // Drift compensation
char hostname[32]; // mDNS hostname
};
struct ExtConfig {
uint8_t magic; // Validation (0xEC)
uint8_t ap_channel; // AP channel (1-13)
uint8_t ntp_sync_hours; // NTP sync interval
uint8_t ap_hidden; // Hidden SSID flag
uint8_t global_active_mode; // 0=per-relay, 1=global LOW, 2=global HIGH
uint8_t reserved[27]; // Future use
};
┌─────────────────────────────────────────────────────────────┐
│ TIME SOURCE PRIORITY │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. NTP Server ←── Highest accuracy │
│ ↓ │
│ 2. DS3231 RTC ←── Battery-backed, survives reboot │
│ ↓ │
│ 3. Browser Sync ←── Manual fallback │
│ ↓ │
│ 4. Internal RTC ←── Least accurate │
│ │
└─────────────────────────────────────────────────────────────┘
시스템이 자동으로 드리프트 보정값을 계산하고 적용합니다.
- 시간에 따른 NTP 시간과 내부 RTC 시간을 비교합니다.
- 드리프트의 이동 평균값을 유지합니다(0.95~1.05 범위).
- 시간 계산을 동적으로 조정합니다.
- 드리프트 값을 NVS에 저장하여 지속성을 확보합니다.
기능설명
| initRTC() | DS3231을 I2C(GPIO21/22)로 초기화합니다. |
| syncInternalRTC() | 외부 소스에서 내부 시간을 설정합니다. |
| getCurrentEpoch() | 현재 UTC 시점과 그 이후의 시간차를 구하세요. |
| immediateDS3231Sync() | DS3231 강제 업데이트 |
| performRTCReabase() | 내부 RTC의 드리프트 보정을 위한 기준점 재설정 |
static const char* NTP_SERVERS[] = {
"time.google.com",
"time.windows.com",
"time.cloudflare.com",
"time.facebook.com"
};
각 릴레이에는 다음과 같은 8개의 독립적인 스케줄이 있습니다 .
struct TimerSchedule {
uint8_t startHour[8]; // Start hour (0-23)
uint8_t startMinute[8]; // Start minute (0-59)
uint8_t startSecond[8]; // Start second (0-59)
uint8_t stopHour[8]; // Stop hour (0-23)
uint8_t stopMinute[8]; // Stop minute (0-59)
uint8_t stopSecond[8]; // Stop second (0-59)
bool enabled[8]; // Schedule enabled flag
uint8_t days[8]; // Day of week bitmask (0-127)
uint32_t monthDays[8]; // Day of month bitmask (0-0x7FFFFFFF)
};
낮조금값매크로
| 일요일 | 0 | 1 << 0 | DAY_SUNDAY |
| 월요일 | 1 | 1 << 1 | DAY_MONDAY |
| 화요일 | 2 | 1 << 2 | DAY_TUESDAY |
| 수요일 | 3 | 1 << 3 | DAY_WEDNESDAY |
| 목요일 | 4 | 1 << 4 | DAY_THURSDAY |
| 금요일 | 5 | 1 << 5 | DAY_FRIDAY |
| 토요일 | 6 | 1 << 6 | DAY_SATURDAY |
사전 정의된 마스크:
- DAY_ALL = 0x7F(매일)
- DAY_WEEKDAYS = 0x3E(월요일~금요일)
- DAY_WEEKENDS = 0x41(토요일-일요일)
- 비트 0 = 1일차
- 비트 1 = 2일차
- ...
- 비트 30 = 31일차
예시 : 0x00000001= 해당 월의 1일만
IF schedule enabled AND day matches AND month day matches THEN
IF start_time == stop_time:
→ ALWAYS ON during matching days
ELSE IF start_time < stop_time:
→ ON between start and stop (same day)
ELSE:
→ ON overnight (start → midnight → stop)
환경값
| 시작 시간 | 22:00:00 |
| 시간을 멈추세요 | 06:00:00 |
| 날 | 월요일-금요일 |
| 결과 | 오후 10시부터 다음날 오전 6시까지 켜짐 |
- 캐시 간격 : 1초 (가벼운 시간 확인용)
- 처리 간격 : 250ms (상태 평가)
- 디바운스 시간 : 500ms (릴레이 신호 잡음 방지)
요소복구 조치간격
| 와이파이 | 백오프를 사용한 자동 재연결 | 10초 |
| mDNS | 서비스 재개 안내 | 60초 |
| DNS | 실시간 재구성 | 60초 |
| 웹서버 | 건강 확인 | 30초 |
| AP | IP 주소가 0.0.0.0이면 재시작합니다. | 필요에 따라 |
| NTP | 서버 오류 발생 시 서버 순환 | 30초 |
| RTC | 재초기화 | 필요에 따라 |
이 시스템은 릴레이 상태와 수동 오버라이드 설정을 NVS에 저장합니다.
- 매직 값 : 0xDEADBEEF(검증)
- 체크섬 : 상태와 타임스탬프의 XOR 연산
- 저장 빈도 : 변경 사항이 있을 경우 5분마다 저장
- 복원 : 전원 켜짐 시 또는 복구 후
// Simplified recovery flow
if (WiFi disconnected && !connecting && !scanning) {
health.wifiFailures++;
if (health.wifiFailures >= 3) {
WiFi.begin(ssid, password); // Reconnect
}
}
if (mDNS not announced in 5 minutes) {
MDNS.addService("http", "tcp", 80); // Re-announce
}
// Full health check every 30 minutes
if (now - lastFullHealthCheck > 30 minutes) {
verifyRelayStates();
saveCriticalState();
}
ESP32에는 릴레이 제어에 적합한 특정 핀이 있습니다.
사용 가능없는
| 1, 2, 3, 4, 5 | 6, 7, 8, 9, 10, 11 |
| 12, 13, 14, 15 | 24 (크리스탈) |
| 18, 19, 21, 22 | 28, 29, 30, 31 (ADC2) |
| 23, 25, 26, 27 | (ESP32-WROOM-32 전용) |
| 32, 33 |
참고 : GPIO21 및 GPIO22는 DS3231 RTC I2C용으로 예약되어 있습니다.
방법값행동
| 릴레이별 | 0 | 각 릴레이는 자체적인 액티브 로우(active Low) 설정을 사용합니다. |
| 글로벌 LOW | 1 | 핀이 LOW일 때 모든 릴레이가 활성화됩니다. |
| 글로벌 하이 | 2 | 핀이 HIGH일 때 모든 릴레이가 활성화됩니다. |
Active LOW (Default):
- To turn ON relay: digitalWrite(pin, LOW)
- To turn OFF relay: digitalWrite(pin, HIGH)
Active HIGH:
- To turn ON relay: digitalWrite(pin, HIGH)
- To turn OFF relay: digitalWrite(pin, LOW)
- 릴레이 추가 : 기본 설정으로 새 채널이 추가되었습니다.
- 릴레이 제거 : 번호가 높은 릴레이를 낮은 번호로 이동시킵니다.
- 일정 보존 : 일정은 원래 중계 번호와 함께 유지됩니다.
- 최대 릴레이 개수 : 16개 (하드웨어 제한)
- BOOT 버튼을 길게 누르세요
- 5초 동안 계속 누르고 계세요
- 시리얼 출력에서 리셋이 확인되면 손을 떼세요.
- 기기가 공장 초기 설정으로 재부팅됩니다.
- 시스템 페이지 로 이동
- 공장 초기화 버튼을 클릭하세요
- 작업을 확인하세요
- 기기가 재시작 없이 재설정됩니다
목동작 재설정
| 와이파이 자격 증명 | 클리어됨 (AP 모드 활성화됨) |
| AP 설정 | 기본 설정으로 복원됨 |
| NTP 설정 | 기본 설정으로 복원됨 |
| 릴레이 구성 | 모든 일정이 취소되었습니다. |
| GPIO 핀 | 기본 매핑으로 복원됨 |
| mDNS 호스트 이름 | "esp32"로 재설정 |
| 릴레이 이름 | "릴레이 X"로 재설정 |
| 수동 재정의 | 클리어됨 |
| RTC 드리프트 | 1.0으로 재설정 |
아무것도 아닙니다 - 공장 초기화는 모든 사용자 설정을 완전히 삭제하는 것입니다.
징후해결책
| 잘못된 비밀번호 | 스캔 기능을 사용하여 네트워크가 존재하는지 확인하십시오. |
| 숨겨진 SSID | 텍스트 필드에 SSID를 수동으로 입력하세요. |
| 2.4GHz 전용 | ESP32는 5GHz 네트워크를 지원하지 않습니다. |
| 신호가 너무 약합니다 | RSSI 값을 확인하십시오 (> -80dBm이어야 합니다). |
| DHCP 문제 | 고정 IP는 지원되지 않습니다(DHCP만 사용 가능). |
징후해결책
| NTP 실패 | 브라우저 동기화 버튼을 대체 수단으로 사용하세요. |
| 잘못된 시간대 | GMT 오프셋(시간이 아닌 초 단위)을 확인하십시오. |
| 일광절약시간제 미적용 | daylight_offset을 수동으로 설정하세요 |
| RTC가 감지되지 않았습니다. | I2C 배선을 확인하십시오 (GPIO21=SDA, GPIO22=SCL). |
징후해결책
| 활성 레벨이 잘못되었습니다 | GPIO 페이지에서 액티브 로우/하이 설정을 확인하세요. |
| 수동 재정의 활성화됨 | 자동 버튼을 클릭하여 해제하세요. |
| 일정 기능이 활성화되지 않았습니다. | 확인란이 선택되어 있는지 확인하십시오. |
| 날짜/월이 잘못되었습니다 | 요일과 월의 일 선택을 확인하세요 |
| 핀 충돌 | 다른 하드웨어에서 GPIO를 사용하지 않는지 확인하십시오. |
징후해결책
| 연결할 수 없습니다 | AP 모드 사용: ESP32_16CH_Timer_Switch에 연결 |
| mDNS가 작동하지 않습니다 | IP 주소를 통해 직접 접속 |
| 느린 응답 | 시스템 페이지에서 사용 가능한 힙 크기를 확인하세요(<20KB = 문제 발생). |
| API 타임아웃 | 대용량 일정 데이터를 직렬화하는 데 시간이 걸립니다. |
지시자색상의미
| 와이파이 도트 | 녹색 | 와이파이에 연결됨 |
| 와이파이 도트 | 빨간색 | 와이파이 연결이 끊겼습니다 |
| 시간 소스 도트 | 녹색 | NTP 기준 시간 |
| 시간 소스 도트 | 파란색 | 브라우저/RTC에서 제공하는 시간 |
| 시간 소스 도트 | 노란색 | 시간 출처 없음 |
// Enable serial debugging (115200 baud)
// Monitor output includes:
- Boot sequence information
- WiFi connection status
- NTP sync attempts
- RTC detection
- GPIO configuration
- Memory warnings (<20KB free)
- Recovery actions
매개변수값
| 맥스 릴레이 | 16 |
| 릴레이별 일정 | 8 |
| 일정 세분화 | 초 |
| NTP 동기화 간격 | 1~24시간 (설정 가능) |
| 내부 시간 편차 | 0.95 - 1.05 (자동 보정) |
| 스케줄 캐시 간격 | 1초 |
| 릴레이 디바운스 시간 | 500ms |
| 웹 서버 포트 | 80 |
| DNS 서버 포트 | 53 |
요소대략적인 크기
| 프로그램 플래시 | 약 250KB |
| 전역 변수 | 약 15KB |
| NVS 스토리지 | 약 3.5KB |
| 힙(유휴) | 약 180KB |
| 최소 자유 더미 | 설정 가능한 경고 (20KB) |
규약세부
| 와이파이 모드 | STA + AP를 동시에 |
| AP 채널 | 1-13 (기본값: 6) |
| AP IP | 192.168.4.1 |
| mDNS 서비스 | http://esp32.local |
| TCP 타임아웃 | 10초 |
| 최대 WiFi 클라이언트 수 | 4 |
작업타임아웃/간격
| 와이파이 연결 | 20초 |
| NTP 요청 | 5초 |
| NTP 재시도 | 30초 |
| 와이파이 확인 | 10초 |
| RTC 동기화 | 60초 |
| RTC 리베이스 | 5분 |
| NTP 동기화 간격 | 1시간 (기본값) |
| 메모리 정리 | 30초 |
| 위기 상태 저장 | (더러울 경우) 5분 |
GPIO강제
| 0 | 부팅 버튼(공장 초기화) |
| 1 | UART0 TX (디버그) |
| 2 | 온보드 LED |
| 3 | UART0 RX |
| 6-11 | 내장 플래시 |
| 12 | 부팅 모드(아래로 당기기) |
| 21 | I2C SDA(DS3231) |
| 22 | I2C SCL(DS3231) |
버전변경 사항
| v9 | 최신 릴리스 |
| - 글로벌 활성 모드 지원 | |
| - 브라우저 시간 동기화 대체 기능 | |
| - 자가 치유 시스템 개선 | |
| - 위기 상태 보호 | |
| - 동적 GPIO 구성 | |
| - 월/일 일정 지원 | |
| - 야간 근무 일정 지원 | |
| - WiFi 스캔 일시 중지 시스템 |
- 저자 : 래프 알즈
- GitHub : https://github.com/xiv3r
- 라이선스 : 오픈 소스
sketch.ino 파일에서 이 줄을 찾으세요.
- GPIO 핀을 추가, 제거 또는 재할당할 수 있습니다.
// Change GPIO PIN
15, // IN1 - Relay 1
2, // IN2 - Relay 2
4, // IN3 - Relay 3
5, // IN4 - Relay 4
18, // IN5 - Relay 5
19, // IN6 - Relay 6
3, // IN7 - Relay 7
1, // IN8 - Relay 8
23, // IN9 - Relay 9
13, // IN10 - Relay 10
14, // IN11 - Relay 11
27, // IN12 - Relay 12
26, // IN13 - Relay 13
25, // IN14 - Relay 14
33, // IN15 - Relay 15
32 // IN16 - Relay 16
// Change GPIO PIN
const DEFAULT_PINS = [15,2,4,5,18,19,3,1,23,13,14,27,26,25,33,32];
16, 17, 21, 22validPins 처럼 GPIO 핀을 더 추가할 수 있습니다 .
// Change GPIO PIN
int validPins[] = {15, 2, 4, 16, 17, 5, 18, 19, 3, 1, 23, 13, 14, 27, 26, 25, 33, 32};
GitHub Actions를 사용하여 펌웨어 바이너리를 자동 빌드합니다.

'ESP32' 카테고리의 다른 글
| ESP32 뭔가 안 될 때 전문가가 알려주는 문제 해결 가이드 (0) | 2026.06.17 |
|---|---|
| 꼭 만들어 보고 싶어질 ESP32 프로젝트 4가지! (0) | 2026.06.10 |
| ESP32 슈퍼 미니 개발 보드 세부 사항 (0) | 2026.06.08 |
| esp32-c6과 s3 차이점 (0) | 2026.06.05 |
| ESP32-S3 배터리 사용과 배터리 전압 측정 (0) | 2026.06.03 |
| ESP32 및 ESP8266에 MicroPython 펌웨어를 플래싱하는 방법 (0) | 2026.06.03 |
| ESP32 연결 실패: 패킷 헤더 대기 중 시간 초과 에러 (0) | 2026.06.03 |
| ESP Partition Toolbox를 오픈소스로 공개 (0) | 2026.06.01 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩