아두이노와 파이썬으로 OpenSensors를 활용한 공기질 측정 가이드
소개
이 프로젝트에서는 작업장의 공기질을 간단하면서도 강력하게 평가하는 방법을 다룹니다. 저렴하고 사용하기 쉬운 Shinyei PPD-42 센서를 선택했으며, 아두이노 우노(Arduino UNO)와 리눅스 기반 호스트(예: 라즈베리 파이)와 결합했습니다. 이 센서는 건강에 해로울 수 있는 미세 입자의 농도를 실시간으로 스트리밍하며, 데이터를 OpenSensors 메시징 브로커에 지속적으로 발행합니다.
필요한 준비물
- Shinyei PPD-42 센서
- 아두이노 우노
- 리눅스 컴퓨터 또는 라즈베리 파이
이 가이드는 DustDuino 프로젝트를 따릅니다. 이 프로젝트는 PPD-42를 아두이노 및 Wi-Fi와 이미 통합해두었습니다. 우리는 해당 배선도와 코드를 OpenSensors 설정에 맞게 수정했습니다.
먼저, DustDuino 지침의 2단계에 따라 센서를 아두이노에 연결합니다. 그런 다음 GitHub 저장소에서 DustDuinoSerial.ino 스케치를 다운로드해 아두이노 IDE에서 열고 우노에 업로드합니다.
아두이노 IDE의 시리얼 모니터를 열어 센서가 데이터를 전송하는지 확인합니다.
이제 Mosquitto 클라이언트 라이브러리를 활용하는 가벼운 파이썬 스크립트를 사용해 아두이노의 시리얼 출력을 OpenSensors 브로커로 연결하겠습니다.
파이썬 기초 테스트
머신에서 파이썬이 준비되었는지 확인하려면 hi.py라는 파일을 만들고 다음 내용을 추가합니다:
print("Hello World")
터미널에서 실행합니다:
python hi.py
콘솔에 Hello World가 출력되어야 합니다.
OpenSensors 연결 테스트
아직 설치하지 않았다면 Mosquitto 파이썬 클라이언트를 설치합니다:
sudo apt-get install python-pip
sudo pip install paho-mqtt
다음 최소 스크립트로 OpenSensors에 발행 테스트를 합니다(자격 증명으로 교체):
import paho.mqtt.client as mqtt
mqttc = mqtt.Client(client_id="939")
mqttc.username_pw_set("Louis", password="AbcDEFgH")
mqttc.connect("mqtt.opensensors.io")
mqttc.publish("/users/Louis/test2", payload="Hello Opensensors!", qos=0, retain=False)
mqttc.disconnect()
성공적으로 실행되면 OpenSensors 콘솔에 메시지가 나타납니다.
아두이노의 시리얼 포트에 연결하려면 다음 명령으로 장치를 식별합니다:
dmesg | grep tty
일반적인 출력 예시:
[ 0.000000] console [tty0] enabled
[ 3522.192687] cdc_acm 7-1:1.0: ttyACM0: USB ACM device
여기서 /dev/ttyACM0이 사용할 시리얼 포트입니다.
파이썬으로 시리얼 데이터 읽기:
import serial
ser = serial.Serial('/dev/ttyACM0')
while True:
print(ser.readline())
센서 출력과 MQTT 통합
시리얼 리더와 MQTT 발행자를 하나의 스크립트로 결합합니다. 아래 예제는 센서 데이터의 각 줄을 1초마다 /users/Louis/ODI/airquality 토픽으로 발행합니다:
import serial
import paho.mqtt.client as mqtt
import time
mqttc = mqtt.Client(client_id="939")
mqttc.username_pw_set("Louis", password="AbcDEFgH")
mqttc.connect("mqtt.opensensors.io")
ser = serial.Serial('/dev/ttyACM0') # 포트가 다르면 조정
while True:
message = ser.readline()
print(message)
mqttc.publish("/users/Louis/ODI/airquality", payload=message, qos=0, retain=False)
time.sleep(1)
다운스트림 처리를 쉽게 하려면 아두이노 출력을 발행 전에 JSON 형식으로 포맷하는 것을 고려하세요.
생성한 토픽을 방문해 OpenSensors에서 결과 데이터 스트림을 탐색해 보세요: 여기
전체 코드 예제
import serial
import paho.mqtt.client as mqtt
import time
mqttc = mqtt.Client(client_id="939")
mqttc.username_pw_set("Louis", password="AbcDEFgH")
mqttc.connect("opensensors.io")
ser = serial.Serial('/dev/ttyACM0') # 첫 번째 시리얼 포트 열기
while True:
message = ser.readline()
print(message)
mqttc.publish("/users/Louis/ODI/airquality", payload=message, qos=0, retain=False)
time.sleep(1)
출처: How to Measure Air Quality on OpenSensors