Node-RED와 함께 Raspberry Pi Pico W를 사용하는 방법
6달러짜리 Raspberry Pi Pico W의 힘을 활용하여 라이브 데이터 피드를 만드세요
이전 방법에서 6달러짜리 Raspberry Pi Pico W로 MQTT(Message Query Telemetry Transport)를 소개했습니다. 그 튜토리얼에서는 비교적 간단하게 유지했습니다. 작은 MicroPython과 MQTT 브로커를 사용하여 메시지를 게시하고 구독합니다. 그런 다음 온라인 MQTT 서비스를 사용하여 Pico W와 상호 작용합니다. 이를 통해 모든 것이 작동한다는 것이 증명되었지만, 이 방법에서는 한 단계 더 나아가 매우 적은 코드로 웹 애플리케이션을 빌드합니다.
이 방법에서는 이벤트 기반 프로그래밍 언어인 Node-RED를 사용합니다. Node-RED는 노드(블록)를 사용하여 Raspberry Pi Pico W에서 라이브 MQTT 데이터 피드를 구독하고 해당 데이터를 사용하여 웹 애플리케이션에서 실시간 차트와 게이지를 만드는 흐름(알고리즘)을 만드는 이벤트 기반 프로그래밍 언어입니다.
Pimoroni의 새로운 Enviro Indoor 키트를 사용할 것입니다. 이 키트는 Raspberry Pi Pico W로 구동되는 기성 키트입니다. 이 키트는 핵심에 BME688 온도 및 습도 센서를 탑재하고 있습니다. 이 중 하나가 없다면 Raspberry Pi Pico W와 BME688 브레이크아웃 보드를 사용하여 프로젝트를 빌드합니다.
이 프로젝트에는 다음이 필요합니다.
- Raspberry Pi Pico W 또는 Pimoroni Enviro Indoor
- 최신 버전의 Raspberry Pi OS를 실행하는 Raspberry Pi
- Raspberry Pi용 키보드, 마우스, 디스플레이
- Wi-Fi 연결
- BME688 센서
- Qw/ST/Stemma QT 대 수컷 점퍼 와이어
- 브레드보드
BME688 센서를 Raspberry Pi Pico W에 연결
BME688 센서는 I2C를 사용하여 Raspberry Pi Pico W와 통신합니다. 이 보드는 Qw/ST(Stemma QT/Qwiic) 커넥터가 있는 Breakout Garden 스타일 보드입니다.
BME688을 다음과 같이 Pico W에 연결합니다.
Raspberry Pi Pico W GPIO 색상
3v3(OUT) 빨간색
GND 검은색
SDA(GP4) 파란색
SCL(GP5) 노란색
Raspberry Pi Pico W 설정
이 프로젝트에서는 Raspberry Pi Pico W 또는 Pimoroni의 새로운 Enviro Indoor 키트를 사용할 수 있습니다. 코드의 이식성을 보여주기 위해 둘 다 사용합니다.
1. Raspberry Pi Pico W용 최신 Pimoroni MicroPython 펌웨어를 다운로드합니다. 이 펌웨어에는 BME688 센서용 MicroPython 모듈이 함께 제공됩니다.
2. 이 지침의 2단계와 3단계를 따라 Pimoroni 펌웨어를 Raspberry Pi Pico W에 플래시합니다. 이후 지침에서는 컴퓨터에 Thonny를 설치하는 방법을 보여줍니다. Thonny를 설치하지 않은 경우 해당 지침도 따르세요.
3. Thonny를 열고 Python 셸에서 Raspberry Pi Pico W를 Wi-Fi에 연결하기 위해 MicroPython의 네 줄을 작성합니다. Wi-Fi AP와 PASSWORD를 Wi-Fi 액세스 포인트와 일치하도록 변경합니다. 각 줄의 끝에서 Enter를 누르는 것을 잊지 마세요.
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("Wi-Fi AP","PASSWORD")
4. upip 모듈을 가져옵니다. upip 모듈은 MicroPython용 Python 패키지 관리자 pip의 한 버전입니다.
import upip
5. upip를 사용하여 umqtt.simple을 설치합니다. 이 모듈은 MicroPython용 간소화된 MQTT 클라이언트입니다.
upip.install(‘umqtt.simple’)
MQTT에 센서 데이터 게시
1. Thonny에서 새 파일을 만듭니다.
2. Wi-Fi 연결을 위한 Python 코드의 다섯 모듈을 가져와 코드의 속도를 제어하고 BME688 센서, I2C 및 MQTT에 액세스합니다.
import network
import time
from breakout_bme68x import BreakoutBME68X, STATUS_HEATER_STABLE
from pimoroni_i2c import PimoroniI2C
from umqtt.simple import MQTTClient
3. Wi-Fi 액세스 포인트에 연결하는 데 사용되는 객체 wlan을 만듭니다.
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("Wi-Fi AP","PASSWORD")
4. I2C에 사용되는 GPIO 핀을 저장할 사전을 만듭니다.
PINS_BREAKOUT_GARDEN = {"sda": 4, "scl": 5}
5. i2c 객체를 만들고 Pimoroni의 I2C 클래스를 사용하여 I2C 연결을 설정합니다.
i2c = PimoroniI2C(**PINS_BREAKOUT_GARDEN)
6. bmp 객체를 만들어 코드와 BME688 센서를 연결합니다. i2c 객체를 사용하고 Enviro Indoor의 센서에 대한 주소 0x77을 지정합니다. 독립형 BME688을 사용하는 경우 0x77 주소를 생략합니다.
bmp = BreakoutBME68X(i2c, 0x77)
7. MQTT 브로커의 URL, client_id, 두 개의 토픽을 저장할 네 개의 변수를 만듭니다. 퍼블릭 브로커를 사용하고 있다는 점을 기억하세요. client_id는 사용되지 않지만 어쨌든 제공해야 합니다. topic은 구독자가 수신할 주제입니다. 우리의 경우 두 개가 있는데, 하나는 온도용이고 다른 하나는 습도용입니다.
mqtt_server = 'broker.hivemq.com'
client_id = 'bigles'
topic_pub_temp = b'TomsHardware/Temp'
topic_pub_humid = b'TomsHardware/Humidity'
8. MQTT 연결을 처리하는 함수를 만듭니다. 함수를 사용하면 함수의 내용을 반복할 필요 없이 나중에 코드에서 함수를 쉽게 호출할 수 있습니다.
def mqtt_connect():
9. 객체인 client를 만들고 이를 사용하여 client_id와 MQTT 브로커 세부 정보를 저장하고, 1시간 동안 연결을 활성 상태로 유지하는 옵션도 제공합니다. 함수 내부의 코드는 4개의 공백(또는 1개의 탭)으로 들여쓰기하여 함수의 일부임을 나타냅니다.
client = MQTTClient(client_id, mqtt_server, keepalive=3600)
10. client 객체를 사용하여 MQTT 브로커에 연결합니다.
client.connect()
11. 연결에 성공하면 Python 셸에 메시지를 인쇄한 다음, client 객체의 내용을 셸에 반환합니다. 이것은 디버깅에 유용합니다.
print('Connected to %s MQTT Broker'%(mqtt_server))
return client
12. Pico W를 재설정하기 전에 5초 동안 일시 중지하는 reconnect라는 새 함수를 만듭니다. 이렇게 하면 Pico W가 다시 연결을 시도합니다.
def reconnect():
print('Failed to connect to the MQTT Broker. Reconnecting...')
time.sleep(5)
machine.reset()
13. mqtt_connect() 함수를 사용하여 MQTT 브로커에 연결을 시도하는 예외 처리기를 만듭니다.
try:
client = mqtt_connect()
14. 코드가 연결에 실패하면 오류가 발생하여 Pico W가 reconnect() 함수를 사용하여 재설정되도록 예외를 추가합니다.
except OSError as e:
reconnect()
15. 센서 데이터를 지속적으로 전송하는 루프를 만듭니다.
while True:
16. BME688에서 센서 데이터를 읽고 해당 객체에 저장합니다.
temperature, pressure, humid, gas, status, _, _ = bmp.read()
17. 히터라는 객체를 만들고 이를 사용하여 히터의 상태를 저장합니다. BME688에는 자체 히터 요소가 있어 가열하는 데 약 5분이 걸리고 일관된 데이터를 제공합니다. 히터가 아직 가열되지 않았다면 불안정하다고 간주합니다.
heater = "Stable" if status & STATUS_HEATER_STABLE else "Unstable"
18. 현재 온도, 기압, 습도, 휘발성 유기 화합물(VOC) 및 히터 상태를 Python 셸에 출력합니다. 이는 반드시 필요한 것은 아니지만 코드를 디버깅하고 센서가 데이터를 생성하고 있음을 보여주는 수단을 제공합니다.
print("{:0.2f}c, {:0.2f}Pa, {:0.2f}%, {:0.2f} Ohms, Heater: {}".format(
temperature, pressure, humidity, gas, heater))
19. 두 개의 새 객체인 온도와 습도를 만듭니다. 각 객체에 소수점 첫째 자리까지 반올림한 온도와 습도를 저장합니다. 이렇게 하면 Node-RED 웹 애플리케이션에서 데이터를 더 쉽게 읽을 수 있습니다.
temperature = round(temperature,1)
humidity = round(humidity,1)
20. 온도 및 습도 데이터를 해당 MQTT 토픽에 게시합니다. 데이터를 문자열로 변환합니다. 그렇지 않으면 오류가 발생합니다.
21. 루프가 반복되기 전에 5초 동안 코드를 일시 중지합니다. 이는 더 길거나 더 짧은 시간으로 변경할 수 있습니다.
time.sleep(5.0)
22. 코드를 main.py로 저장합니다. 이렇게 하면 Pico W가 켜질 때마다 코드가 자동으로 실행됩니다.
23. 실행(도구 모음의 녹색 화살표)을 클릭하여 테스트를 위해 코드를 실행합니다.
전체 MQTT 게시 코드
import network
import time
from breakout_bme68x import BreakoutBME68X, STATUS_HEATER_STABLE
from pimoroni_i2c import PimoroniI2C
from umqtt.simple import MQTTClient
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("Wi-Fi AP","PASSWORD")
PINS_BREAKOUT_GARDEN = {"sda": 4, "scl": 5}
i2c = PimoroniI2C(**PINS_BREAKOUT_GARDEN)
bmp = BreakoutBME68X(i2c, 0x77)
mqtt_server = 'broker.hivemq.com'
client_id = 'bigles'
topic_pub_temp = b'TomsHardware/Temp'
topic_pub_humid = b'TomsHardware/Humidity'
def mqtt_connect():
client = MQTTClient(client_id, mqtt_server, keepalive=3600)
client.connect()
print('Connected to %s MQTT Broker'%(mqtt_server))
return client
def reconnect():
print('Failed to connect to the MQTT Broker. Reconnecting...')
time.sleep(5)
machine.reset()
try:
client = mqtt_connect()
except OSError as e:
reconnect()
while True:
temperature, pressure, humidity, gas, status, _, _ = bmp.read()
heater = "Stable" if status & STATUS_HEATER_STABLE else "Unstable"
print("{:0.2f}c, {:0.2f}Pa, {:0.2f}%, {:0.2f} Ohms, Heater: {}".format(
temperature, pressure, humidity, gas, heater))
temperature = round(temperature,1)
humidity = round(humidity,1)
client.publish(topic_pub_temp, str(temperature))
client.publish(topic_pub_humid, str(humidity))
time.sleep(5.0)
Node-RED로 센서 데이터 구독
이때 Pico W는 BME688 온도 및 습도 데이터를 공허로 발사합니다. 아무도 이를 읽기 위해 구독하지 않습니다. HiveMQ의 온라인 클라이언트를 사용하여 읽는 대신 Node-RED를 사용하여 웹 인터페이스를 만들 것입니다.
이 프로젝트의 이 부분에서는 Raspberry Pi 4에 초점을 맞춥니다. Pi 4를 Node-RED를 실행하는 서버로 사용합니다. Node-RED는 Windows, Apple 또는 Linux 컴퓨터에 설치할 수 있지만, 우리는 Node-RED를 배우는 데 위험 부담이 없는 수단을 제공하는 Pi를 선택했습니다.
1. Raspberry Pi를 데스크톱으로 켭니다.
2. 터미널을 열고 한 줄 Bash 스크립트 설치 프로그램을 사용하여 Node-RED를 설치합니다.
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
3. 설치 지침을 따르고 Pi 특정 노드를 설치하라는 메시지가 표시되면 예를 선택합니다. 이 프로젝트에서는 사용하지 않지만 학습을 더 진행하고 싶을 경우 사용할 수 있습니다.
4. 터미널에서 Pi가 부팅될 때마다 Node-RED가 시작되도록 설정합니다. 이 서비스는 Pi가 부팅될 때 시작되어 Node-RED에 빠르게 액세스할 수 있는 수단을 제공합니다.
sudo systemctl enable nodered.service
5. Raspberry Pi 또는 같은 네트워크의 다른 컴퓨터에서 브라우저 창을 열고 이 URL을 통해 Node-RED를 엽니다. Pi의 IP 주소 또는 호스트 이름 뒤에 포트 1880을 사용하여 Node-RED 웹 인터페이스에 액세스할 수 있습니다.
raspberrypi.local:1880
Node-RED 사용자 인터페이스는 세 영역으로 나뉩니다.
첫 번째 작업은 Node-RED를 Pico W와 같은 MQTT 브로커에 연결하는 것입니다. 아래부터 첨부한 링크를 따라 실습하세요.
1. 노드에서 네트워크로 스크롤하여 MQTT In 노드를 흐름으로 끌어옵니다.
2. 편집할 노드를 두 번 왼쪽 클릭합니다. 정보/디버그 패널에 팝업 대화 상자가 나타납니다.
3. 서버에서 새 mqtt-broker 추가를 선택하고 편집 버튼(연필 아이콘)을 클릭합니다.
4. 서버를 broker.hivemq.com으로 설정하고 추가를 클릭합니다. MQTT의 기본 포트는 1883입니다.
5. 토픽을 TomsHardware/Temp로 설정하고 추가를 클릭합니다. Node-RED가 HiveMQ의 브로커에서 해당 토픽을 구독하도록 지시하기 위해 해야 할 일은 이것뿐입니다.
6. Nodes, Common에서 debug를 플로우로 끌어옵니다.
7. 왼쪽 클릭하고 길게 눌러 MQTT 노드의 출력을 디버그 노드의 입력에 연결합니다.
8. Deploy(오른쪽 상단)를 클릭하여 플로우를 실행합니다. debug 탭(곤충/벌레 아이콘)을 클릭하여 MQTT의 출력을 확인합니다.
9. 다른 MQTT In 노드를 플로우로 끌어와 디버그 노드에 연결합니다.
10. 노드를 두 번 클릭하고 Topic을 TomsHardware/Humidity로 설정한 다음 Done을 클릭합니다. 서버가 미리 채워집니다.
11. 배포를 클릭하여 새 흐름을 실행합니다. 이제 디버그 콘솔에서 온도 및 습도 데이터를 볼 수 있습니다.
Pico W가 MQTT를 통해 데이터를 게시하고 Node-RED 흐름이 원시 데이터를 구독하여 디버그 콘솔에 인쇄할 수 있음을 증명했습니다. 이제 자체 웹 애플리케이션을 빌드합니다. 이를 위해 대시보드를 만들고 두 개의 게이지와 두 개의 차트로 채웁니다. 모두 원시 MQTT 데이터를 사용합니다.
1. 오른쪽 상단 모서리에 있는 햄버거 메뉴를 클릭하고 팔레트 관리를 선택합니다.
2. 설치 탭을 클릭하고 "대시보드"를 검색합니다. "node-red-dashboard"를 찾고 설치를 클릭합니다.
3. 설치를 클릭하여 설치를 시작합니다. 노드 열에 새로운 노드 선택이 나타납니다.
4. 노드를 "대시보드"로 스크롤하여 게이지 노드를 흐름으로 끌어옵니다. 게이지를 MQTT 온도 노드에 연결합니다.
5. 게이지 노드를 왼쪽 두 번 클릭하여 편집하고, 새 대화 상자에서 새 대시보드 그룹 추가를 선택하고 편집(연필) 아이콘을 클릭합니다.
6. 그룹 이름을 온도로 설정한 다음 "새 대시보드 탭 추가"와 편집(연필) 아이콘을 클릭합니다. 그룹은 위젯을 수집하는 데 사용되며 레이아웃을 조정할 수 있도록 하는 데 사용됩니다.
7. 대시보드 탭 이름을 Enviro_Indoor로 설정한 다음 추가/업데이트를 클릭합니다. 대시보드 탭은 기본적으로 브라우저 탭과 같은 방식으로 탭입니다. 하지만 이러한 탭은 Node-RED 창 내부에 있습니다. 우리는 탭 이름을 Enviro_Indoor로 지정했습니다. 이는 우리가 사용하는 보드이기 때문입니다. 이는 사용자 프로젝트에 맞게 변경할 수 있습니다.
8. 추가를 클릭하여 속성 대화 상자로 돌아갑니다.
9. 속성을 크기: 자동, 레이블: 온도, 단위: 섭씨, 범위: -10~50, 이름: 온도 센서로 설정합니다. 그런 다음 완료를 클릭합니다. 온도는 기본적으로 섭씨로 표시됩니다. 사용자 위치에 맞게 범위를 변경합니다.
10. 배포를 클릭하여 흐름을 실행합니다. MQTT는 여전히 디버그 콘솔에 표시됩니다.
11. 새 브라우저 탭을 열고 raspberrypi.local:1880/ui로 이동하여 웹 인터페이스를 확인합니다.
습도 데이터 추가
이제 일정 기간 동안의 온도를 보여주는 온도 차트를 추가합니다. 이는 현재 온도를 보여주는 게이지와 달리 시간에 따른 온도 차이를 보는 데 유용합니다.
1. 대시보드 노드에서 차트 노드를 흐름으로 끌어서 MQTT 온도 노드에 연결합니다.
2. 차트 노드를 왼쪽 두 번 클릭하여 편집합니다.
3. 다음과 같이 차트 노드를 설정합니다. 그룹: Enviro_Indoor Temperature, 크기: 자동, 레이블: Temperature Chart, 포인트 확대, X축: 1시간, X축 레이블: HH:mm, y축: -10~50, 빈 레이블: BME688 Temperature Data. 그런 다음 완료를 클릭합니다.
4. Deploy를 클릭하여 흐름을 실행합니다.
5. 웹 인터페이스 탭을 열어 차트를 확인합니다. 5초마다 업데이트됩니다.
이제 대시보드에 온도 데이터가 추가되었으므로 이제 습도 데이터로 초점을 전환합니다. 동일한 프로세스를 반복하지만, 현재 및 과거 습도 데이터를 표시하는 게이지와 차트를 포함하는 새로운 그룹인 Humidity를 사용합니다.
1. 노드를 "대시보드"로 스크롤하여 게이지 노드를 흐름으로 끌어옵니다. 게이지를 MQTT Humidity 노드에 연결합니다.
2. 게이지 노드를 두 번 왼쪽 클릭하여 편집하고, 새 대화 상자에서 새 대시보드 그룹 추가를 선택하고 편집(연필) 아이콘을 클릭합니다.
3. 그룹 이름을 습도로 설정한 다음 탭이 Enviro_indoor로 설정되어 있는지 확인합니다. 추가/업데이트를 클릭하여 저장합니다.
4. 속성을 크기: 자동, 레이블: 습도, 단위: %, 범위: 0~100, 이름: 습도 센서로 설정합니다. 그런 다음 완료를 클릭합니다.
5. 배포를 클릭하여 흐름을 실행합니다.
6. 웹 인터페이스 탭을 열어 차트를 확인합니다. 5초마다 업데이트됩니다.
이제 일정 기간 동안의 습도를 보여주는 습도 차트를 추가합니다. 이는 현재 습도를 보여주는 게이지와 달리 시간 경과에 따른 습도 변화를 보는 데 유용합니다.
7. 대시보드 노드에서 차트 노드를 흐름으로 끌어서 MQTT 습도 노드에 연결합니다.
8. 차트 노드를 두 번 왼쪽 클릭하여 편집합니다.
9. 차트 노드를 다음과 같이 설정합니다. 그룹: Enviro_Indoor Temperature, 크기: 자동, 레이블: Temperature Chart, 포인트 확대, X축: 1시간, X축 레이블: HH:mm, y축: -10~50, 빈 레이블: BME688 Temperature Data, 이름: Humidity Chart. 그런 다음 Done을 클릭합니다.
10. Deploy를 클릭하여 흐름을 실행합니다.
11. 웹 인터페이스 탭을 열어 차트를 확인합니다. 5초마다 업데이트됩니다.
이제 프로젝트가 완료되었습니다. 저희 Raspberry Pi Pico W는 자동으로 Wi-Fi에 연결하고 MQTT를 통해 데이터를 게시하도록 설정되었습니다. Node-RED를 실행하는 Raspberry Pi 4는 MQTT 데이터를 라이브 대시보드로 해석하여 집의 온도와 습도를 알려줍니다. Node-RED는 Raspberry Pi가 부팅되면 자동으로 시작되어 언제든지 데이터를 제공할 준비가 된 기기를 만듭니다.
'라즈베리파이 5' 카테고리의 다른 글
라즈베리파이 초보자를 위한 카드뉴스 (1) | 2025.02.26 |
---|---|
라즈베리파이 5 Initializing Docker Swarm 3 (0) | 2025.02.17 |
라즈베리 파이 5 도커 스웜 Docker Swarm 클러스터 계획하기 2 (0) | 2025.02.17 |
라즈베리 파이 5 도커 스웜 Docker Swarm (0) | 2025.02.17 |
라즈베리파이 5 카메라 설치 가이드 (2) | 2025.02.05 |
라즈베리파이 개발자를 위한 여행 안내서 (5) | 2025.02.04 |
아두이노와 라즈베리 파이를 이용해 실용적인 전자 프로젝트 (0) | 2025.02.04 |
튜토리얼이 포함된 최고의 라즈베리 파이 프로젝트 (1) | 2025.02.04 |
더욱 좋은 정보를 제공하겠습니다.~ ^^