5주차 보고서 - l3ye/DoHeon-embedded-system GitHub Wiki

Node RED 란?

정의

  • Node-RED는 시각적으로 IoT(사물인터넷)와 데이터 흐름을 설계할 수 있는 프로그래밍 도구.
  • 블록을 연결하듯 프로그램을 만드는 환경
  • JavaScript(Node.js) 기반,브라우저에서 GUI로 흐름(flow) 설계,IoT, API, 데이터 처리, 자동화 등에 활용 가능

특징

  • 시각적 프로그래밍: 코드를 직접 치지 않고 노드(node)와 선(flow) 연결만으로 프로그램 설계 가능
  • IoT 친화적: 센서, 액추에이터, MQTT, HTTP, WebSocket 등과 쉽게 연결 가능
  • 확장성: 수많은 커뮤니티 노드 활용 가능 (예: 카메라, 날씨 API, 데이터베이스 연결)
  • 실시간 실행 및 디버깅: 흐름을 바로 실행하고, 데이터가 어떻게 흐르는지 확인 가능

구조

  • 노드(Node): 기능 단위 (센서 읽기, 데이터 처리, 전송 등)
  • 플로우(Flow): 노드 연결로 만든 작업 과정
  • 디버그 패널: 데이터 흐름 확인

활용 예시

  • 집안 IoT 자동화: 온도·조도에 따라 조명 자동 켜기/끄기
  • 센서 데이터 모니터링: MQTT로 수집한 센서값 시각화
  • API 연동: 날씨 데이터를 가져와 장치를 제어

Node - RED 설치

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) 라즈베리파이 터미널에 입력

설치 이후 설정법

  • 설치 이후 실행
  • dashboard 설치

설치 완료

Node-Red 실습

과제1 웹 API를 활용한 실시간 날씨 정보 표시기 (OpenWeatherMap API키 이용)

  • 도시 입력
  • API URL 생성
  • OpenWeatherMap API 호출
  • 데이터 가공
  • 실시간 날씨
  • 결과

과제2 사용자 지정 타이머 및 카운트다운 알림 시스템

  • 최종 완성본
  • 타이머 시간 설정
  • 시간 값 저장
  • 타이머 시작
  • 지연 시간 설정
  • 카운트다운
  • 알림 메시지 생성
  • 타이머 종료 알림
  • 결과

과제3 텍스트 문장 자동 대문자 변환 및 문자열 필터링

  • 완성본
  • 원본 문장 입력
  • 대문자 변환
  • 경고/성공 메시지 생성
  • 변환 결과 출력
  • 결과

과제4 DHT11 실습

dht 연결 1번 VCC → 라즈베리파이 3.3V 2번 DATA → GPIO4 4번 GND → 라즈베리파이 GND

213312213231231

지피티를 이용한 코드

[ 
    {
        "id": "inject_timer",
        "type": "inject",
        "z": "dht_flow",
        "name": "2초마다 트리거",
        "props": [],
        "repeat": "2",
        "crontab": "",
        "once": true,
        "onceDelay": "1",
        "x": 150,
        "y": 100,
        "wires": ["dht_read"](/l3ye/DoHeon-embedded-system/wiki/"dht_read")
    },
    {
        "id": "dht_read",
        "type": "rpi-dht22",
        "z": "dht_flow",
        "name": "DHT11 읽기",
        "topic": "",
        "dht": "11",
        "pin": "4",
        "x": 380,
        "y": 100,
        "wires": ["function_parse", "debug_node"](/l3ye/DoHeon-embedded-system/wiki/"function_parse",-"debug_node")
    },
    {
        "id": "function_parse",
        "type": "function",
        "z": "dht_flow",
        "name": "데이터 분리",
        "func": "// msg.payload = {temperature: xx, humidity: yy}\nvar temp = msg.payload.temperature;\nvar hum = msg.payload.humidity;\nreturn [{payload: temp}, {payload: hum}];",
        "outputs": 2,
        "x": 600,
        "y": 100,
        "wires": ["ui_gauge_temp"], ["ui_gauge_hum"](/l3ye/DoHeon-embedded-system/wiki/"ui_gauge_temp"],-["ui_gauge_hum")
    },
    {
        "id": "ui_gauge_temp",
        "type": "ui_gauge",
        "z": "dht_flow",
        "name": "온도 게이지",
        "group": "dashboard_group",
        "order": 1,
        "width": 6,
        "height": 2,
        "gtype": "gage",
        "title": "온도(℃)",
        "label": "℃",
        "format": "{{value}}",
        "min": 0,
        "max": 50,
        "x": 820,
        "y": 80,
        "wires": []
    },
    {
        "id": "ui_gauge_hum",
        "type": "ui_gauge",
        "z": "dht_flow",
        "name": "습도 게이지",
        "group": "dashboard_group",
        "order": 2,
        "width": 6,
        "height": 2,
        "gtype": "gage",
        "title": "습도(%)",
        "label": "%",
        "format": "{{value}}",
        "min": 0,
        "max": 100,
        "x": 820,
        "y": 140,
        "wires": []
    },
    {
        "id": "debug_node",
        "type": "debug",
        "z": "dht_flow",
        "name": "DHT 디버그",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "x": 600,
        "y": 180,
        "wires": []
    },
    {
        "id": "dashboard_group",
        "type": "ui_group",
        "z": "",
        "name": "센서 데이터 그룹",
        "tab": "dashboard_tab",
        "order": 1,
        "disp": true,
        "width": "6",
        "collapse": false
    },
    {
        "id": "dashboard_tab",
        "type": "ui_tab",
        "z": "",
        "name": "DHT11 대시보드",
        "icon": "dashboard",
        "order": 1,
        "disabled": false,
        "hidden": false
    }
] 

이유모를 오류인지 무한 로딩돼서 안됐다.........................나중에 다시 해봐야겠음.