수행기록퀘스트4

Quest4-Pico W - 최종 결과물 완성 (상세 설명 및 동작 영상-화재감지기)
2022. 10. 3 (월) 15:40 최종수정 2022. 10. 3 (월) 15:51 변화의 물결 조회 719 좋아요 0 스크랩 0 댓글 0

1. 개발 목적

 

 - 기존 Pico 제품에 Wireless 기능이 추가되었다고 해서 생활에 유용한 정보 전달과 안전에 조금 중점을 두어 아이디어를 생각해보았습니다.

  - 최근 들어 실외기, 김치냉장고, 콘센트 등 가정에서 화재가 많이 발생하고 있습니다. 화재 예방하기 위해서 비접촉 온도 센서와 가스 센서로 화재를 미리 감지하고 데이터화하여 특정 수치 이상이 된다면 알람을 주는 기능과 추가로 현재 실내의 온도를 측정해서 클라우드에 저장하게 합니다. 그리고 이 정보들을 외부에서도 볼 수 있다면 좋지 않을까 해서 PicoW 화재 감지기를 생각하게 되었습니다.

 

2. 개발 사항

 1) 기존 H/W 개발내용과 변경된 부분

 

  - 열화상 카메라가 아니라, 비접촉 온도 센서 경우 포인터 지점의 온도를 측정하기 때문에 반대 방향에서 불이 날 경우 측정할 수 없다고 생각되어 제거했습니다. 한 지점을 지켜본다고 하면 장착하면 될 것으로 생각됩니다.

 

 - 실제 사용한다면 배터리를 장착해서 사용한다는 개념을 넣어 충전 모듈과 배터리를 장착해보았습니다.

 

 2) S/W 개발 환경

 - WIndows 10

 - Thonny 3.3.11

 - MicroPython (rp2-pico-w-20220930-unstable-v1.19.1-461-g282401da5.uf2)

 

3. 하드웨어 구성

  - Raspberry Pi PicoW

  - MQ-2 (가스 센서)

  - DHT11 (온도, 습도 세넛)

  - 03962A(TP4056) 충전모듈

  - 리튬 폴리머 배터리 (1100mAh)

 

4. 회로도(배선)

PicoW

Sensor

3V3(36)

MQ-2(VCC), DHT11(VCC)

GND(38,23)

MQ-2(GND), DHT11(GND), LED-(GND)

GP17(22)

DHT11(SIG)

GP26(31)

MQ-2(A0)

VSYS

03962A 충전모듈(OUT+)

GND(38)

03962A 충전모듈(OUT-)

GP18(24)

LED+

 

 

5. F/W소프트웨어 흐름도

 

 1) 현장에 있는 무선 공유기(AP)에 접속하는 과정이 필요합니다.

 2) MQTT 서버에 SSL 등 보안 설정에 맞게 접속하여 세션을 열어둡니다.

 3) 가스 센서와 온도 센서에 초기화 작업을 해줍니다.

 4) 가스 센서와 온도 센서 측정을 시작합니다.

 5) 센서값에 대한 알람 기준값과 비교합니다

 6) 5번 과정에서 수치를 넘어가면 LED을 켭니다. (경광등이나 버저등을 연결하여 사용 가능)

 7) 측정 센서값을 MQTT Broker 서버에 전송합니다. 잠시 딜레이를 준 후에 4번 과정을 반복합니다.

 

 

6. MQTT Cloud 연결

 1) HIVEMQ 서버 가입

   (1) 회원가입하고 사이트에 고유 접속할 클러스터 URL 이 주어집니다.

    - https://www.hivemq.com/mqtt-cloud-broker/ 로 가입합니다.

    (2) 고유한 클러스트에 클라이언트가 생성할 수 있으며 접속하기 위한 Username과 Password를 만듭니다. 여기에서는 PicoW0001로 만들어 보았습니다.

 

 2) MQTT 데이터를 볼 수 있는 클라이언트 프로그램

  - 그래프 때문에 프로그램을 만들어야 할지, ThingSpeak를 사용해서 보여주는 것이 좋을지 고민했는데 그래프로 보여줄 수 있는 무료 MQTT 클라이언트 프로그램이 있어 사용해보았습니다.

 

  - 무료 MQTT Client 프로그램 (MQTT Explorer) :   https://mqtt-explorer.com/

 

  - 무료이간 한데 저작자 공개하고 프로그램 수정하지 않는다는 전제로 사용할 수 있습니다.

 

  - 사이트에서 Window 버전을 다운로드 받아도 되고 설치하지 않아도 되는 Portable 버전을 받아서 사용해도 됩니다. 여기서는 Portable 버전으로 해서 테스트하였습니다.

 

  - HIVEMQ Broker에 연결하려면 아래와 같이 설정해주어야 합니다.

 (TLS 설정을 활성화해주고 Validate certificate는 비활성화해주어야 하며 가입한 서버접속 번호를 넣어줍니다. 만든 계정정보를 입력 후 CONNECT를 누릅니다. 이상 없다면 다음 화면으로 넘어가고 문제가 있다면 접속에러 팝업창이 나타납니다.

 

 

7. 소스파일 구성

  - MQTT 라이브러리 파일 : umqtt/simple.py

  - MQ-2를 위한 소스파일 : basemq.py, mq-2.py

  - dht11를 위한 소스파일 : dht11.py

  - 데이터 송수신 및 센싱하는 메인 파일로 구성 : main.py

   (소스에 접속하는 주소등은 제거하였습니다. main.py 이며, 나머지는 첨부 파일 참조)

from machine import Pin
import utime
from dht import DHT11, InvalidChecksum

from mq2 import MQ2
import time
#import secrets
import network
from machine import Pin
from umqtt.simple import MQTTClient
import ussl
import ntptime

# Blink the onboard LED to show startup
led = Pin("LED", Pin.OUT)
led.off()
time.sleep_ms(100)
led.on()
time.sleep_ms(100)
led.off()

# Connect to WiFi
# Based on https://datasheets.raspberrypi.com/picow/connecting-to-the-internet-with-pico-w.pdf
print('----------------------------------------------------------------------------------------------')
print('Connecting to AP: ' + "SSID")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("SSID","AP_PW")


# Wait for connect or fail
connected = False
attempt = 0
while not connected and attempt < 10:
    attempt += 1
    if wlan.status() < 0 or wlan.status() >= 3:
        connected = True
    if not connected:
        print("Connection attempt failed: " + str(attempt))
        time.sleep(1)
    else:
        print("Connected on attempt: " + str(attempt))
        
if not connected or wlan.ifconfig()[0] == "0.0.0.0":
    # Blink LED to show there is a WiFi problem
    print("Bad WiFi connection: " + wlan.ifconfig()[0])
    while True:
        led.off()
        time.sleep_ms(150)
        led.on()
        time.sleep_ms(150)

print("WiFi status: " + str(wlan.ifconfig()))
led.on()

# To validate certificates, a valid time is required
print('----------------------------------------------------------------------------------------------')
print('Connecting to NTP')
ntptime.host = "de.pool.ntp.org"
ntptime.settime()
print('Current time: ' + str(time.localtime()))


# Based on https://www.tomshardware.com/how-to/send-and-receive-data-raspberry-pi-pico-w-mqtt
print('----------------------------------------------------------------------------------------------')
print("Connecting to " + "  ")
sslparams = {'server_hostname': "Your MQTT Broker Address"}

client = MQTTClient(client_id="your name",
                    server="Your MQTT Broker Address",
                    port=8883,
                    user="Your MQTT Broker ID ",
                    password="Your MQTT Broker PW",
                    keepalive=3600,
                    ssl=True,
                    ssl_params=sslparams) 
client.connect()
print('Connected to MQTT Broker : HIVEMQ')

# MQ-2 Setting
adcPin=26
GasSensor = MQ2(pinData = adcPin, baseVoltage = 3.3)
print("Calibrating")
GasSensor.calibrate()
print("Calibration completed")
print("Base resistance:{0}".format(GasSensor._ro))

# DHT11 
# Wait 1 second to let the sensor power up
utime.sleep(1)
signPin = Pin(17, Pin.OUT, Pin.PULL_DOWN)
TempSensor = DHT11(signPin)

AlarmLed = Pin(18, Pin.OUT)
GAS_MAX = 200.0
AlarmLed.off()

while True :
    try:
        
        utime.sleep(1)
        strTempData = "{:.1f}".format(TempSensor.temperature)
        print("Temperature: " + strTempData)
        print("Humidity: {}".format(TempSensor.humidity))
        
        fSmokeData = GasSensor.readSmoke()
        if (fSmokeData >= GAS_MAX):
            AlarmLed.on()
        else:
            AlarmLed.off()
            
        strGasData = "{:.1f}".format(fSmokeData)
        print("Smoke: " + strGasData )
        client.publish('PicoW/Gas', strGasData)
        client.publish('PicoW/Temp', strTempData)
    except InvalidChecksum:
        print("Checksum from the sensor was invalid")

    utime.sleep(2)

 

8. 센서 데이터 전송 결과 확인

 1) Thonny에서 Shell에서 전송확인

 

 

 2) HIVEMQ WebClient에서 확인

 

 3) MQTT Explorer 프로그램에서 확인

 

9. 동작 동영상

https://youtu.be/acMan4B9opQ

 

10. 프로젝트 진행중 얻게 된 경험과 소감

 

 - 기존 Pico의 부족한 네트워크 부분을 보강해서 활용성이 조금 더 좋아 보였습니다. 그러나 외부로 안테나 연결할 수 있는 커넥터 하나 만들어 주었으면 좀 더 좋지 않았을까 생각이 들었습니다.

 

 - MQTT라는 프로토콜에 관해서 공부할 좋은 기회가 되었고 각종 센서를 부착하여 현장에서도 IoT 센서로 사용할 수 있겠다 생각이 들었습니다.

 

 - PicoW로 새로운 제품이기도 하고 무료로 제공해주는 MQTT Broker를 사용하려다 보니 국내 자료들이 현재 시점에서 찾기가 힘들었습니다. 그래서 시행착오를 조금 경험하였습니다. 많은 사람이 도전해서 정보들도 많아 졌으면 합니다. 사실 센서 부착하고 간단하게 데이터만 보내면 되겠지 했는데, 조금 잘 만들어 보려고 하니, 접속하기 보안, 그래프로 나타내기 위한 plugin 등 생각해야 할 부분이 늘어났습니다.

 

 - 가스 센서를 잘 사용하기 위해서는 데이터시트 봐야 하고 특성 그래프를 잘 이해해서 프로그에 적용해야 합니다. 그리고 수학적인 계산이 조금 필요했습니다. 현실적으로 캘리브레이션 등을 하지고 못하고 실제 수치가 정확한지 알지 못해서 정확도를 알 수 없다는 어려움이 있었습니다.

 

 - 버그 발견(?) - 단정하기는 이르지만, Pico와 PicoW로 비교했을 때, 동일한 소스로 dht11 를 장착하고 통신을 Pico는 문제없이 센서값을 수신하였지만, PicoW는 비주기적으로 펄스 수신에 에러가 발생했습니다. 현재 버전에서는 문제가 있어 보였습니다. 향후 버전에서는 문제가 사라지지 않을까 합니다.

 

 

11. 참고 사이트

 

 1) HIVEMQ

  https://www.hivemq.com/mqtt-cloud-broker/

 2) dht11 관련

  https://microdigisoft.com/dht11-with-raspberry-pi-pico-using-micropython/

 3) MQ-2 관련

  https://github.com/peppe8o/rpi-pico-peppe8o/tree/main/libraries/mq-2

 4) MQTT Explorer 

  https://mqtt-explorer.com/

 

감사합니다.

첨부파일
202210_e4ds_picow_upload.zip 다운로드

로그인 후
참가 상태를 확인할 수 있습니다.