[2025-09-20] ESP32_R3.1 / MPINO_R1.4

ESP32 I²C↔MQTT Bridge & MPINO Control — README
이 문서는 현 스케치 기준으로 사용하는
시리얼 명령어(Serial CLI) 와 MQTT 토픽/명령(페이로드 형식) 을 한눈에 정리한 것입니다.
베이스 토픽, Wi-Fi·MQTT 설정은 시리얼 CLI로 변경할 수 있으며 NVS에 영구 저장됩니다.
________________________________________
개요
•	ESP32가 I²C 마스터로 MPINO 슬레이브를 폴링하여 센서/설정 프레임을 수신하고 MQTT로 퍼블리시합니다.
•	외부에서 MQTT 명령을 보내면 ESP32가 I²C로 3바이트 명령을 슬레이브에 전달합니다.
•	설정은 모두 Preferences(NVS) 에 저장되어 전원 재인가 후에도 유지됩니다.
•	저장된 Wi-Fi AP가 1개도 없으면 부팅 시 자동으로 CONFIG 모드에 진입합니다.
________________________________________
시리얼 명령어 (Serial CLI)
명령	형식	설명
HELP	HELP	가능한 모든 명령과 사용법을 표시
CONFIG	CONFIG	설정 모드 진입 (Wi-Fi/MQTT 연결·I²C 폴링 일시 중지)
EXIT	EXIT 또는 CONFIG OFF	설정 모드 종료, 정상 동작 재개
LIST	LIST	저장된 Wi-Fi AP 후보 목록 표시(최대 6개)
ADD	ADD ssid,password	AP 후보 추가
EDIT	EDIT index ssid,password	AP 후보 수정
DELETE	DELETE index	AP 후보 삭제
CLEAR	CLEAR	AP 후보 전체 삭제
MQTTSET	MQTTSET server,user,pass,topic	MQTT 설정 저장• server는 host 또는 host:port 형식• topic은 베이스 토픽
MQTTINFO	MQTTINFO	현재 MQTT 설정과 파생 토픽(status/config/command/…) 표시
REQINFO	REQINFO	REQID와 REQTIME 현재값 요약 표시
REQID	REQID [start,end]	폴링 ID 범위 설정 또는 인자 없이 조회
REQTIME	REQTIME [ms]	폴링 주기(ms) 설정 또는 인자 없이 조회 (하한 200 ms)
메모
• 모든 설정은 NVS에 영구 저장됩니다.
• REQTIME 간격마다 I²C를 읽고 유효 프레임이면 바로 MQTT 발행합니다.
• 슬레이브가 SENSOR/CONFIG 프레임을 번갈아 보낸다면, 특정 단일 토픽만 보면 체감 주기가 2 REQTIME처럼 보일 수 있습니다.
예시
CONFIG
ADD MyAP,myPw
MQTTSET qideun.com,,,"selimcns"
REQTIME 1000
REQID 1,16
EXIT
________________________________________
MQTT 토픽
아래 예시는 베이스 토픽이 selimcns인 경우입니다.
베이스 토픽은 MQTTSET …,<base> 로 변경하면 모든 파생 토픽이 함께 바뀝니다.
퍼블리시(ESP32 → 브로커)
•	selimcns/status — 센서값 JSON
•	{
•	  "EC":123, "pH":6.54,
•	  "airTemperature":23.45, "airHumidity":55.67,
•	  "ADC0":0, "ADC1":0, "ADC2":0,
•	  "soilTemp1":21.34, "soilTemp2":22.01,
•	  "l_minute":0, "pumpPin":0, "valvePin":0,
•	  "waterLevelPin":0, "rainSensor":0
•	}
•	selimcns/config — 구성(설정 프레임) JSON
•	{
•	  "currentMode":0,
•	  "cycleTime":0,
•	  "cycleRestartDelay":0,
•	  "valveDelay":0,
•	  "smStart":0, "smStop":0
•	}
•	selimcns/bridge — LWT (retain)
연결 시 "online" 발행, 비정상 종료 시 브로커가 "offline" 게시.
•	selimcns/speed/response — 핑 응답(ECHO)
구독(브리지 ← 외부)
•	selimcns/command — 명령 토픽
o	페이로드 형식: 문자열 "ID,VALUE" (쉼표로 구분된 10진 정수 2개, 공백 없음)
o	동작: ESP32가 I²C로 3바이트 [ID][VALUE LSB][VALUE MSB] 를 슬레이브에 전송
o	권장: retain 사용 금지(재접속 시 재실행 방지)
•	selimcns/speed — 핑용 ECHO 입력
수신 페이로드를 그대로 selimcns/speed/response에 재전송
________________________________________
명령 ID 매핑 (슬레이브 receiveData() 기준)
ID	의미	VALUE (단위)	비고
1	모드 전환	0=MANUAL, 1=AUTO, 2=AI	전환 시 stopPumpSequence() 수행
2	펌프 제어	0=OFF, 1=ON	AI 모드에서만 유효. 밸브 선개방+지연 후 ON
3	cycleTime	초	펌프 ON 유지 시간 (최대 65,535 s ≈ 18.2 h)
4	cycleRestartDelay	초	펌프 OFF 유지 시간
5	valveDelay	초	밸브 개방 후 펌프 ON까지 딜레이
6	smStart	0~1023	자동 모드 ON 임계 (3개 ADC 중 2개 초과)
7	smStop	0~1023	자동 모드 OFF 임계 (3개 ADC 중 2개 미만)
8	holdDuration	초	조건 유지 시간(채터링 방지)
설정 명령(3~8)을 보내면 슬레이브가 configData를 갱신·CRC 재계산 후 I²C로 내보내며,
브리지가 곧바로 <base>/config에 새 값을 퍼블리시합니다. 이를 간접 ACK 로 활용하세요.
________________________________________
사용 예시
# 자동 모드로 전환
mosquitto_pub -h qideun.com -t selimcns/command -m "1,1"

# 자동 모드 파라미터 설정
mosquitto_pub -h qideun.com -t selimcns/command -m "6,850"   # smStart
mosquitto_pub -h qideun.com -t selimcns/command -m "7,600"   # smStop
mosquitto_pub -h qideun.com -t selimcns/command -m "5,5"     # valveDelay 5s
mosquitto_pub -h qideun.com -t selimcns/command -m "3,300"   # cycleTime 5분
mosquitto_pub -h qideun.com -t selimcns/command -m "4,900"   # restartDelay 15분

# AI 모드에서 펌프 ON → OFF
mosquitto_pub -h qideun.com -t selimcns/command -m "1,2"     # AI 모드
mosquitto_pub -h qideun.com -t selimcns/command -m "2,1"     # 펌프 ON
mosquitto_pub -h qideun.com -t selimcns/command -m "2,0"     # 펌프 OFF

# 상태/설정 모니터링
mosquitto_sub -h qideun.com -t selimcns/status
mosquitto_sub -h qideun.com -t selimcns/config
________________________________________
참고 & 주의사항
•	베이스 토픽은 MQTTSET의 마지막 인자로 설정합니다. 변경 시 모든 파생 토픽이 자동 갱신됩니다.
•	REQTIME은 I²C 폴링 주기입니다. 슬레이브가 SENSOR/CONFIG를 번갈아 보낼 경우, 특정 단일 토픽 기준 체감 주기가 2 REQTIME처럼 보일 수 있습니다. 필요 시 REQTIME을 절반으로 조정하거나(간단), 코드에서 한 사이클에 2회 폴링하도록 변경할 수 있습니다.
•	명령 토픽은 retain 금지를 권장합니다(재접속 시 동일 명령 재적용 방지).
•	타이밍 명령(3,4,5,8)의 단위는 초, 내부에서는 ms로 변환되어 사용됩니다.
•	smStart > smStop(히스테리시스)을 권장합니다.
•	네트워크가 끊기거나 CRC 에러가 나면 해당 주기의 MQTT 발행은 스킵됩니다(로그 확인).
