로그인회원가입

[카테고리:] 스마트홈

홈 오토메이션 관련 DIY

  • ESP32-C3 통신 가이드: ESP-NOW vs WebSocket vs WebServer,  프로젝트에 최적인 선택은?

    ESP32-C3 통신 가이드: ESP-NOW vs WebSocket vs WebServer, 프로젝트에 최적인 선택은?

    ESP32-C3에서 ESP-NOW, WebServer(HTTP), WebSocket의 속도를 비교할 때 가장 중요한 기준은 프로토콜의 오버헤드(Overhead)와 연결 방식(Connectionless vs Connection-oriented)입니다.

    각 프로토콜의 특성과 속도 성능을 비교 분석해 드립니다.


    1. 프로토콜별 성능 비교 요약

    항목ESP-NOWWebSocketWebServer (HTTP)
    통신 계층Layer 2 (Data Link)Layer 7 (Application/TCP)Layer 7 (Application/TCP)
    속도(Throughput)매우 빠름 (최대 1~4 Mbps)빠름 (최대 1~2 Mbps)느림 (요청당 오버헤드 큼)
    지연 시간(Latency)매우 낮음 (약 1~5ms)낮음 (약 10~50ms)높음 (약 100~500ms+)
    연결 방식비연결형 (Pairing 필요)연결 지향형 (지속 유지)연결 지향형 (매번 요청/응답)
    최대 데이터 크기250 Bytes (1패킷당)사실상 제한 없음 (스트림)사실상 제한 없음

    2. 상세 성능 분석

    ① ESP-NOW (가장 빠름)

    ESP-NOW는 Wi-Fi의 비컨(Beacon) 프레임을 이용하며, TCP/IP 스택을 거치지 않습니다.

    • 장점: 통신 준비 과정(Handshake)이 거의 없어 지연 시간이 압도적으로 짧습니다. 전원을 켜자마자 바로 데이터를 보낼 수 있을 정도로 빠릅니다.
    • 속도 특성: 패킷당 최대 250바이트로 제한되지만, 불필요한 헤더 정보가 없어 작은 데이터를 수천 번 보낼 때 최고의 효율을 보입니다.
    • 적합한 용도: 센서 데이터 실시간 전송, 리모컨 제어, 초저전력 배터리 기기.

    ② WebSocket (실시간성 양호)

    TCP 연결을 한 번 맺은 후, 클라이언트와 서버가 서로 지속적으로 데이터를 주고받습니다.

    • 장점: HTTP와 달리 매번 헤더를 보낼 필요가 없습니다. 한 번 연결되면 데이터 프레임만 오가므로 HTTP보다 2~5배 이상 빠릅니다.
    • 속도 특성: TCP 기반이므로 데이터 무결성이 보장되지만, 패킷 손실 시 재전송 대기 시간으로 인해 ESP-NOW보다는 지연이 발생합니다.
    • 적합한 용도: 실시간 웹 대시보드, 쌍방향 채팅 제어, 빈번한 데이터 업데이트.

    ③ WebServer (HTTP/REST) (가장 느림)

    전형적인 요청-응답(Request-Response) 방식입니다.

    • 단점: 데이터를 하나 보낼 때마다 TCP 연결 설정 → HTTP 헤더 전송 → 데이터 전송 → 연결 종료의 과정을 반복합니다. 이 과정에서 발생하는 오버헤드가 실제 데이터 크기보다 클 때가 많습니다.
    • 속도 특성: ESP32-C3의 리소스를 가장 많이 소모하며, 동시에 많은 요청이 들어오면 응답 속도가 급격히 저하됩니다.
    • 적합한 용도: 단순 설정 변경, 로그 확인, 가끔 발생하는 제어 명령.

    3. 결론 및 선택 가이드

    1. 반응 속도가 생명인가? (지연 시간 최소화)
      • ESP-NOW를 선택하세요. (예: 드론 제어, 실시간 버튼 반응)
    2. 웹 브라우저에서 실시간으로 데이터를 보고 싶은가?
      • WebSocket이 정답입니다. 현재 작성하신 코드 방식이 바로 이 효율적인 방식입니다.
    3. 데이터의 양이 많고 신뢰성이 중요한가? (파일 전송 등)
      • WebSocket 또는 일반 HTTP 전송이 유리합니다. ESP-NOW는 데이터 손실 방지 로직을 직접 짜야 하므로 대용량 전송에는 부적합합니다.

    ESP32-C3에서의 팁: ESP32-C3는 싱글 코어(RISC-V) 모델이므로, WebSocket이나 WebServer 구동 시 연산 부하가 ESP32(듀얼 코어) 모델보다 크게 체감될 수 있습니다. 따라서 실시간 제어 루프와 통신 루프 사이의 asyncio.sleep_ms(0) 등을 통한 시분할 처리가 매우 중요합니다.

  • 윈도우즈 설치 폴더 팁, 대체 어디에 설치되서 골치 아픈가?

    윈도우즈 설치 폴더 팁, 대체 어디에 설치되서 골치 아픈가?

    윈도우 시스템에서 프로그램이나 데이터가 설치될 수 있는 주요 경로들을 정리해 드릴게요. Claude CodeNode-RED, 혹은 ESP32 관련 도구들을 다루실 때 이 리스트를 참고하시면 “대체 어디 설치된 거지?”라는 의문이 생길 때 큰 도움이 될 것입니다.


    윈도우 프로그램 설치 가능 폴더 리스트

    구분주요 경로 (Path)성격 및 용도
    시스템 공용 (전체)C:\Program Files64비트 프로그램의 본체가 설치되는 표준 장소 (보안 높음)
    C:\Program Files (x86)32비트 옛날 방식 프로그램들이 설치되는 곳
    사용자 개인 (설정)C:\Users\사용자\AppData\RoamingnpmVS Code 설정, 메신저 등 사용자별 설정값이 저장되는 곳
    사용자 개인 (데이터)C:\Users\사용자\AppData\Local크롬 캐시, 대용량 임시 파일, 특정 사용자용 프로그램 설치 장소
    개발/도구 (루트)C:\Users\사용자.git.vscode.node_red 등 개발 도구의 기본 설정 폴더가 생성되는 곳
    C:\ (루트)일부 언어(C:\Python)나 고전 프로그램들이 직접 만드는 곳

    💡 주의 깊게 보셔야 할 곳들

    1. C:\Users\사용자\AppData\Roaming\npm
      • 아까 설치하신 Claude CodeNode-RED 같은 npm -g 도구들의 실행 파일이 모여 있는 곳입니다. 명령어가 안 먹힐 때 가장 먼저 확인해야 할 장소입니다.
    2. C:\Users\사용자\.vscode\extensions
      • VS Code에서 설치한 각종 확장 프로그램(Cline, Python 등)이 실제로 저장되는 폴더입니다.
    3. C:\Program Files\Git
      • 오늘 설치하신 Git의 본체가 있는 곳입니다. 아까 오류 메시지에 나왔던 bash.exe도 이 폴더 안의 bin 폴더에 들어 있습니다.

    🛠 원하는 폴더를 빨리 찾는 법

    • AppData 폴더로 바로 가기: 윈도우 탐색기 주소창에 %appdata%라고 입력하고 엔터를 치면 바로 Roaming 폴더로 이동합니다. (Local로 가려면 %localappdata%를 입력하세요.)
    • 명령어로 위치 찾기: 터미널에서 where 프로그램이름 (예: where git, where node)을 입력하면 윈도우가 실행 파일의 전체 경로를 알려줍니다.

    사용자님은 직접 코드를 짜고 시스템을 관리하는 **’파워 유저’**에 가까우시니, AppData 폴더가 숨김 처리되어 있다면 탐색기 [보기] 메뉴에서 ‘숨긴 항목’ 체크를 꼭 켜두시는 것을 추천합니다.


    1. 예전에는 참 쉬웠는데… (Program Files의 추억)

    • 예전 윈도우는 C:\Program Files만 보면 다 있었습니다.
    • 왜 지금은 보이지도 않는 AppData라는 곳에 자기 마음대로 숨어버릴까요?

    2. 범인은 바로 ‘보안’과 ‘개인화’

    • Program Files: 원본 파일만 보관하는 공용 거실 (함부로 못 고침)
    • AppData: 사용자마다 따로 쓰는 개인 방 (설정값, 로그인이 저장되는 곳)
    • 프로그램을 만든 사람(개발자)이 윈도우 규칙을 따르다 보니 생기는 현상입니다.

    3. 한눈에 보는 윈도우 설치 폴더 ‘지도’

    • 설정값 비서: Roaming 폴더 (어디든 따라가는 설정)
    • 덩치 큰 창고: Local 폴더 (이 컴퓨터에만 쌓이는 데이터)
    • 나만의 도구함: C:\Users\사용자명 (Git, VS Code 확장 프로그램 등)

    4. 골치 아픈 설치 위치, 3초 만에 찾는 법

    • %appdata% 마법의 명령어 활용하기
    • 작업 관리자에서 ‘파일 위치 열기’ 신공
    • 터미널에서 ‘where’ 명령어로 추적하기

    1. 시작은 ‘스마트홈’이었는데… 왜 일이 커졌을까?

    집안의 온도를 측정하고, 조명을 자동으로 끄는 스마트홈을 직접 구축하다 보면 반드시 만나게 되는 이름이 있습니다. 바로 Node.js입니다.

    우리가 쓰는 스마트홈의 사령부 격인 Node-RED나, 최근 핫한 AI 코딩 비서 Claude Code 같은 프로그램들이 모두 이 ‘Node.js’라는 엔진 위에서 돌아가기 때문입니다. 결국 스마트홈을 돌리려면 엔진(Node.js)을 먼저 깔아야 하고, 그 엔진에 들어가는 각종 부품(프로그램)을 관리하려면 npm이라는 관리자까지 알아야 하는 상황에 직면하게 됩니다.

    2. npm: 우리 집으로 부품을 배달해주는 ‘전문 기사님’

    **npm(Node Package Manager)**은 한마디로 개발 도구 전용 ‘쿠팡’이나 ‘배달의민족’ 같은 서비스입니다. 터미널에 명령어 한 줄만 치면 전 세계 개발자들이 만든 유용한 도구를 내 컴퓨터로 쓱 배송해주죠.

    • Node.js: 프로그램을 돌리는 기초 바닥(엔진)
    • npm: 부품을 가져다주는 배달 기사(관리자)
    • Node-RED / Claude Code: 우리가 실제로 쓰는 가전제품(도구)

    문제는 이 기사님이 물건을 집안(내 컴퓨터) 어디에 두느냐가 프로그램마다 다르다는 점입니다. 여기서부터 우리의 골칫거리가 시작됩니다.


    3. “내 물건 어디 갔어?” 윈도우즈 폴더의 비밀

    npm 기사님은 보통 두 가지 장소에 물건을 내려놓습니다. 이 위치를 모르면 나중에 설정을 바꾸거나 프로그램을 지울 때 정말 골치가 아픕니다.

    ① “공용 거실”에 두기 (Global 설치: -g)

    여러 프로그램에서 공통으로 쓰는 도구들은 사용자 모두가 접근할 수 있는 곳에 둡니다.

    • 주요 경로: C:\Users\사용자명\AppData\Roaming\npm
    • 대상: claude, node-red, edge-impulse-cli 등 명령어로 바로 실행하는 도구들.
    • 특징: 윈도우에서 ‘숨김 폴더’로 되어 있어 눈에 잘 띄지 않습니다.

    ② “작업 중인 방”에 두기 (Local 설치)

    특정 프로젝트(예: 게임 만들기, 데이터 분석) 안에서만 쓰는 부품들은 그 폴더 안에 바로 둡니다.

    • 주요 경로: 내 작업 폴더\node_modules
    • 대상: 해당 프로젝트를 돌리기 위한 전용 부품들.
    • 특징: 폴더 하나만 지우면 깔끔하게 정리되지만, 용량을 많이 차지할 때가 있습니다.

    4. 왜 이렇게 여기저기 깔리는 걸까? (보안과 개인화)

    예전 윈도우(98, XP) 시절에는 모든 것이 C:\Program Files에 모여 있어 찾기 편했습니다. 하지만 요즘은 보안 때문에 **’원본 파일(공용)’**과 **’사용자 설정(개인)’**을 철저히 분리합니다.

    • Program Files: 윈도우가 꽁꽁 잠가둔 원본 보관소. (함부로 못 건드림)
    • AppData: 나만의 설정, 로그인 정보, 임시 데이터가 쌓이는 나만의 방.

    결국, **”프로그램 본체는 관리자가 지키고, 내가 쓰는 데이터는 내 방에 둔다”**는 현대 윈도우의 규칙 때문에 우리 눈에는 설치 폴더가 여기저기 흩어져 있는 것처럼 보이는 것입니다.


    5. 길 잃은 파워 유저를 위한 3줄 팁

    혹시 지금 설치 폴더 때문에 골치가 아프다면 이 세 가지만 기억하세요.

    1. 숨은 폴더 찾기: 탐색기에서 [보기] -> [숨긴 항목] 체크를 켜세요. AppData는 숨겨져 있습니다.
    2. 마법의 주소: 탐색기 주소창에 %appdata%라고 치면 npm이 물건을 두는 Roaming 폴더로 직행합니다.
    3. 어디 있니? 명령어: 터미널에 where claudewhere node를 치면 윈도우가 현재 어디에 있는 파일을 실행 중인지 즉시 알려줍니다.

    npm이 무엇인지, 그리고 왜 우리 컴퓨터의 이곳저곳에 파일을 만드는지 아주 쉽게 설명해 드릴게요.


    1. npm의 정체: “세상에서 가장 큰 앱스토어”

    스마트폰에서 앱을 설치할 때 ‘구글 플레이스토어’나 ‘애플 앱스토어’를 이용하시죠? **npm(Node Package Manager)**은 개발자들을 위한 똑같은 앱스토어라고 생각하시면 됩니다.

    • Node: Node.js라는 환경에서 돌아가는
    • Package: 프로그램 뭉치(부품)들을
    • Manager: 관리해 주는 도구

    전 세계 개발자들이 자신이 만든 유용한 도구(예: Claude Code, Node-RED)를 npm이라는 시장에 올려두면, 우리는 명령어 한 줄로 그걸 내 컴퓨터에 가져와서 쓸 수 있는 것입니다.


    2. npm이 하는 일 세 가지

    1. 배달 (Download): 내가 필요한 프로그램을 인터넷에서 찾아 내 컴퓨터로 다운로드해 줍니다.
    2. 설치 (Install): 다운로드한 프로그램을 실행 가능한 위치(AppData 등)에 적절히 배치해 줍니다.
    3. 관리 (Dependency): 프로그램이 작동하기 위해 필요한 다른 ‘짝꿍 부품’들도 알아서 다 챙겨서 설치해 줍니다. (이게 가장 편리한 점입니다!)

    3. 왜 npm을 쓰면 설치 폴더가 복잡해질까?

    여기서 사용자님이 블로그 제목으로 정하신 **”어디에 설치되나”**의 핵심 원인이 나옵니다. npm은 설치할 때 두 가지 모드를 선택할 수 있기 때문입니다.

    • 전역 설치 (-g): “내 컴퓨터 모든 곳에서 쓸 도구니까 공용 거실(AppData\Roaming\npm)에 놔줘!”
    • 지역 설치 (그냥 install): “지금 작업 중인 이 프로젝트 폴더 안에서만 쓸 거니까 이 방(node_modules)에만 놔줘!”

    4. 비유로 이해하기

    • Node.js: 프로그램을 돌릴 수 있는 ‘기초 공사(바닥)’
    • npm: 그 바닥 위에 필요한 가전제품을 배달해 주는 ‘하이마트/쿠팡’
    • Claude Code / Node-RED: 그 배달 서비스로 받은 ‘가전제품’

    npm은 개발 비서(Claude)를 데려오거나, 스마트 홈 서버(Node-RED)를 구축할 때 가장 자주 쓰게 되는 도구거든요.

    자주 쓰는 명령어들을 용도별로 딱 정리해 드릴게요.


    1. 프로그램 설치 (가장 중요!)

    • npm install -g [이름]: 프로그램을 내 컴퓨터 전체(Global)에 설치합니다.
      • 예: npm install -g @anthropic-ai/claude-code
      • Tip: 어느 폴더에서든 실행해야 하는 ‘도구’를 설치할 때 씁니다.
    • npm install [이름]: 현재 내가 있는 폴더에만 설치합니다.
      • Tip: 특정 프로젝트(예: 게임 만들기) 내에서만 필요한 부품을 가져올 때 씁니다.

    2. 설치된 프로그램 관리

    • npm list -g --depth=0: 내 컴퓨터에 설치된 ‘대장급’ 프로그램 목록을 한눈에 보여줍니다.
      • Tip: “내가 아까 뭘 설치했더라?” 싶을 때 확인하기 좋습니다.
    • npm uninstall -g [이름]: 전역으로 설치된 프로그램을 깨끗하게 지웁니다.
    • npm update -g [이름]: 설치된 프로그램을 최신 버전으로 업데이트합니다.

    3. 정보 확인 및 위치 추적

    • npm root -g: 아까 질문하신 “내 프로그램들이 어디 설치되어 있는가”에 대한 전역 설치 경로를 바로 알려줍니다.
    • npm view [이름] version: 설치하기 전에 해당 프로그램의 최신 버전이 몇 번인지 확인합니다.

    💡 한 줄 요약 표

    명령어하는 일비유
    install -g프로그램 설치전 가전제품 구입
    uninstall -g프로그램 삭제가전제품 폐기
    list -g설치 목록 확인우리 집 가전 목록 보기
    update -g프로그램 업데이트최신형으로 부품 교체

  • ESP32-C3 SmartConfig: 스마트폰 앱으로 WiFi 정보를 전달하는 방법

    ESP32-C3 SmartConfig: 스마트폰 앱으로 WiFi 정보를 전달하는 방법

    IoT 기기를 만들 때 가장 귀찮은 작업 중 하나가 바로 코드에 WiFi 비밀번호를 하드코딩하는 것입니다. 공유기 비번이 바뀌거나 장소를 옮기면 매번 펌웨어를 새로 올려야 하죠.

    오늘은 스마트폰 앱 터치 한 번으로 ESP32-C3에 WiFi 정보를 전달하는 SmartConfig 기능을 알아보겠습니다.


    1. SmartConfig란?

    SmartConfig는 Espressif에서 개발한 기술로, WiFi 정보를 모르는 ESP32 기기에 스마트폰 앱이 특수한 UDP 패킷을 공중에 뿌려 SSID와 비밀번호를 전달하는 방식입니다.

    • 장점: 코드에 비번을 적을 필요가 없음, 사용자 친화적임.
    • 준비물: ESP32-C3, MicroPython 설치됨, 스마트폰(EspTouch 앱).

    2. MicroPython 핵심 코드

    마이크로파이썬에서는 network 모듈을 통해 매우 간단하게 구현할 수 있습니다.

    Python


    3. 스마트폰에서 설정하기

    기기에서 “SmartConfig 대기 중…”이라는 메시지가 나오면 스마트폰에서 다음 과정을 진행합니다.

    1. 앱 설치: 구글 플레이스토어나 앱스토어에서 “EspTouch” (또는 EspTouch:SmartConfig) 앱을 설치합니다.
    2. WiFi 연결: 스마트폰을 ESP32가 연결될 2.4GHz WiFi에 먼저 연결합니다.
    3. 정보 입력: 앱을 열고 WiFi 비밀번호를 입력한 뒤 Confirm 버튼을 누릅니다.
    4. 완료: 잠시 기다리면 ESP32 시리얼 모니터에 연결 성공 메시지가 뜹니다.

    4. 실전 꿀팁: 자동 재연결 로직

    실제 프로젝트에서는 공유기 비번이 바뀌었을 때만 SmartConfig를 켜는 것이 효율적입니다.

    • Step 1: 먼저 NVS나 내부 메모리에 저장된 정보로 접속 시도.
    • Step 2: 10~20초 후에도 실패하면 자동으로 start_smartconfig() 호출.
    • Step 3: 성공하면 다시 메인 루프로 복귀.

    이렇게 짜두면 공유기가 바뀌어도 기기를 뜯을 필요가 전혀 없습니다!


    5. 주의사항

    • 5GHz 미지원: ESP32-C3는 2.4GHz WiFi만 지원하므로, 스마트폰도 반드시 2.4GHz에 연결된 상태여야 합니다.
    • 보안: 공공장소에서 실행 시 비번이 노출될 아주 미세한 위험이 있으니, 설정이 끝나면 반드시 stop_smartconfig()를 호출하세요.

    맺음말

    SmartConfig를 적용하는 순간, 여러분의 ESP32 프로젝트는 ‘장난감’에서 ‘제품’ 수준으로 업그레이드됩니다. 이제 번거로운 하드코딩에서 벗어나 보세요!


    최신 esptouch 설명

    https://github.com/EspressifApp/EsptouchForAndroid?tab=readme-ov-file#readme

    🚀 EspTouch 기술 요약 (GitHub 기준)

    1. 기술 개요

    • SmartConfig 기술: 사용자가 WiFi SSID와 비밀번호를 입력하면, 스마트폰이 특수한 패킷을 공중에 송출(Multicast/Broadcast)하고, ESP32가 이 패킷을 가로채서 WiFi 정보를 획득하는 기술입니다.
    • 가장 큰 특징: 장치에 직접 연결하거나 물리적인 조작을 할 필요 없이 무선으로 정보를 전달할 수 있습니다.

    2. EspTouch V1 vs V2 (주요 차별점) 최근 릴리즈의 핵심은 V2의 도입입니다.

    • V1 (Standard):
      • 기존 ESP32/ESP8266에서 널리 쓰이는 방식.
      • SSID와 Password 정보를 전달하는 데 집중.
      • 보통 MicroPython의 start_smartconfig()가 이 방식을 따릅니다.
    • V2 (Advanced):
      • 보안 강화: AES 암호화를 사용하여 전송되는 비밀번호 데이터를 보호합니다.
      • 커스텀 데이터 지원: WiFi 정보 외에 장치 ID, 사용자 토큰 등 추가적인 데이터를 함께 보낼 수 있습니다.
      • 그룹 캐스팅: 여러 대의 기기를 동시에 설정하기에 더 적합합니다.

    3. 앱 작동 요구사항

    • Android 권한: ACCESS_FINE_LOCATION (위치 권한)이 필수입니다. 이는 안드로이드 OS 보안 정책상 연결된 WiFi의 이름(SSID)을 읽어오기 위해 반드시 필요합니다.
    • 네트워크: 스마트폰이 2.4GHz WiFi에 연결되어 있어야 합니다. (ESP32-C3는 5GHz를 인식하지 못하기 때문)

    4. 개발자 지원 (오픈 소스)

    • 이 리포지토리에는 단순히 앱 설치 파일만 있는 것이 아니라, 개발자가 자신의 서비스 앱에 이 기능을 직접 넣을 수 있도록 Android SDK 형태의 라이브러리 코드를 제공합니다.

    “왜 V1을 먼저 써야 하나요?”

    GitHub 설명을 보면 V2가 더 좋아 보이지만, MicroPython 유저라면 일단 V1 모드로 설명하시는 것이 좋습니다.

    • 이유: MicroPython의 기본 빌드 펌웨어에 포함된 network 모듈은 전통적인 V1 방식을 기준으로 설계된 경우가 많습니다. V2를 쓰려면 펌웨어 수준에서 별도의 복호화 라이브러리가 필요할 수 있기 때문입니다.

    “Espressif의 최신 가이드에 따르면, EspTouch는 기존의 단순 연결 방식(V1)을 넘어 AES 암호화와 추가 데이터 전송이 가능한 V2로 진화했습니다. 하지만 일반적인 마이크로파이썬 프로젝트라면 가장 호환성이 좋은 V1 방식으로도 충분히 강력한 기능을 구현할 수 있습니다. 반드시 위치 권한 허용과 2.4GHz WiFi 연결을 확인하세요!”

  • MicroPython ESP32-C3: 전원이 꺼져도 데이터를 유지하는 NVS 사용법

    MicroPython ESP32-C3: 전원이 꺼져도 데이터를 유지하는 NVS 사용법

    ESP32-C3 마이크로파이썬 NVS(Non-Volatile Storage) 완벽 가이드

    ESP32-C3와 MicroPython을 활용하면서 가장 고민되는 부분 중 하나가 **’전원이 꺼져도 데이터를 어떻게 유지할 것인가’**입니다. 일반적인 변수는 재부팅 시 초기화되지만, **NVS(Non-Volatile Storage)**를 사용하면 설정값이나 상태 정보를 안전하게 저장할 수 있습니다.

    오늘은 MicroPython에서 ESP32-C3의 NVS를 다루는 방법과 활용 팁을 정리해 보겠습니다.


    1. NVS(Non-Volatile Storage)란?

    NVS는 ESP32의 메인 플래시 메모리 일부를 사용하여 데이터를 저장하는 방식입니다. 일반적인 파일 시스템(LittleFS)과 달리 Key-Value 쌍으로 데이터를 저장하며, 다음과 같은 장점이 있습니다.

    • 설정값 저장에 최적: Wi-Fi 비번, 센서 보정값, 장치 ID 등을 저장하기 좋습니다.
    • 파일 시스템보다 가볍다: 복잡한 파일 입출력 과정 없이 간단하게 읽고 쓸 수 있습니다.
    • 안정성: 전원이 갑자기 차단되어도 데이터가 손상될 확률이 적습니다.

    2. MicroPython에서 NVS 사용하기

    MicroPython은 esp32 모듈 내에 NVS 클래스를 제공합니다.

    🛠️ 기본 코드 스켈레톤

    Python


    3. 실전 활용: 부팅 횟수 카운터 만들기

    ESP32-C3가 켜질 때마다 숫자를 1씩 증가시켜 NVS에 저장하는 간단한 예제입니다.

    Python


    4. ESP32-C3 사용 시 주의사항

    1. 쓰기 횟수 제한: NVS는 플래시 메모리를 사용합니다. 수만 번 이상의 반복적인 쓰기는 메모리 수명을 단축시킬 수 있으므로, 루프 내에서 무분별하게 commit()을 호출하는 것은 피해야 합니다.
    2. 데이터 타입 제한: MicroPython의 NVS 구현은 주로 i32(정수)와 blob(바이너리 데이터)을 지원합니다. 부동소수점(Float)을 저장하려면 바이너리로 변환하거나 100을 곱해 정수로 변환하여 저장하는 트릭이 필요합니다.
    3. 네임스페이스 관리: 여러 라이브러리를 사용할 경우 네임스페이스(NVS("이름"))를 구분하여 데이터 충돌을 방지하세요.

    5. 마치며

    ESP32-C3는 저전력과 효율성이 강조된 칩인 만큼, 굳이 무거운 파일을 만들지 않고도 설정을 유지할 수 있는 NVS 활용은 필수적입니다. Wi-Fi 정보나 마지막 센서 상태값을 저장해두어 스마트한 IoT 기기를 만들어보세요!


    ** NVS 활용방법 **

    1. 스마트 기기 설정값 관리 (Wi-Fi 정보 및 API 키)

    파일 시스템(LittleFS)에 config.json을 만들어 관리할 수도 있지만, NVS를 쓰면 파일 파손 위험이 적고 접근 속도가 빠릅니다.

    • 활용 예시: 사용자가 설정한 Wi-Fi SSID, 비밀번호, 센서 보정(Calibration) 값, 클라우드 서버 API 토큰 저장.
    • 장점: 설정값이 바뀌어도 코드 수정 없이 NVS의 특정 키값만 업데이트하면 됩니다.

    Python

    2. 장치 상태 복원 (Last State Save)

    갑작스러운 정전이나 재부팅 후에도 장치가 **”이전의 상태”**를 기억해야 할 때 유용합니다.

    • 활용 예시:
      • 스마트 전구: 전원이 꺼지기 전 마지막 밝기와 색상 유지.
      • 스마트 팜: 마지막으로 물을 준 시간 기록.
      • 산업용 카운터: 누적 생산량 카운트 유지.
    • 팁: 상태가 바뀔 때마다 쓰기보다는, 특정 주기나 임계값이 변했을 때만 commit() 하여 플래시 메모리 수명을 보호하세요.

    3. Deep Sleep 데이터 전달

    ESP32-C3의 Deep Sleep 모드에 들어가면 RAM의 모든 데이터가 사라집니다. 이때 RTC Memory를 쓸 수도 있지만, 데이터가 복잡하거나 전원이 아예 차단될 가능성이 있다면 NVS가 정답입니다.

    • 활용 예시: 딥슬립에서 깨어날 때마다 센서 데이터를 NVS에 누적 저장한 뒤, 10개가 쌓이면 한꺼번에 서버로 전송.

    Python

    4. OTA(Over-the-Air) 펌웨어 업데이트 상태 기록

    무선으로 펌웨어를 업데이트할 때, 업데이트 진행 단계나 성공 여부 플래그를 NVS에 저장합니다.

    • 활용 예시: 업데이트 도중 재부팅되었을 때 NVS를 읽어 “아직 업데이트 중”임을 인지하고 작업을 재개할 수 있습니다.

    💡 전문가의 꿀팁: 데이터 타입 변환

    MicroPython NVS는 정수와 바이너리(blob)만 지원합니다. 리스트나 딕셔너리를 저장하고 싶다면 ujson을 활용하세요.

    Python

    NVS를 적절히 활용하면 단순한 임베디드 코딩을 넘어, 실제 상용 제품 수준의 안정적인 시스템을 구축할 수 있습니다.


    ** NVS 용량은 어느정도인가? esp32-c3 mini 의 경우 **

    ESP32-C3 Mini와 같은 모듈에서 MicroPython을 사용할 때, NVS의 용량은 ‘파티션 테이블(Partition Table)’ 설정에 따라 결정됩니다. 하지만 일반적인 사용 환경에서의 기준은 다음과 같습니다.

    1. 기본 할당 용량 (Default)

    따로 설정을 건드리지 않고 공식 MicroPython 펌웨어를 올렸다면, 보통 24KB (0x6000 bytes) 정도가 NVS 영역으로 잡혀 있습니다.

    • 실제 사용 가능량: 내부 관리용 헤더와 메타데이터(약 4~8KB)를 제외하면, 실제로 우리가 데이터를 저장할 수 있는 공간은 약 15~18KB 정도입니다.
    • 저장 가능 개수: 아주 작은 정수나 짧은 문자열 기준으로는 약 100~200개 이상의 Key-Value 쌍을 저장할 수 있습니다.

    2. 최대 확장 가능 용량

    만약 24KB보다 더 큰 공간이 필요하다면, 파티션 테이블을 직접 수정하여 NVS 용량을 늘릴 수 있습니다.

    • 이론적 한계: NVS 파티션은 수 MB 단위까지 키울 수 있습니다.
    • 권장 한계: 에스프레시프(Espressif) 가이드에 따르면, NVS는 64KB 이하로 유지하는 것을 권장합니다.
      • 이유 1 (속도): NVS는 데이터를 찾을 때 인덱스를 훑어야 하므로, 용량이 너무 크면 읽기/쓰기 속도가 느려집니다.
      • 이유 2 (RAM): NVS를 초기화할 때 파티션 크기에 비례하여 RAM(Heap)을 사용합니다. (1MB당 약 22KB의 RAM 소모)

    3. 데이터 유형별 크기 제한

    용량만큼 중요한 것이 한 번에 저장할 수 있는 데이터의 크기입니다.

    데이터 타입최대 크기 제한비고
    정수 (Integer)64-bit (8 bytes)set_i32set_i64 등으로 저장
    문자열 (String)4,000 bytes종료 문자 포함
    바이너리 (Blob)약 500 KB파티션 크기의 97.6% 또는 508,000 bytes 중 작은 값

    4. 요약 및 제안

    • 간단한 설정값(Wi-Fi, ID, 보정값): 기본 24KB로도 차고 넘칩니다.
    • 큰 데이터(이미지, 로그 파일, 긴 텍스트): NVS 대신 **LittleFS(파일 시스템)**를 사용하세요. NVS는 “설정값 저장용”이지 “데이터베이스나 파일 저장용”이 아닙니다.
    • ESP32-C3 Mini 주의점: 보통 4MB 플래시를 탑재하고 있는데, NVS를 너무 크게 잡으면 펌웨어가 들어갈 자리나 일반 파일 저장 공간이 부족해질 수 있으니 주의해야 합니다.

    결론: 특별한 설정 없이 사용하신다면 약 15KB 내외의 데이터를 Key-Value 형태로 쪼개서 저장한다고 생각하시면 가장 안전합니다!


    ** 파일로 저장 vs NVS 저장 비교 **

    open("config.txt", "w") 같은 방식으로 파일을 직접 다루는 것이 훨씬 직관적이고, PC에 연결했을 때 내부를 직접 들여다볼 수 있어 디버깅도 편하죠.

    그럼에도 불구하고 왜 임베디드 전문가들이 NVS를 따로 사용하는지, 파일 시스템(LittleFS/FAT)과 비교해 장단점을 명확히 짚어 드릴게요.


    1. NVS vs 파일 시스템(File System) 비교

    비교 항목NVS (Key-Value)파일 시스템 (open/write)
    저장 방식키-값 쌍 (딕셔너리 형태)전체 파일 (바이트 스트림)
    안정성매우 높음 (원자성 보장)상대적으로 낮음 (전원 차단 시 깨짐)
    속도빠름 (특정 값만 즉시 수정)느림 (파일 전체를 읽고 써야 함)
    메모리 수명분산 저장으로 플래시 보호동일 위치 반복 쓰기로 수명 단축 위험
    직관성코드 안에서만 확인 가능파일 탐색기에서 바로 확인 가능

    2. 왜 NVS가 더 유리할까? (장점)

    ① 전원 차단에 대한 내성 (Atomic Write) 파일 시스템의 최대 약점은 **”파일을 쓰는 도중 전원이 꺼지면 파일 자체가 깨질 수 있다”**는 점입니다. 반면 NVS는 내부적으로 트랜잭션 처리가 되어 있어, 쓰기 작업 도중 전원이 나가도 이전 데이터가 유지되거나 최신 데이터가 완전히 저장되는 것을 보장합니다.

    ② 플래시 메모리 수명 연장 (Wear Leveling) 파일 시스템에서 특정 설정 파일 하나를 계속 수정하면, 실제 플래시 메모리의 같은 물리적 위치를 반복해서 긁게 될 확률이 높습니다. NVS는 데이터를 저장할 때 내부적으로 위치를 골고루 분산시켜 저장하므로 칩의 수명을 더 길게 유지해 줍니다.

    ③ 부분 수정의 효율성 설정값이 50개인데 그중 ‘밝기’ 하나만 바꾸고 싶을 때:

    • 파일: 전체 파일을 읽어서 메모리에 올리고 -> 값 수정 -> 전체 다시 쓰기 (무겁고 위험)
    • NVS: nvs.set_i32("bright", 100) 한 줄로 끝. 해당 위치만 갱신 (가볍고 안전)

    3. 왜 파일 시스템이 더 편할까? (단점)

    ① 시각적 확인 불가 질문하신 대로 NVS는 툴을 사용하지 않는 이상 눈에 보이지 않습니다. 파일은 main.py 옆에 config.json이 딱 버티고 있으니 관리하기가 심리적으로 편하죠.

    ② 복잡한 데이터 구조 NVS는 단순한 숫자나 문자열에는 강하지만, 리스트 안에 딕셔너리가 있고 그 안에 또 리스트가 있는 복잡한 계층 구조를 저장하기엔 파일(JSON 형태 등)이 훨씬 유리합니다.


    💡 결론: 언제 무엇을 쓸까?

    • NVS를 쓰세요:
      • Wi-Fi 비번, 센서 보정값, 장치 ID 등 시스템 핵심 설정값
      • 장치가 작동 중에 자주 업데이트되는 상태 정보 (부팅 카운트, 마지막 동작 모드 등)
      • 절대 깨지면 안 되는 최소한의 기본값
    • 파일 시스템(open)을 쓰세요:
      • 센서 데이터 로그(CSV), 웹 서버용 HTML 파일 등 데이터 양이 많을 때
      • PC에서 수시로 파일을 직접 열어서 내용을 확인하거나 수정해야 할 때
      • 복잡한 객체나 대량의 텍스트를 저장할 때

    한 줄 요약: “안전하고 가볍게 유지하고 싶은 시스템 설정은 NVS, 덩치가 크고 눈으로 보고 싶은 데이터는 파일“이 정답입니다!

  • 내 블로그에 AI 조수 심기: Groq & Gemini API 호출

    내 블로그에 AI 조수 심기: Groq & Gemini API 호출

    1. 도입: 왜 직접 AI API를 연동하는가?

    요즘은 웹사이트에서 직접 AI를 쓰는 시대입니다. 하지만 단순히 API 키만 넣고 “Hello”를 주고받는 수준을 넘어, **실제 서비스 수준의 UX(사용자 경험)**를 갖추려면 생각보다 챙길 것이 많습니다.

    오늘은 제 블로그 **’Mana’s Lab’**의 AI 조수를 업그레이드하며 겪은 시행착오와 해결책을 공유합니다.


    2. 핵심 해결책: 429 Resource Exhausted 에러 처리

    무료 티어 API를 쓰다 보면 가장 자주 마주치는 것이 바로 **할당량 초과(429 에러)**입니다.

    • 문제: 에러가 나면 화면에 아무 반응이 없거나 콘솔에만 찍혀 사용자가 답답해함.
    • 해결: PHP에서 받은 에러 객체를 분석해 채팅창에 투명한 빨간색 배경의 전용 메시지를 띄우도록 커스텀 CSS를 적용했습니다.

    이제 “잠시 후 다시 시도해 주세요”라는 안내가 시각적으로 명확하게 전달됩니다.


    3. UX의 한 끗: Tab 키로 모델 광속 전환

    여러 모델(Gemini 1.5, 2.5 등)을 테스트할 때 일일이 마우스로 콤보박스를 클릭하는 건 매우 번거로운 일입니다.

    • 구현 기능: 입력창에서 Tab을 누르면 다음 모델, Shift + Tab을 누르면 이전 모델로 즉시 변경.
    • 디테일: * e.preventDefault()로 포커스 이동 차단.
      • setTimeoutclearTimeout을 조합해 2초간 입력창 placeholder에 현재 바뀐 모델명을 표시.
      • setCookie를 연동해 새로고침 후에도 선택한 모델 유지.

    이렇게 하면 키보드에서 손을 떼지 않고도 다양한 모델의 성능을 즉시 비교해 볼 수 있습니다.


    4. 청각적 디테일: TTS(음성 합성) 최적화

    AI의 답변을 귀로 듣는 것도 중요하죠. 하지만 브라우저 TTS는 첫 로딩 시 목소리 목록을 가져오는 데 시간이 걸려 기본 음성이 나오는 버그가 있습니다.

    • 해결: onvoiceschanged 이벤트를 감시하여 구글 한국어 음성을 우선적으로 매칭하도록 로직을 짰습니다.
    • 이탈 방지: 페이지를 닫거나 새로고침할 때 소리가 계속 나오지 않도록 beforeunload 이벤트에서 synth.cancel()을 실행해 깔끔하게 마무리했습니다.

    5. 마무리하며

    AI 기술은 빠르게 변하지만, 그것을 다루는 개발자의 디테일이 사용자에게는 가장 큰 차이로 다가옵니다.

    이번 포스팅에서 다룬 코드는 블로그 하단에서 확인하실 수 있습니다. 여러분도 여러분만의 스마트한 AI 조수를 만들어 보세요!


    Groq AI 실행창

    Gemini AI 실행창

    PHP Groq API.php

    PHP GeminiAPI.php

  • 마이크로파이썬 속도 2배~15배 올리는 마법의 한 줄?

    마이크로파이썬 속도 2배~15배 올리는 마법의 한 줄?

    10배 빠른 코드의 비밀: @native와 @viper 데코레이터 완전 정복

    마이크로파이썬(MicroPython)은 배우기 쉽고 강력하지만, C언어에 비해 **’느리다’**는 인식이 있습니다. 특히 ESP32-C3처럼 자원이 한정된 MCU에서 복잡한 비트 연산이나 고속 제어 루프를 돌릴 때 프레임 드랍이나 딜레이를 경험하곤 하죠.

    오늘은 코드 한 줄로 실행 속도를 드라마틱하게 올릴 수 있는 마법의 데코레이터, **@micropython.native**와 **@micropython.viper**에 대해 알아보겠습니다.


    1. 왜 파이썬은 느릴까? (Standard Mode)

    기본적으로 마이크로파이썬은 코드를 **’바이트코드(Bytecode)’**로 변환한 뒤, 칩 내부의 인터프리터가 이를 한 줄씩 해석하며 실행합니다. 이 과정에서 CPU는 파이썬 객체를 해석하고 관리하는 데 많은 에너지를 소비하게 됩니다.

    평소에는 문제가 없지만, 센서 데이터를 초당 수천 번 읽거나 복잡한 수학 계산을 할 때는 이 ‘해석 시간’이 큰 걸림돌이 됩니다.


    2. 해결사 등장: Native와 Viper

    마이크로파이썬은 이를 해결하기 위해 **에미터(Emitter)**라는 기능을 제공합니다. 파이썬 코드를 인터프리터 방식이 아닌, CPU가 즉시 실행할 수 있는 **기계어(Machine Code)**로 직접 컴파일하는 방식입니다.

    ① @micropython.native

    • 특징: 일반 파이썬 코드를 기계어로 컴파일합니다.
    • 장점: 기존 파이썬 문법을 100% 그대로 사용할 수 있습니다. 리스트, 딕셔너리, 객체 모두 지원합니다.
    • 성능:2~3배 정도 빨라집니다.

    ② @micropython.viper

    • 특징: ‘Viper’는 독사처럼 빠르고 날카로운 최적화 모드입니다.
    • 장점: 거의 C언어에 근접한 속도를 냅니다. 직접적인 메모리 접근(Pointer)도 가능합니다.
    • 제약: 정수(Integer) 연산 위주로 작성해야 하며, 변수의 타입을 지정(x: int)해줘야 하는 등 제약이 따릅니다.
    • 성능:5~10배 이상 빨라집니다.

    3. 실전 성능 테스트 (Benchmark)

    백문이 불여일견! 실제로 ESP32-C3 Mini에서 복잡한 비트 연산을 수행했을 때 얼마나 차이가 나는지 코드로 확인해 보겠습니다.

    결과

    테스트 결과 분석

    실제로 돌려보면 Standard 모드에서 수만 마이크로초(us)가 걸리던 작업이, Viper를 적용하면 순식간에 끝나는 것을 볼 수 있습니다. 특히 if 조건문과 비트 이동(<<, >>) 연산이 많을수록 차이는 더 극명해집니다.


    4. 언제 어떤 것을 써야 할까?

    사용처추천 모드이유
    일반적인 로직, 웹서버Standard가독성이 중요하고 속도가 급하지 않음
    센서 데이터 전처리Native코드 수정 없이 적당한 가속이 필요함
    모터 제어, DSP, 암호화Viper한계치까지 속도를 뽑아내야 함

    5. 주의사항 (중요!)

    1. 메모리 사용량: 기계어로 변환된 코드는 일반 바이트코드보다 용량을 더 많이 차지합니다. 모든 함수에 다 붙이기보다는 **’가장 많이 반복되는 루프’**에만 선별적으로 사용하세요.
    2. Viper의 제약: Viper 모드에서는 파이썬의 우아한 기능(예: 예외 처리, 동적 타입) 일부를 포기해야 합니다.

    마치며

    마이크로파이썬은 느리다는 편견, 이제 버리셔도 됩니다. @native@viper만 적재적소에 활용한다면 ESP32-C3로도 충분히 고성능 임베디드 시스템을 구축할 수 있습니다.

    여러분의 프로젝트 중 유독 느린 부분이 있다면, 지금 바로 이 데코레이터를 한 줄 추가해 보세요. 결과는 숫자가 증명할 것입니다!


    mpy 파일로 변환해서 돌리면 좋은점

    마이크로파이썬에서 .py 파일을 .mpy 파일로 컴파일해서 사용하는 것은 ‘실행 속도’ 보다는 ‘메모리 효율’과 ‘부팅 속도’ 측면에서 훨씬 드라마틱한 효과가 있습니다.

    .mpy는 파이썬 코드를 마이크로파이썬 인터프리터가 즉시 읽을 수 있는 바이트코드(Bytecode) 형태로 미리 변환해둔 파일입니다.


    1. .mpy 변환 시 얻는 이득 (3가지)

    ① 부팅 및 모듈 임포트(Import) 속도 (폭발적 향상)

    • 기존 (.py): 파일을 읽음 → 구문 분석(Parsing) → 바이트코드 컴파일 → 실행.
    • 변환 (.mpy): 이미 컴파일된 바이트코드를 그대로 로드 → 실행.
    • 결과: 소스 코드가 길수록 import 하는 시간이 수배 이상 빨라집니다.

    ② RAM 사용량 절감 (가장 큰 이유)

    • .py 파일은 컴파일 과정에서 일시적으로 많은 RAM을 소모합니다. 코드 양이 많으면 여기서 MemoryError가 발생하곤 하죠.
    • .mpy는 컴파일 단계가 생략되므로, ESP32-C3 Mini처럼 RAM이 귀한 환경에서 더 큰 프로그램을 돌릴 수 있게 해줍니다.

    ③ 코드 보안 (최소한의 방어)

    • 텍스트 형태의 소스 코드가 아닌 이진 파일(Binary) 형태이므로, 칩 내부의 코드를 누군가 열어보더라도 로직을 즉시 파악하기 어렵게 만듭니다.

    2. “얼마나 빨라지나?” (순수 실행 속도)

    솔직히 말씀드리면, 루프 안에서의 순수 연산 속도 자체는 큰 차이가 없습니다.

    • .py도 처음 실행될 때 메모리상에서 바이트코드로 변환되어 실행되기 때문입니다.
    • 즉, while 루프가 100번 돌 때의 속도는 .py.mpy나 동일합니다.

    진짜 속도 차이를 원하신다면 앞서 언급한 @native@viper.mpy와 병행해야 합니다.


    3. .mpy 만드는 방법 (mpy-cross)

    PC에서 mpy-cross라는 도구를 사용하여 컴파일합니다.

    1. 도구 설치: (보통 마이크로파이썬 소스 코드 빌드 시 포함되어 있습니다.)
    2. 컴파일 명령:Bash./mpy-cross my_script.py
    3. 결과물: my_script.mpy 파일이 생성됩니다. 이 파일을 ESP32-C3에 업로드하면 됩니다.

    .mpy는 자동차의 엔진 출력(속도)을 높이는 게 아니라, 차체의 무게를 줄여(메모리 절약) 출발 가속(로딩 속도)을 빠르게 만드는 튜닝입니다.”

    🛠️ 추천하는 최강 조합

    “ESP32-C3 성능 극한까지 뽑아내기”

    1. machine.freq(160000000): 엔진 회전수 최대화.
    2. @micropython.viper: 핵심 로직 기계어 가속.
    3. .mpy 컴파일: 메모리 최적화 및 고속 로딩.
  • esp32-c3 mini 를 ai 와 연동해서 할 수 있는 것

    esp32-c3 mini 를 ai 와 연동해서 할 수 있는 것

    ESP32-C3 Mini는 크기가 작고 저전력임에도 불구하고 Wi-Fi와 Bluetooth 5(LE)를 지원하며, RISC-V 아키텍처를 기반으로 하고 있어 AI 기술과 결합했을 때 상당히 재미있는 프로젝트들을 구현할 수 있습니다.

    특히 하드웨어 리소스의 한계가 있으므로, 온디바이스(On-device) AI클라우드 연동 AI 두 가지 방향으로 접근하는 것이 효율적입니다.


    1. 온디바이스 AI (TinyML)

    기기 자체에서 가벼운 머신러닝 모델을 돌리는 방식입니다. 텐서플로우 라이트(TensorFlow Lite for Microcontrollers) 등을 활용합니다.

    • 진동 및 가속도 분석: 가속도 센서와 연결하여 기계의 비정상적인 진동을 감지하고 고장을 예방하는 ‘예지 보전’ 시스템을 만들 수 있습니다.
    • 간단한 제스처 인식: 가속도/자이로 센서 데이터를 학습시켜 특정 동작(흔들기, 회전 등)을 인식하고 명령을 실행합니다.
    • 키워드 스포팅 (음성 인식): “불 켜”, “안녕” 같은 아주 짧은 단어를 인식하여 반응하는 기능을 구현할 수 있습니다. (다만, C3의 메모리 한계로 인해 매우 제한적인 모델만 가능합니다.)

    2. 생성형 AI API 연동 (LLM 활용)

    ESP32-C3를 클라이언트(통로)로 사용하고, 실제 지능은 ChatGPT나 Gemini 같은 강력한 AI를 사용하는 방식입니다.

    • AI 비서 스피커: 마이크와 스피커 모듈을 연결하여 사용자의 질문을 서버로 보내고, AI의 답변을 받아 음성(TTS)으로 출력하는 소형 비서를 만들 수 있습니다.
    • 스마트 홈 자동화 비서: 사용자가 “방이 좀 어두운 것 같아”라고 자연어로 말하면, AI가 이 의도를 파악하여 MQTT나 IR 신호를 통해 전등을 켜도록 설계할 수 있습니다.
    • 이미지 묘사 장치: 카메라 모듈(ESP32-CAM 등)과 연동하여 사진을 찍고 GPT-4o 같은 모델에 전송하면, 현재 상황을 텍스트나 음성으로 설명해 주는 시각 보조 도구를 만들 수 있습니다.

    3. 센서 데이터 분석 및 자동화

    센서 데이터를 수집하여 클라우드 AI 서비스(AWS IoT, Google Cloud AI 등)로 보내는 방식입니다.

    • 스마트 농업/배양기 최적화: 온습도 데이터를 실시간으로 분석하여 식물이나 생물(예: 실키 치킨)의 최적 성장 환경을 AI가 판단하고 장치를 제어하게 합니다.
    • 에너지 관리: 가전제품의 전력 사용 패턴을 학습하여 불필요한 대기 전력을 자동으로 차단하는 지능형 콘센트를 구현할 수 있습니다.

    추천 프로젝트 구성 예시

    구분구성 요소설명
    난이도: 하ESP32-C3 + 센서 + OpenWeather API기상 데이터를 AI가 분석하여 오늘 입을 옷이나 주의사항을 OLED에 출력
    난이도: 중ESP32-C3 + MQTT + ChatGPT API자연어 명령을 해석하여 가전기기(에어컨, 조명) 제어
    난이도: 상ESP32-C3 + TensorFlow Lite센서 데이터를 이용한 실시간 상태 분류 및 이상 감지 (엣지 컴퓨팅)

    팁: ESP32-C3 Mini는 메모리(SRAM)가 약 400KB 정도로 타이트한 편입니다. 복잡한 AI 모델을 직접 올리기보다는, 가벼운 라이브러리를 사용하거나 API를 호출하는 게이트웨이 역할로 활용할 때 가장 효율이 좋습니다.

  • 온습도 모니터링 그래프 리뉴얼

    온습도 모니터링 그래프 리뉴얼

    그래프 확대 축소 툴팁 상세 기능 추가

  • MQTT와 AES-256으로 만드는 나만의 보안 웹 채팅 프로그램: Talk

    MQTT와 AES-256으로 만드는 나만의 보안 웹 채팅 프로그램: Talk

    **보안형 MQTT 채팅 프로그램(Talk)**의 주요 기능과 구현 시 고려했던 핵심 보안 사항들입니다.

    스크린샷, 클릭시 새 탭에서 실행

    아래에서 직접 실행해 보기


    🛠️ 주요 기능 요약

    구분기능 명칭상세 내용
    접속 제어Web-based Loginprompt 대신 웹 UI를 통해 암호 키를 입력받아 보안성과 사용자 편의성 동시 확보
    통신 보안End-to-End EncryptionCryptoJS를 이용해 메시지를 AES-256 방식으로 암호화하여 전송
    경로 은닉Dynamic Topic Hashing암호 키를 SHA-256으로 해싱하여 고유한 토픽(data_...) 생성
    익명성Auto Nickname형용사와 명사 조합에 랜덤 ID를 붙여 사용자 익명성 보장 (예: 다정한 피자)
    안정성Auto Reconnect연결이 끊겼을 때 3초 후 자동으로 재연결을 시도하는 로직 포함
    리소스Local Library외부 CDN 의존도를 낮추기 위해 JS 파일을 서버 로컬 경로로 설정

    🔐 구현 시 고려했던 핵심 보안 사항

    1. 데이터 평문 노출 차단 (AES-256 암호화)

    공용 MQTT 브로커(EMQX)를 사용하면 누군가 토픽을 구독하여 대화 내용을 가로챌 수 있다는 점이 가장 큰 위협이었습니다.

    • 해결: 메시지가 브라우저를 떠나기 전 암호화하고, 받는 쪽에서만 복호화하게 하여 브로커 관리자조차 내용을 알 수 없게 설계했습니다.
    • 데이터 타입 변경: 메시지 유형을 chat이 아닌 일반적인 string으로 정의하여 MQTT Explorer 상에서도 일반 데이터 스트림처럼 보이게 위장했습니다.

    2. 대화방 경로의 기밀성 (SHA-256 토픽 생성)

    고정된 토픽 주소를 사용하면 누군가 지속적으로 모니터링할 위험이 있었습니다.

    • 해결: 사용자가 입력한 비밀번호를 그대로 토픽으로 쓰지 않고, **해시값(Hash)**으로 변환하여 사용했습니다.
    • 효과: 비밀번호를 모르는 사람은 우리가 어느 방(Topic)에서 대화하는지 경로조차 유추할 수 없습니다.

    3. 클라이언트 사이드 보안 (Memory-only Key)

    비밀번호를 소스 코드에 저장하거나 하드코딩하면 보안이 무의미해집니다.

    • 해결: SECRET_KEY를 브라우저의 변수(메모리)에만 저장하고 페이지를 새로고침하거나 닫으면 즉시 삭제되도록 구현했습니다.
    • 로컬 라이브러리: 스크립트 파일을 본인 서버(micro2iot.com)에서 불러오게 하여, 외부 서버 해킹을 통한 스크립트 변조(XSS 공격) 가능성을 차단했습니다.

    4. 사후 흔적 제거 (Will Message & No History)

    • 유언 메시지(Last Will): 사용자가 비정상적으로 종료되었을 때 브로커가 자동으로 퇴장 메시지를 보내도록 설정하여 세션 관리를 깔끔하게 했습니다.
    • 기록 비저장: 별도의 데이터베이스를 두지 않아, 브라우저를 닫는 순간 모든 대화 기록이 휘발되어 물리적인 증거가 남지 않습니다.

    HTML chat.html