Files
HECO2/CLAUDE.md
T
jeon 096111e983 feat: 06-17 신규 작업본 반영 (개발사양서/기능검토/승인원/Source 등 추가)
.claude/ 제외(.gitignore 추가). 기존 초기커밋(5a96a69) 위에 신규·수정·이동분 커밋.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 07:54:58 +09:00

193 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
■ 작업 기록 규칙 (필수)
- 코드/사양 작업을 하면 그 내용을 `doc` 폴더에 마크다운으로 기록할 것.
- 파일명: `YYMMDD_제목` 형식 (예: `doc/260617_수정내용.md`).
- 같은 날 추가 작업은 그 날짜 파일에 이어서 append.
- 기록 항목: 변경 파일/이유/핵심 결정, 빌드 결과, 미해결/후속 사항.
■ 펌웨어 위치/작업 규칙
- **펌웨어 폴더: `SOURCE/HECO2/`** (User, Library, Makefile, build.sh). 구 `program/`에서 2026-06-17 이동됨 — 이전 문서/메모의 `program/User/...``SOURCE/HECO2/User/...`로 읽을 것.
- `SOURCE/HECO2/User/My_RJ2.c`(룸컨), `My_bunbaegi.c`(각실분배기)는 수정 금지 — 검증된 코드. 문제는 `My_Homenet.c`/`MyMotor.c`/`My_system.c`/`My_Hood.c` 또는 대시보드 쪽에서 해결.
- 펌웨어 수정 후 반드시 빌드 확인: `cd SOURCE/HECO2 && bash build.sh all` (경고/오류 0).
DL 각실제어 시스템 구성
HERV (전열교환기) -(485통신) BUNBAGI -(485통신) 배기(RA) DIFFUSER -(485통신) 급기(SA) DIFFUSER
각실 DIFFUSER 구성
거실 : 배기(RA) DIFFUSER / 급기(SA1) DIFFUSER / 급기(SA2) DIFFUSER
방1 ~ 방3 : 배기(RA) DIFFUSER / 급기(SA) DIFFUSER
프로토콜
HERV / BUNBAGI / DIFFUSER : 수정_Each_Room_Jushin_protocol_RS485_Rev1.2_20260115_CWS
대시보드 프로그램 (모두 TestProgram 폴더 하위)
C# WPF .NET 10
빌드 및 배포방법
PC 대시보드
dotnet cleand 프로젝트명
dotnet build 프로젝트명
dotnet publish "d:\project\nuvoton\HERV\TestProgram\PCDashBoard\ErvDashboard.csproj" -c Release
csproj에 SelfContained / PublishSingleFile / win-x64 가 이미 설정돼 있어서 추가 옵션이 필요 없습니다.
결과물: TestProgram\PCDashBoard\bin\Release\net10.0-windows\win-x64\publish\ErvDashboard.exe
WEB 대시보드
# 런타임 미설치 PC용 (단일 exe, 권장)
dotnet publish "d:\project\nuvoton\HERV\TestProgram\WebDashBoard\ErvCollector\ErvCollector.csproj" `
-c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
# .NET 10 런타임 이미 깔린 PC용 (가벼움)
dotnet publish "d:\project\nuvoton\HERV\TestProgram\WebDashBoard\ErvCollector\ErvCollector.csproj" -c Release
결과물: ...\ErvCollector\bin\Release\net10.0\win-x64\publish\
appsettings.json 과 wwwroot\ (웹 모니터 정적파일)가 publish 폴더에 같이 복사됩니다 — publish 폴더 전체를 통째로 복사하세요. exe만 떼면 웹 화면이 안 뜹니다.
해상도 : 1920 X 1200 (노트북 기준) 안 넘게 제작.
프로토콜 : PC_ERV_Protocol.MD
공용 라이브러리 : TestProgram/ErvProtocol 폴더 (단일 진실원본)
PC용 (485통신) - TestProgram/PCDashBoard (ErvDashboard.csproj)
WEB용 (WIFI) - TestProgram/WebDashBoard (ErvCollector 수집·제어 서버 + ErvWebDashboard 모니터)
시뮬레이터 프로그램
C# WPF
UI 내용은 정적생성 할 것. 반복생성은 제외.
ERV SIMULATOR :
DIFFUSER SIMULATOR :
HERV 사양
동작사양
전원 : ON, OFF
운전모드 : 환기(수동), 자동, 바이패스, 공기청정
(운전모드 전환 시 풍량 1단, 자동 제외)
특이사항 : 기저운전/장비보호
(꺼짐예약) : 0 ~ 8 시간, 1시간 단위, 0은 꺼짐
VSP 설정값 (1바이트 0~255, 개발사양서 p.12 휴벤 ECO2/좌타입 HRD1-150EPI = 펌웨어 MyControl.c 기본값)
※ 환기 터보-4(250CMH)는 사양서 자동(각실제어) 250 행 값. 기저(50CMH, SA52/EA53)는 대시보드 VSP 9엔트리에서 제외.
| 구분 | 단수 | 풍량(CMH) | VSP SA | VSP EA | 전압 SA(V) | 전압 EA(V) |
|----------|--------|-----------|--------|--------|-----------|-----------|
| 환기 | 약-1 | 100 | 56 | 57 | 3.30 | 3.35 |
| 환기 | 중-2 | 150 | 63 | 63 | 3.65 | 3.65 |
| 환기 | 강-3 | 200 | 70 | 70 | 4.00 | 4.00 |
| 환기 | 터보-4 | 250 | 86 | 85 | 4.80 | 4.75 |
| 바이패스 | 기본 | 150 | 67 | 75 | 3.85 | 4.25 |
| 공청 | 약-1 | 80 | 65 | - | 3.75 | - |
| 공청 | 중-2 | 100 | 72 | - | 4.10 | - |
| 공청 | 강-3 | 120 | 78 | - | 4.40 | - |
| 공청 | 터보-4 | 150 | 80 | - | 4.50 | - |
VSP 테이블 (VSP ↔ 실측전압, V = VSP × 0.05 + 0.5)
| VSP | V | VSP | V | VSP | V | VSP | V | VSP | V |
|----|------|----|------|----|------|----|------|----|------|
| 5 | 0.75 | 25 | 1.75 | 45 | 2.75 | 65 | 3.75 | 85 | 4.75 |
| 6 | 0.80 | 26 | 1.80 | 46 | 2.80 | 66 | 3.80 | 86 | 4.80 |
| 7 | 0.85 | 27 | 1.85 | 47 | 2.85 | 67 | 3.85 | 87 | 4.85 |
| 8 | 0.90 | 28 | 1.90 | 48 | 2.90 | 68 | 3.90 | 88 | 4.90 |
| 9 | 0.95 | 29 | 1.95 | 49 | 2.95 | 69 | 3.95 | 89 | 4.95 |
| 10 | 1.00 | 30 | 2.00 | 50 | 3.00 | 70 | 4.00 | 90 | 5.00 |
| 11 | 1.05 | 31 | 2.05 | 51 | 3.05 | 71 | 4.05 | 91 | 5.05 |
| 12 | 1.10 | 32 | 2.10 | 52 | 3.10 | 72 | 4.10 | 92 | 5.10 |
| 13 | 1.15 | 33 | 2.15 | 53 | 3.15 | 73 | 4.15 | 93 | 5.15 |
| 14 | 1.20 | 34 | 2.20 | 54 | 3.20 | 74 | 4.20 | 94 | 5.20 |
| 15 | 1.25 | 35 | 2.25 | 55 | 3.25 | 75 | 4.25 | 95 | 5.25 |
| 16 | 1.30 | 36 | 2.30 | 56 | 3.30 | 76 | 4.30 | | |
| 17 | 1.35 | 37 | 2.35 | 57 | 3.35 | 77 | 4.35 | | |
| 18 | 1.40 | 38 | 2.40 | 58 | 3.40 | 78 | 4.40 | | |
| 19 | 1.45 | 39 | 2.45 | 59 | 3.45 | 79 | 4.45 | | |
| 20 | 1.50 | 40 | 2.50 | 60 | 3.50 | 80 | 4.50 | | |
| 21 | 1.55 | 41 | 2.55 | 61 | 3.55 | 81 | 4.55 | | |
| 22 | 1.60 | 42 | 2.60 | 62 | 3.60 | 82 | 4.60 | | |
| 23 | 1.65 | 43 | 2.65 | 63 | 3.65 | 83 | 4.65 | | |
| 24 | 1.70 | 44 | 2.70 | 64 | 3.70 | 84 | 4.70 | | |
공기질 센서 모드별 오염단계 임계 및 히스테리시스(하강)
| 오염단계 | ECO CO2 | ECO PM2.5 | ECO PM10 | ECO VOC | NORMAL CO2 | NORMAL PM2.5 | NORMAL PM10 | NORMAL VOC | TURBO CO2 | TURBO PM2.5 | TURBO PM10 | TURBO VOC | 상태/색상 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0~1000 | 0~20 | 0~40 | 0~171 | 0~800 | 0~14 | 0~28 | 0~120 | 0~700 | 0~12 | 0~24 | 0~103 | 좋음(파랑) |
| 1 | 1001~1300 | 21~38 | 41~86 | 172~195 | 801~1100 | 15~29 | 29~66 | 121~150 | 701~1000 | 13~23 | 25~53 | 104~120 | 보통(초록) |
| 2 | 1301~1600 | 39~60 | 87~126 | 196~308 | 1101~1400 | 30~49 | 67~102 | 151~250 | 1001~1300 | 24~38 | 54~78 | 121~192 | 나쁨(노랑) |
| 3 | 1601~2000 | 61~86 | 127~173 | 309~438 | 1401~1700 | 50~69 | 103~138 | 251~350 | 1301~1600 | 39~52 | 79~104 | 193~263 | 매우나쁨(주황) |
| 4 | 2001~ | 87~ | 174~ | 439~ | 1701~ | 70~ | 139~ | 351~ | 1601~ | 53~ | 105~ | 264~ | 매우나쁨(빨강) |
| 히스(하강) | -50 | -2 | -5 | -5 | -50 | -2 | -5 | -5 | -30 | -2 | -5 | -3 | |
각실제어 시나리오모드 : 자동(분산,집중), 안심회복, 스마트 수면, 쾌적조리
회로도 : HERV_MAIN_REV1.1_20240826(회로도).PDF
■ NANO100 메모리 맵 (MCU: Nano100SE3BN — LDROM 4K / APROM 115K / Data Flash 8K / SRAM 16K)
출처: DS_Nano100(B)_Series_EN_Rev1.09.pdf (5.2 Memory Organization p.106, 5.6 FMC p.111) + SOURCE/HECO2/Library .../fmc.h, EEPROM_Emulate.h
(1) 시스템 주소공간 (Cortex-M0, 리틀엔디안, 4GB)
| 주소 범위 | 영역 | 비고 |
|---|---|---|
| 0x0000_0000 ~ 0x0001_FFFF | FLASH (코드) | FLASH_BA, 최대 128KB 어드레싱(실제 칩은 123K 프로그램+4K LDROM+Config) |
| 0x2000_0000 ~ 0x2000_3FFF | SRAM 16KB | SRAM_BA |
| 0x4000_0000 ~ 0x401F_FFFF | APB1/APB2 주변장치 | WDT0x40004000·RTC0x40008000·TMR01 0x40010000·I2C0 0x40020000·PWM0 0x40040000·UART0 0x40050000·USBD 0x40060000·ADC12 0x400E0000 / TMR23 0x40110000·UART1 0x40150000·SC0 0x40190000·SC1 0x401B0000·SC2 0x401C0000 |
| 0x5000_0000 ~ 0x5001_FFFF | AHB 주변장치 | GCR 0x50000000·CLK 0x50000200·INT 0x50000300·GPIO 0x50004000·DMA 0x50008000·FMC 0x5000C000·EBI 0x50010000 |
| 0xE000_E000 ~ 0xE000_EFFF | 시스템 제어 | SysTick·NVIC·SCS |
(2) 온칩 플래시 내부 구조 (FMC, 페이지 512B 단위, fmc.h)
| 주소 범위 | 크기 | 영역 | 용도 |
|---|---|---|---|
| 0x0000_0000 ~ 0x0001_CC00 | 115KB | **APROM** (응용 프로그램) | 펌웨어 코드 + EEPROM 에뮬레이션이 여기 안에 있음 |
| 0x0001_CC00 ~ 0x0001_EC00 | 8KB | **Data Flash** | 시작주소 = Config1(DFBA) = 0x0001CC00. **현재 펌웨어 미사용** |
| 0x0010_0000 ~ 0x0010_1000 | 4KB | LDROM (ISP 로더) | 미사용 |
| 0x0030_0000 ~ | - | User Config | CONFIG0=0xFFFFFFFE(CBS 부팅선택 등), CONFIG1=0x0001CC00(DFBA) |
| (APROM+DataFlash 합) 0x0 ~ 0x1EC00 | 123KB | 전체 프로그램 플래시 | DS의 "123K APROM"은 Data Flash 포함 합계(공유) |
(3) 우리가 실제로 쓰는 영역
| 주소 | 크기 | 무엇 | 근거 |
|---|---|---|---|
| 0x0000_0000 ~ 0x0000_B338 | ~46KB | 펌웨어(벡터/코드/rodata/data-init) | build/HERV.bin 크기 (text 43.9K+data 1.9K) |
| 0x0000_B338 ~ 0x0000_FC00 | ~18KB | (빈 APROM) | 코드와 EEPROM 사이 여유 |
| **0x0000_FC00 ~ 0x0000_FFFF** | **1KB (512B×2페이지)** | **EEPROM 에뮬레이션** | `EEP_FLASH_BASE=0xFC00`, `EEP_PAGE_COUNT=2` (EEPROM_Emulate.h). **APROM 내부이며 칩 Data Flash 아님** |
| 0x0000_FFFF ~ 0x0001_CC00 | ~68KB | (빈 APROM) | 미사용 |
| 0x0001_CC00 ~ 0x0001_EC00 | 8KB | 칩 Data Flash | **현재 미사용** (사장님이 FF로 쓰는 곳이 여기 — EEPROM과 다른 영역) |
| 0x2000_0000 ~ 0x2000_3FFF | 16KB | SRAM (gcc_arm.ld) | 스택/힙/.data/.bss |
⚠ 핵심 주의
- **펌웨어 EEPROM(0xFC00, APROM 내부) ≠ 칩 Data Flash(0x1CC00).** 그래서 Nu-Link ICP로 Data Flash에 FF를 써도 EEPROM은 안 지워짐. EEPROM을 비우려면 **칩 이레이즈** 또는 0xFC00 포함 APROM 이레이즈 필요. (`build.sh flash`=program은 코드 섹터만 지워 0xFC00 유지 → 구 EEPROM 잔존)
- **링커 `gcc_arm.ld`는 EEPROM/Data Flash 영역을 예약/보호하지 않음** (FLASH를 0x0~0x20000 통짜로 잡음, 길이 표기도 칩과 불일치). 펌웨어가 0xFC00(63KB)을 넘으면 코드가 EEPROM 위에 얹혀 충돌 — 현재 ~46KB라 여유 있음.
- EEPROM 에뮬레이션 = 2페이지 wear-leveling(EEPROM_Emulate.c). 페이지 매직 0x55AA0001, 엔트리 4B(TAG 0xE5 | idx | ~idx | val), 가득 차면 compact()로 다른 페이지 이동 후 옛 페이지 erase. 논리 인덱스 0~127(128B)을 아래 표대로 사용.
EEPROM 저장 데이터 (논리 인덱스, My_define.h EEP_*, page 128B / 엔트리 약 122)
| 인덱스 | 항목 | 비고 |
|---|---|---|
| 0~3 | 서명 0x55AA55AA | 초기화 마커 |
| 5 | Modbus ID | |
| 10~33 | 팬 VSP 프리셋 s_FAN1/2 (환기·공청·바이패스 1~4) | 1바이트, 대시보드 CTRL_VSP 반영 |
| 34~39 | 필터/소자 청소·교체 시간 | u16 |
| 40~42 | 정전복귀(전원/운전모드/풍량) | |
| 43 | 히스테리시스 활성 프리셋 (0 ECO/1 NORMAL/2 TURBO) | 유효성 마커 겸용 |
| 44~55 | 데드밴드(하강) Co2/Pm25/Pm10/Voc × 3프리셋 | u8 |
| 56~79 | CO2 임계 Co2_Thr[3][4] | u16 |
| 80~103 | VOC 임계 Voc_Thr[3][4] | u16 |
| 104~115 | PM2.5 임계 Pm25_Thr[3][4] | u8 |
| 116~127 | PM10 임계 Pm10_Thr[3][4] | u8 |
- 대시보드에서 전원/모드/VSP/히스테리시스(프리셋·임계·데드밴드) 변경 → ERV가 EEPROM 저장(재부팅 유지).
- 구버전 펌웨어(STATUS 134B, 구 m_*_Level) EEPROM은 신규 영역 미초기화 → 기본값(사양값) 사용 후 변경 시 저장.
BUNBAGI 사양
회로도 : HERV_MAIN_REV1.1_20240826(회로도).PDF
STATUS LED : STATUS_LED-PB.14, ACTIVE LOW
DIFFUSER 사양
급기(SA) DIFFUSER 구성 : 댐퍼
배기(RA) DIFFUSER 구성 : 댐퍼, 공기질센서, LED
회로도 : 전동디퓨져_REV1.0_20260130.PDF
STATUS LED : STATUS_LED-PA.11, ACTIVE LOW
SELECT SWITCH : SW1, DIPSW1-PA.10, LOW-SA, HIGH-RA
485 통신 : CN3, CN4, INT485TX-PB.5, INT485RX-PB.4, INT485DIR-PB.6
댐퍼 : CN2, STEP1_A-PC.8,STEP1_B-PC.9,STEP1_C-PC.10,STEP1_D-PC.11
공기질 센서 : CN5, SENSOR_ON-PA.3, SENSOR_SCL-PA.5, SENSOR_SDA-PA.4, SEN66
LED : CN6, LED_ON-PA.15, LED_R-PA.14,LED_G-PA.13,LED_B-PA.12