# ESP32 CAN Logger 사용설명서

## 목차
1. [제품 소개](#제품-소개)
2. [시작하기](#시작하기)
3. [웹 인터페이스 사용법](#웹-인터페이스-사용법)
4. [CAN 데이터 로깅](#can-데이터-로깅)
5. [CAN 메시지 송신](#can-메시지-송신)
6. [그래프 분석](#그래프-분석)
7. [데이터 다운로드](#데이터-다운로드)
8. [고급 기능](#고급-기능)
9. [문제 해결](#문제-해결)
10. [기술 사양](#기술-사양)

---

## 제품 소개

### 개요
ESP32 CAN Logger는 CAN 버스 데이터를 실시간으로 모니터링하고 기록하는 장치입니다. 자동차 진단, 산업용 장비 모니터링, CAN 통신 분석 등 다양한 용도로 활용할 수 있습니다.

### 주요 기능
- ✅ **실시간 CAN 모니터링:** 최대 1Mbps CAN 통신 지원
- ✅ **고속 데이터 로깅:** SD 카드에 바이너리 형식으로 저장
- ✅ **WiFi 웹 인터페이스:** 스마트폰/PC에서 무선으로 제어
- ✅ **CAN 메시지 송신:** 최대 20개의 주기적 메시지 전송
- ✅ **실시간 그래프:** 데이터 시각화 및 분석
- ✅ **RTC 시간 동기화:** 정확한 타임스탬프 기록
- ✅ **다중 CAN 속도 지원:** 125K/250K/500K/1Mbps

### 제품 사양
| 항목 | 사양 |
|------|------|
| **메인 컨트롤러** | ESP32 WROOM-32 (듀얼코어 240MHz) |
| **CAN 컨트롤러** | MCP2515 (8MHz 크리스탈) |
| **CAN 속도** | 125Kbps ~ 1Mbps |
| **저장 매체** | Micro SD 카드 (최대 32GB) |
| **WiFi** | 802.11 b/g/n (2.4GHz) |
| **전원** | 5V DC (USB 또는 외부 어댑터) |
| **소비 전력** | 약 500mA (최대) |
| **동작 온도** | -10°C ~ 60°C |
| **크기** | 약 10cm x 7cm (브레드보드 포함) |

---

## 시작하기

### 1. 전원 연결

**USB 전원 사용:**
1. Micro USB 케이블을 ESP32에 연결
2. USB 전원 어댑터(5V 2A 이상) 또는 PC USB 포트에 연결
3. ESP32의 LED가 켜지면 정상 부팅 중

**외부 전원 사용:**
- 5V DC 입력을 ESP32의 VIN 핀에 연결
- GND를 공통 접지에 연결

⚠️ **주의:** 5V 이상의 전압을 직접 연결하지 마세요!

### 2. SD 카드 준비

**포맷:**
1. Micro SD 카드를 PC에 삽입
2. FAT32 파일 시스템으로 포맷
3. 할당 단위 크기: 4096 바이트 권장

**용량 권장:**
- 최소: 4GB
- 권장: 8GB ~ 32GB

💡 **팁:** 빠른 SD 카드(Class 10 이상)를 사용하면 더 많은 메시지를 기록할 수 있습니다.

### 3. WiFi 연결

**접속 방법:**
1. 스마트폰 또는 노트북의 WiFi 설정 열기
2. **SSID:** `Byun_CAN_Logger` 검색
3. **비밀번호:** `12345678` 입력
4. 연결 완료 후 자동으로 IP 할당됨

**웹 인터페이스 접속:**
1. 웹 브라우저 실행 (Chrome, Safari, Firefox 등)
2. 주소창에 `http://192.168.4.1` 입력
3. 메인 모니터 페이지 표시

### 4. CAN 버스 연결

**OBD-II 포트 연결 (자동차):**
1. OBD-II to DB9 케이블 사용
2. 차량의 OBD-II 포트에 연결
3. DB9 커넥터를 CAN Logger에 연결
4. 차량 시동을 켜거나 ACC ON

**표준 CAN 버스 연결:**
- **Pin 7 (CAN_H):** High 신호선
- **Pin 2 (CAN_L):** Low 신호선
- **Pin 3 (GND):** 신호 접지 (선택)

⚠️ **경고:**
- CAN_H와 CAN_L을 반대로 연결하지 마세요
- 전원 극성을 확인하세요
- 터미네이션 저항이 필요한 경우 120Ω 연결

---

## 웹 인터페이스 사용법

### 메인 화면 구성

웹 인터페이스는 3개의 주요 페이지로 구성됩니다:
1. **Monitor (/)** - 실시간 CAN 모니터링
2. **Transmit (/transmit)** - CAN 메시지 송신
3. **Graph (/graph)** - 데이터 시각화

### 1. Monitor 페이지 (메인)

**URL:** `http://192.168.4.1/`

#### 상단 상태 바
```
🟢 Logging: ON/OFF        SD Card: ✓/✗
📊 Messages: 12,543       Speed: 456 msg/s
🕐 Time Sync: ✓/✗         RTC: ✓/✗
```

**상태 표시 의미:**
- **Logging:** 현재 로깅 진행 상태
- **SD Card:** SD 카드 인식 여부
- **Messages:** 총 수신 메시지 수
- **Speed:** 초당 메시지 수신 속도
- **Time Sync:** 시간 동기화 상태
- **RTC:** RTC 모듈 감지 여부

#### 제어 버튼

**🔴 Start Logging / 🟥 Stop Logging**
- 클릭하여 로깅 시작/중지
- 시작 시 새 로그 파일 자동 생성
- 파일명 형식: `can_YYYYMMDD_HHMMSS.bin`

**⚙️ CAN Speed: 1M**
- 클릭하여 CAN 속도 변경
- 옵션: 125K, 250K, 500K, 1M
- ⚠️ 변경 시 로깅 중단됨

**⏰ Time Sync**
- PC/스마트폰의 시간을 ESP32에 동기화
- RTC가 없는 경우 필수적으로 사용
- 정확한 타임스탬프를 위해 주기적으로 클릭

**📄 View Files**
- SD 카드의 로그 파일 목록 표시
- 파일 다운로드 가능
- 파일 크기 및 날짜 확인

#### 실시간 CAN 메시지 테이블

| ID | DLC | Data | Timestamp | Count |
|----|-----|------|-----------|-------|
| 0x123 | 8 | 01 02 03 04 05 06 07 08 | 12:34:56.789 | 1234 |

**컬럼 설명:**
- **ID:** CAN 메시지 식별자 (16진수)
- **DLC:** 데이터 길이 (0~8 바이트)
- **Data:** 페이로드 데이터 (16진수)
- **Timestamp:** 수신 시간 (마이크로초 정밀도)
- **Count:** 해당 ID의 누적 수신 횟수

**기능:**
- 자동 스크롤 (최신 메시지 표시)
- 최대 100개 메시지 표시
- 웹소켓 실시간 업데이트

### 2. Transmit 페이지

**URL:** `http://192.168.4.1/transmit`

#### CAN 메시지 송신 설정

**메시지 슬롯:** 최대 20개

각 슬롯의 설정 항목:
- **CAN ID:** 메시지 식별자 (16진수, 예: 0x123)
- **Extended:** 확장 ID 사용 여부 (29비트)
- **DLC:** 데이터 길이 (0~8)
- **Data:** 송신 데이터 (16진수, 예: 01 02 03 04)
- **Interval:** 송신 주기 (밀리초, 예: 100)
- **Active:** 활성화/비활성화 체크박스

#### 제어 버튼

**💾 Save Slot**
- 현재 설정을 슬롯에 저장
- 자동으로 송신 시작

**🗑️ Delete Slot**
- 슬롯 삭제 및 송신 중지

**📤 Start All / ⏸️ Stop All**
- 모든 슬롯 일괄 시작/중지

#### 사용 예시

**예시 1: ECU 시뮬레이션**
```
CAN ID: 0x100
Extended: ☐
DLC: 8
Data: 12 34 56 78 9A BC DE F0
Interval: 100 (100ms마다 전송)
```

**예시 2: 센서 데이터 전송**
```
CAN ID: 0x200
Extended: ☐
DLC: 4
Data: 00 00 00 64 (값 100을 표현)
Interval: 50 (50ms마다 전송)
```

**예시 3: 주기적 하트비트**
```
CAN ID: 0x700
Extended: ☐
DLC: 1
Data: AA
Interval: 1000 (1초마다 전송)
```

### 3. Graph 페이지

**URL:** `http://192.168.4.1/graph`

#### 실시간 그래프 설정

**Signal 설정:**
1. **CAN ID:** 모니터링할 메시지 ID (16진수)
2. **Byte Offset:** 데이터에서 읽을 위치 (0~7)
3. **Data Type:** 데이터 형식 선택
   - `uint8`: 부호 없는 8비트 정수 (0~255)
   - `int8`: 부호 있는 8비트 정수 (-128~127)
   - `uint16_le`: 리틀 엔디언 16비트
   - `uint16_be`: 빅 엔디언 16비트
   - `int16_le`: 부호 있는 16비트 LE
   - `int16_be`: 부호 있는 16비트 BE
   - `uint32_le`: 리틀 엔디언 32비트
   - `uint32_be`: 빅 엔디언 32비트
   - `float_le`: IEEE 754 float LE
4. **Scale:** 스케일 계수 (예: 0.1)
5. **Offset:** 오프셋 값 (예: -40)
6. **Label:** 그래프 레이블 (예: "Engine RPM")
7. **Color:** 그래프 선 색상

**공식:** `Value = (Raw × Scale) + Offset`

#### 그래프 제어

**➕ Add Signal**
- 새 신호 추가 (최대 20개)

**🗑️ Remove Signal**
- 신호 삭제

**Clear Graph**
- 그래프 데이터 초기화

**Time Window**
- 표시할 시간 범위 설정 (초)
- 기본값: 30초

#### 사용 예시

**예시 1: 엔진 RPM 모니터링**
```
CAN ID: 0x316
Byte Offset: 0
Data Type: uint16_be
Scale: 0.25
Offset: 0
Label: Engine RPM
Color: #FF0000
→ 결과: RPM = (Raw × 0.25) + 0
```

**예시 2: 냉각수 온도**
```
CAN ID: 0x329
Byte Offset: 2
Data Type: uint8
Scale: 1
Offset: -40
Label: Coolant Temp (°C)
Color: #00FF00
→ 결과: Temp = Raw - 40
```

**예시 3: 차량 속도**
```
CAN ID: 0x280
Byte Offset: 4
Data Type: uint16_le
Scale: 0.01
Offset: 0
Label: Vehicle Speed (km/h)
Color: #0000FF
→ 결과: Speed = Raw × 0.01
```

---

## CAN 데이터 로깅

### 로깅 시작

1. **WiFi 연결 확인**
2. **웹 인터페이스 접속**
3. **SD 카드 상태 확인** (✓ 표시)
4. **CAN 속도 설정** (차량/장비에 맞게)
5. **"Start Logging" 버튼 클릭**

### 로그 파일 형식

**파일명 규칙:**
```
can_YYYYMMDD_HHMMSS.bin

예시:
can_20250123_143052.bin
→ 2025년 1월 23일 14시 30분 52초 생성
```

**바이너리 구조:**
```c
struct CANMessage {
    uint64_t timestamp_us;  // 마이크로초 타임스탬프 (8바이트)
    uint32_t id;            // CAN ID (4바이트)
    uint8_t dlc;            // 데이터 길이 (1바이트)
    uint8_t data[8];        // 데이터 (8바이트)
} __attribute__((packed));  // 총 21바이트
```

### 저장 용량 계산

**계산식:**
```
파일 크기 (MB) = (메시지 수 × 21 바이트) / 1,048,576

예시:
- 1,000,000 메시지 = 약 20 MB
- 100 msg/s × 3600초 (1시간) = 약 7.6 MB
- 1,000 msg/s × 3600초 (1시간) = 약 76 MB
```

**SD 카드 용량별 저장 시간:**
| 카드 용량 | 100 msg/s | 500 msg/s | 1,000 msg/s |
|-----------|-----------|-----------|-------------|
| 4GB | 약 520시간 | 약 104시간 | 약 52시간 |
| 8GB | 약 1,040시간 | 약 208시간 | 약 104시간 |
| 16GB | 약 2,080시간 | 약 416시간 | 약 208시간 |

### 로깅 성능

**최대 처리량:**
- **CAN 1Mbps:** 초당 약 7,000 메시지
- **버퍼 크기:** 1,000 메시지 큐
- **파일 버퍼:** 8KB (약 380 메시지)

⚠️ **주의:**
- 메시지가 너무 많으면 큐가 가득 찰 수 있습니다
- "Queue Full" 경고 시 더 빠른 SD 카드 사용
- 로깅 중 웹 페이지 접속을 최소화하세요

### 로깅 중지 및 파일 저장

1. **"Stop Logging" 버튼 클릭**
2. 버퍼의 남은 데이터가 자동으로 저장됨
3. 파일이 닫히고 SD 카드에 기록 완료
4. "View Files" 버튼으로 확인 가능

💡 **자동 저장:**
- 8KB 버퍼가 가득 차면 자동으로 SD 카드에 쓰기
- 전원이 꺼져도 버퍼 손실 최소화 (최대 380 메시지)

---

## CAN 메시지 송신

### 기본 송신

**단계:**
1. `/transmit` 페이지 이동
2. 송신할 슬롯 선택 (Slot 0~19)
3. CAN ID 입력 (16진수, 예: 0x123)
4. DLC 설정 (0~8)
5. Data 입력 (16진수, 공백으로 구분)
6. Interval 설정 (밀리초)
7. "Save Slot" 클릭

**예시:**
```
Slot: 0
CAN ID: 0x123
Extended: ☐
DLC: 4
Data: 11 22 33 44
Interval: 100
→ 100ms마다 ID 0x123으로 [11 22 33 44] 전송
```

### 주기적 송신

**활용 사례:**

**1. ECU 시뮬레이션**
- 가상 센서 데이터 생성
- ECU 응답 테스트
- 프로토콜 검증

**2. 게이트웨이 기능**
- 다른 CAN 네트워크로 브릿지
- 메시지 변환 및 전달
- 네트워크 라우팅

**3. 진단 및 테스트**
- 특정 ID에 대한 응답 확인
- 스트레스 테스트 (고속 전송)
- 버스 점유율 테스트

### Extended ID (확장 ID)

**Standard ID (11비트):**
- 범위: 0x000 ~ 0x7FF (0 ~ 2047)
- 일반적으로 사용

**Extended ID (29비트):**
- 범위: 0x00000000 ~ 0x1FFFFFFF
- Extended 체크박스 활성화
- J1939, CANopen 등에서 사용

### 송신 상태 모니터링

**상단 표시:**
```
📤 Total TX: 12,543 messages
```

- 시작 후 총 송신 메시지 수
- 초당 1회 업데이트
- 모든 슬롯의 합계

### 송신 중지

**개별 중지:**
- 해당 슬롯의 "Delete" 버튼 클릭

**전체 중지:**
- "Stop All" 버튼 클릭
- 모든 슬롯 비활성화

⚠️ **주의:**
- 송신 설정은 ESP32 재부팅 시 초기화됩니다
- 과도한 송신은 버스 점유율을 높일 수 있습니다
- 안전에 영향을 주는 실제 차량에서는 주의하세요

---

## 그래프 분석

### 실시간 데이터 시각화

**Graph 페이지 특징:**
- 실시간 웹소켓 업데이트
- 최대 20개 신호 동시 표시
- 자동 스케일링
- 시간축 조정 가능

### 신호 추가 및 설정

**Step 1: CAN ID 결정**
- 모니터 페이지에서 분석할 ID 확인
- 예: 엔진 RPM은 보통 0x316

**Step 2: 데이터 위치 파악**
- DBC 파일 또는 매뉴얼 참조
- 바이트 오프셋 확인 (0부터 시작)

**Step 3: 데이터 타입 선택**
- 센서에 맞는 타입 선택
- 엔디언 확인 (대부분 빅 엔디언)

**Step 4: 스케일/오프셋 설정**
- Raw 값을 실제 단위로 변환
- 공식 확인: `Value = (Raw × Scale) + Offset`

### 데이터 타입 가이드

| 타입 | 크기 | 범위 | 용도 |
|------|------|------|------|
| uint8 | 1 | 0~255 | 온도, 백분율 |
| int8 | 1 | -128~127 | 상대 값 |
| uint16_le | 2 | 0~65535 | RPM, 속도 (LE) |
| uint16_be | 2 | 0~65535 | RPM, 속도 (BE) |
| int16_le | 2 | -32768~32767 | 가속도 (LE) |
| int16_be | 2 | -32768~32767 | 가속도 (BE) |
| uint32_le | 4 | 0~4,294,967,295 | 카운터 (LE) |
| uint32_be | 4 | 0~4,294,967,295 | 카운터 (BE) |
| float_le | 4 | IEEE 754 | 정밀 센서 |

### 실전 예시

**자동차 데이터 분석:**

**1. 엔진 RPM**
```
CAN ID: 0x316
Byte: 0-1
Type: uint16_be
Scale: 0.25
Offset: 0
공식: RPM = Raw × 0.25
예: Raw=0x1388 (5000) → 1250 RPM
```

**2. 차량 속도**
```
CAN ID: 0x280
Byte: 4-5
Type: uint16_le
Scale: 0.01
Offset: 0
공식: Speed = Raw × 0.01
예: Raw=0x1388 (5000) → 50.00 km/h
```

**3. 냉각수 온도**
```
CAN ID: 0x329
Byte: 2
Type: uint8
Scale: 1
Offset: -40
공식: Temp = Raw - 40
예: Raw=0x64 (100) → 60°C
```

**4. 연료량**
```
CAN ID: 0x3B7
Byte: 0
Type: uint8
Scale: 0.4
Offset: 0
공식: Fuel = Raw × 0.4
예: Raw=0x64 (100) → 40 리터
```

### 그래프 해석

**정상 패턴:**
- 부드러운 곡선
- 예측 가능한 변화
- 정의된 범위 내

**이상 패턴:**
- 급격한 스파이크
- 값의 급변
- 범위 이탈
- 0 또는 최대값 고정

**트러블슈팅:**
- 값이 이상하면 Scale/Offset 재확인
- 선이 표시되지 않으면 CAN ID 확인
- 업데이트가 없으면 메시지 수신 여부 확인

---

## 데이터 다운로드

### 파일 목록 확인

1. 메인 페이지에서 **"View Files"** 버튼 클릭
2. 팝업 창에 로그 파일 목록 표시

**표시 정보:**
```
can_20250123_143052.bin    (12.5 MB)
can_20250123_120015.bin    (8.2 MB)
can_20250122_183045.bin    (25.1 MB)
```

### 파일 다운로드

**방법 1: 웹 인터페이스**
1. 파일명 옆의 **"Download"** 버튼 클릭
2. 브라우저의 다운로드 폴더에 저장

**방법 2: SD 카드 직접 읽기**
1. ESP32의 전원을 끕니다
2. SD 카드를 분리합니다
3. PC의 카드 리더기에 삽입
4. 파일 탐색기에서 복사

💡 **권장:** 방법 2가 더 빠르고 안정적입니다 (대용량 파일)

### 데이터 분석 도구

**Python 예제 코드:**

```python
import struct

def read_can_log(filename):
    """CAN 로그 파일을 읽어 파싱"""
    messages = []
    
    with open(filename, 'rb') as f:
        while True:
            data = f.read(21)  # 21바이트 읽기
            if len(data) < 21:
                break
            
            # 구조체 언팩
            timestamp_us, can_id, dlc = struct.unpack('<QIB', data[:13])
            payload = data[13:21]
            
            messages.append({
                'timestamp': timestamp_us / 1_000_000,  # 초 단위
                'id': hex(can_id),
                'dlc': dlc,
                'data': payload[:dlc].hex()
            })
    
    return messages

# 사용 예시
messages = read_can_log('can_20250123_143052.bin')
print(f"총 {len(messages)}개 메시지 읽음")

# 첫 10개 메시지 출력
for msg in messages[:10]:
    print(f"{msg['timestamp']:.6f} | {msg['id']} | {msg['data']}")
```

**CSV 변환 예제:**

```python
import csv

def convert_to_csv(bin_file, csv_file):
    """바이너리 로그를 CSV로 변환"""
    messages = read_can_log(bin_file)
    
    with open(csv_file, 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(['Timestamp', 'CAN ID', 'DLC', 'Data'])
        
        for msg in messages:
            writer.writerow([
                msg['timestamp'],
                msg['id'],
                msg['dlc'],
                msg['data']
            ])
    
    print(f"{csv_file} 생성 완료")

# 사용
convert_to_csv('can_20250123_143052.bin', 'output.csv')
```

**특정 ID 필터링:**

```python
def filter_by_id(messages, target_id):
    """특정 CAN ID만 추출"""
    filtered = [msg for msg in messages if msg['id'] == target_id]
    return filtered

# 예시: 0x123 메시지만 추출
messages = read_can_log('can_20250123_143052.bin')
filtered = filter_by_id(messages, '0x123')
print(f"ID 0x123: {len(filtered)}개 메시지")
```

### 데이터 백업

**권장 백업 방법:**
1. **정기적으로 SD 카드 백업**
   - 주 1회 또는 중요한 로깅 후
   - PC에 안전하게 복사

2. **클라우드 스토리지 활용**
   - Google Drive, Dropbox 등
   - 자동 동기화 설정

3. **중복 백업**
   - 로컬 PC + 클라우드
   - 외장 하드 추가 백업

---

## 고급 기능

### 시간 동기화

**RTC 모듈 사용 (권장):**
- DS3231 RTC 자동 감지
- 1분마다 자동 동기화
- 정확도: ±2ppm (연간 ±1분)
- 배터리 백업으로 전원 꺼져도 시간 유지

**웹 인터페이스 동기화:**
- RTC 없을 때 사용
- "⏰ Time Sync" 버튼 클릭
- PC/스마트폰의 시간으로 설정
- 정확도: ±1초

**타임스탬프 정밀도:**
- 마이크로초 (µs) 단위
- 1,000,000 µs = 1초
- CAN 메시지 간 정확한 시간 간격 측정

### CAN 속도 변경

**지원 속도:**
- 125 Kbps
- 250 Kbps
- 500 Kbps
- 1 Mbps (기본값)

**변경 방법:**
1. "⚙️ CAN Speed" 버튼 클릭
2. 원하는 속도 선택
3. MCP2515 자동 재설정
4. 로깅 중이면 자동 중지됨

⚠️ **주의:**
- CAN 버스의 모든 노드가 같은 속도여야 합니다
- 속도가 맞지 않으면 메시지를 수신할 수 없습니다
- 대부분의 자동차는 500Kbps 또는 1Mbps 사용

### WiFi 설정 변경

**기본 설정:**
- SSID: `Byun_CAN_Logger`
- 비밀번호: `12345678`
- IP: `192.168.4.1`

**변경 방법 (고급 사용자):**
1. Arduino IDE에서 소스 코드 열기
2. 다음 부분 수정:
   ```cpp
   const char* ssid = "새_SSID";
   const char* password = "새_비밀번호";
   ```
3. 재컴파일 후 업로드

### 펌웨어 업데이트

**최신 버전 확인:**
- GitHub 또는 제조사 웹사이트 방문
- 버전 번호 확인
- 릴리즈 노트 확인

**업데이트 방법:**
1. 최신 펌웨어 다운로드 (.ino 파일)
2. Arduino IDE에서 파일 열기
3. ESP32를 USB로 연결
4. 업로드 버튼 클릭
5. 완료 후 시리얼 모니터로 확인

⚠️ **백업:**
- 업데이트 전 SD 카드 데이터 백업
- 현재 펌웨어 버전 기록

### 시리얼 모니터 사용

**접속:**
1. Arduino IDE 실행
2. 도구 → 시리얼 모니터
3. Baud Rate: 115200 설정

**표시 정보:**
```
[상태] 큐: 125/1000 | 로깅: ON | SD: OK | RX: 12543 | TX: 0 | 시간동기: OK | RTC: OK(3)
```

**의미:**
- **큐:** 대기 중인 메시지 수 / 최대 큐 크기
- **로깅:** 현재 로깅 상태
- **SD:** SD 카드 상태
- **RX:** 수신 메시지 수
- **TX:** 송신 메시지 수
- **시간동기:** 동기화 상태
- **RTC:** RTC 상태 (동기화 횟수)

**디버깅:**
- 오류 메시지 확인
- 초기화 과정 모니터링
- 성능 문제 분석

---

## 문제 해결

### 문제 1: WiFi 연결 안 됨

**증상:**
- `Byun_CAN_Logger` SSID가 검색되지 않음
- 연결했지만 인터넷이 안 됨

**원인:**
- ESP32 부팅 실패
- 안테나 문제
- WiFi 충돌

**해결 방법:**
1. ESP32의 전원을 껐다 켜기
2. 시리얼 모니터로 부팅 메시지 확인
3. 다른 WiFi 기기들을 끄고 재시도
4. ESP32에 가까이 접근 (5m 이내)
5. 2.4GHz 대역만 지원함을 확인 (5GHz 불가)

### 문제 2: 웹 페이지 로딩 안 됨

**증상:**
- WiFi는 연결되었지만 `192.168.4.1` 접속 불가
- 페이지가 로딩 중에 멈춤

**원인:**
- IP 주소 오류
- 브라우저 캐시
- 방화벽

**해결 방법:**
1. 주소를 정확히 입력: `http://192.168.4.1`
2. `https://`가 아닌 `http://` 사용
3. 브라우저 캐시 삭제
4. 다른 브라우저로 시도
5. 시크릿/프라이빗 모드 사용
6. 스마트폰으로 시도

### 문제 3: SD 카드 인식 안 됨

**증상:**
- 웹 페이지에 "SD Card: ✗" 표시
- 로깅 버튼을 눌러도 시작 안 됨

**원인:**
- SD 카드 미삽입
- 카드 불량
- 포맷 문제

**해결 방법:**
1. SD 카드가 제대로 삽입되었는지 확인
2. 딸깍 소리가 날 때까지 삽입
3. SD 카드를 FAT32로 재포맷
4. 다른 SD 카드로 교체
5. SD 카드 모듈의 배선 확인
6. 시리얼 모니터에서 오류 메시지 확인

### 문제 4: CAN 메시지 수신 안 됨

**증상:**
- "Messages: 0 msg/s" 표시
- 테이블에 메시지가 표시되지 않음

**원인:**
- CAN 버스 미연결
- CAN 속도 불일치
- 배선 오류
- MCP2515 문제

**해결 방법:**
1. CAN_H, CAN_L 연결 확인
2. CAN 속도 설정 확인 (차량에 맞게)
3. 터미네이션 저항 확인 (120Ω)
4. MCP2515 배선 재확인 (HSPI 핀)
5. 시리얼 모니터에서 MCP2515 초기화 확인
6. 멀티미터로 CAN_H(3.5V), CAN_L(1.5V) 측정
7. 다른 CAN 기기로 테스트

### 문제 5: 로깅이 자꾸 멈춤

**증상:**
- 로깅 시작 후 짧은 시간에 중지됨
- "Queue Full" 경고

**원인:**
- SD 카드 속도 부족
- 과도한 CAN 트래픽
- 버퍼 오버플로우

**해결 방법:**
1. Class 10 이상의 빠른 SD 카드 사용
2. SD 카드를 재포맷
3. 웹 페이지 접속을 최소화
4. CAN 속도를 낮춤 (필요시)
5. 불필요한 Task 비활성화

### 문제 6: 시간이 맞지 않음

**증상:**
- 타임스탬프가 1970년으로 표시
- 시간이 계속 초기화됨

**원인:**
- RTC 없음
- 시간 동기화 안 됨
- RTC 배터리 방전

**해결 방법:**
1. "⏰ Time Sync" 버튼 클릭
2. RTC 배터리(CR2032) 교체
3. RTC 배선 확인 (GPIO 25, 26)
4. 시리얼 모니터에서 RTC 감지 확인

### 문제 7: 송신이 작동 안 됨

**증상:**
- 메시지를 설정했지만 송신되지 않음
- "Total TX: 0" 표시

**원인:**
- 슬롯 저장 안 됨
- Active 체크박스 미선택
- CAN 버스 문제

**해결 방법:**
1. "Save Slot" 버튼을 눌렀는지 확인
2. Active 체크박스 활성화 확인
3. "Start All" 버튼 클릭
4. CAN 버스 연결 확인
5. 시리얼 모니터에서 에러 확인

### 문제 8: 그래프가 표시 안 됨

**증상:**
- 그래프 화면이 비어있음
- 선이 그려지지 않음

**원인:**
- CAN ID가 없음
- 바이트 오프셋 오류
- 데이터 타입 불일치

**해결 방법:**
1. 모니터 페이지에서 해당 ID가 수신되는지 확인
2. DBC 파일에서 바이트 위치 재확인
3. 엔디언(LE/BE) 확인
4. Scale/Offset 재설정
5. 브라우저 콘솔에서 에러 확인

---

## 기술 사양

### 하드웨어 사양

**ESP32 WROOM-32**
- CPU: Xtensa 듀얼코어 32비트 LX6 @ 240MHz
- RAM: 520KB SRAM
- Flash: 4MB
- WiFi: 802.11 b/g/n (2.4GHz)
- Bluetooth: BLE 4.2
- GPIO: 30개 (일부 예약됨)
- ADC: 12비트, 18채널
- SPI: 4개 (HSPI, VSPI 사용)
- I2C: 2개
- 전원: 3.3V (내부 레귤레이터)

**MCP2515 CAN 컨트롤러**
- 프로토콜: CAN 2.0A/2.0B
- 속도: 125Kbps ~ 1Mbps
- 크리스탈: 8MHz
- 인터페이스: SPI (최대 10MHz)
- 버퍼: 2개 RX, 3개 TX
- 필터: 2개 마스크, 6개 필터
- 전압: 2.7V ~ 5.5V (3.3V 권장)

**SD 카드 모듈**
- 인터페이스: SPI
- 지원 카드: MicroSD, SDHC (최대 32GB)
- 파일 시스템: FAT16, FAT32
- 속도: Class 4~10

**DS3231 RTC 모듈**
- 정확도: ±2ppm (0~+40°C)
- 인터페이스: I2C (0x68)
- 배터리: CR2032 (백업)
- 온도 센서: ±3°C
- 수명: 수년 (배터리 교체 시)

### 소프트웨어 사양

**운영체제**
- FreeRTOS (ESP32 내장)
- Task 우선순위 지원
- 다중 코어 스케줄링

**Task 구성**
| Task | 우선순위 | 코어 | 역할 |
|------|----------|------|------|
| CAN_RX | 4 (최고) | 1 | CAN 메시지 수신 |
| SD_WRITE | 3 | 1 | SD 카드 쓰기 |
| WEB_UPDATE | 2 | 0 | 웹소켓 업데이트 |
| SD_MONITOR | 1 | 0 | SD 모니터링 |
| RTC_SYNC | 0 (최저) | 0 | RTC 동기화 |

**버퍼 및 큐**
- CAN 큐: 1,000 메시지
- 파일 버퍼: 8KB (약 380 메시지)
- 최근 메시지: 100개 (실시간 표시)
- TX 슬롯: 20개

**통신 프로토콜**
- HTTP: 웹 서버 (포트 80)
- WebSocket: 실시간 통신 (포트 81)
- SPI: 하드웨어 통신
- I2C: RTC 통신

### 성능 지표

**CAN 수신**
- 최대 속도: 1Mbps
- 처리량: 초당 약 7,000 메시지
- 지연 시간: < 1ms (인터럽트)

**로깅 성능**
- 쓰기 속도: Class 10 SD 기준 약 10MB/s
- 버퍼링: 8KB 단위
- 최대 로깅: 초당 약 5,000 메시지 (지속)

**WiFi 성능**
- 범위: 약 50m (실내)
- 최대 클라이언트: 4개 (권장 1~2개)
- 웹소켓 지연: < 100ms

**전력 소비**
- 대기 모드: 약 150mA @ 5V
- 로깅 모드: 약 300mA @ 5V
- WiFi 활성: 약 200mA 추가
- 최대 소비: 약 500mA @ 5V

---

## 안전 및 주의사항

### ⚠️ 일반 안전

- 장치를 물이나 습기에 노출시키지 마세요
- 권장 전압(5V) 이상을 입력하지 마세요
- 정전기 방지 조치를 취하세요
- 어린이의 손이 닿지 않는 곳에 보관하세요

### 🚗 자동차 사용 시 주의

- **경고:** CAN 버스 조작은 차량의 안전 시스템에 영향을 줄 수 있습니다
- 주행 중 송신 기능 사용을 자제하세요
- 차량 제조사의 승인 없이 ECU를 변경하지 마세요
- 진단 전문가의 지도 하에 사용하세요
- 불법 개조에 사용하지 마세요

### 🔌 전기 안전

- USB 포트의 전류 제한을 확인하세요 (최소 2A)
- 과열 시 즉시 전원을 차단하세요
- 배선 시 쇼트에 주의하세요
- 금속 물체가 회로에 닿지 않도록 하세요

### 📂 데이터 보호

- 중요한 로그는 정기적으로 백업하세요
- SD 카드는 안전하게 제거하세요 (로깅 중지 후)
- 개인정보가 포함된 데이터는 암호화하세요
- 타인의 차량 데이터를 무단으로 수집하지 마세요

---

## 법적 고지

### 저작권
© 2025 Byun CAN Logger. All rights reserved.

### 라이선스
- 개인 및 교육 목적으로 자유롭게 사용 가능
- 상업적 재배포 시 사전 승인 필요
- 오픈소스 라이브러리는 각각의 라이선스를 따름

### 보증 제한
- 본 제품은 "있는 그대로" 제공됩니다
- 특정 목적에 대한 적합성을 보증하지 않습니다
- 제품 사용으로 인한 직간접적 손해에 대해 책임지지 않습니다

### 준수 사항
- 현지 법률 및 규정을 준수하여 사용하세요
- 차량 제조사의 보증을 확인하세요
- 통신법 및 전파법을 준수하세요

---

## 부록

### A. CAN 버스 기초

**CAN (Controller Area Network)**
- 자동차 및 산업용 통신 프로토콜
- 다중 마스터 구조
- 충돌 감지 및 자동 재전송
- 우선순위 기반 중재

**메시지 구조:**
```
[ SOF | ID | RTR | IDE | DLC | DATA | CRC | ACK | EOF ]
```

**ID 우선순위:**
- ID가 낮을수록 높은 우선순위
- 0x000이 가장 높음
- 0x7FF가 가장 낮음 (Standard)

### B. 자주 사용하는 CAN ID (자동차)

| ID | 설명 | 주기 |
|----|------|------|
| 0x100 | 엔진 제어 | 10ms |
| 0x280 | 차량 속도, 거리 | 20ms |
| 0x316 | 엔진 RPM, 토크 | 10ms |
| 0x329 | 냉각수 온도 | 100ms |
| 0x3B7 | 연료량 | 100ms |
| 0x420 | 배터리 전압 | 1000ms |

💡 **참고:** 차종마다 다를 수 있습니다. DBC 파일을 참조하세요.

### C. 용어 설명

- **CAN:** Controller Area Network
- **DLC:** Data Length Code (데이터 길이)
- **ID:** Identifier (식별자)
- **RTR:** Remote Transmission Request
- **RTC:** Real-Time Clock
- **SPI:** Serial Peripheral Interface
- **I2C:** Inter-Integrated Circuit
- **OBD-II:** On-Board Diagnostics II
- **ECU:** Electronic Control Unit
- **DBC:** Database CAN (메시지 정의 파일)
- **Endian:** 바이트 순서 (LE: Little Endian, BE: Big Endian)

### D. 연락처

**기술 지원:**
- 이메일: support@example.com
- 웹사이트: www.example.com
- 전화: 000-0000-0000

**영업 시간:**
- 평일: 09:00 - 18:00
- 주말/공휴일: 휴무

**피드백:**
- GitHub: https://github.com/username/repo
- 버그 리포트 환영

---

**감사합니다!**

본 제품을 선택해 주셔서 감사합니다. 
궁금한 점이 있으시면 언제든지 연락 주세요.

**버전:** 1.3  
**최종 수정:** 2025년 1월  
**문서 코드:** ESP32-CAN-LOGGER-MAN-KR-v1.3
