수행기록퀘스트4
Quest4 최종 결과물 Report
목차
□ 1. 아이디어 소개 및 구현
□ 2. Project Idea 개념
□ 3. HW Circuit
□ 4. Thingspeak 환경설정 및 개발툴 셋업
□ 5. Message전송 방법
□ 6. Source Code
□ 7. 데모 Capture / 동영상
□ 8. PROJECT후기 ( 선택한 개발툴과 프로그래밍 언어의 장·단점 및 특징 등 )
□ 9. 참조 사이트
□ 1. 아이디어 소개 및 구현
1. 사람이 느끼는 더위는 온도 뿐만 아니라 습도에도 매우 민감하기 때문에 하기와 같은 Idea를 구현하고자 합니다.
- 실내 온도 / 습도 측정 하고 측정된 온습도 Data를 이용하여 불쾌지수의 계산하여 Cloud로 전송합니다.
- 실외 온도 / 습도 측정 하고 실외의 불쾌 지수의 계산하여 Cloud로 전송합니다.
2. MQTT Broker와 dashboard를 이용하여 전체 상황 모니터링( 온도/습도/불쾌지수) 및 Message전달.
- 계산된 실내 불쾌 지수가 75이상일 경우 에어컨을 작동시키는 것을 트위터로 권고합니다.
3. SW와 센서를 추가하여 SW로 외출 Mode를 설정할 수 있도록 하였고, 외출 Mode에서 사람의 움직임을 Monitoring하여
Cloud에 전송하고, 전송된 Data를 바탕으로 외출한 사이 외부에서 침입이 있는지를 Message로 전송할 수 있는 방범 Mode를 추가하였습니다.
출처 : https://m.blog.naver.com/iotsensor/221153546510
□ 2. Project Idea 개념
□ 3. HW Circuit / SW Block Diagram
- SENSOR Board를 UART로 연결하여 외부의 온도/습도 및 Sensor정보를 받음.
- SENSOR Board의 전원은 외부 USB전원을 사용함.
1) Bread board기판
2) 실제 구현한 Bread Board기판.
□ 4. Thingspeak 환경설정 및 개발툴 셋업
- Thingspeak의 사용 방법
Cloud Service로는 이전에 사용해 보았던 ThingSpeak를 사용하려고 한다.
무료 사용자는 하루 8,219 개를 Data를 Update할 수 있다고 합니다.
따라서 24시간 * 60분 * 60초 / 8219 = 10.5초
1개의 센서라면 10초에 1번 정도로 값을 Server로 보낼 수 있고,
만약 2개의 Data를 사용한다면 20초에 1번 정도로 값을 보낼 수 있습니다.
1. https://thingspeak.com에서 Get Started For Free를 Click함.
2. ThingSpeak Get Started For Free 화면으로 이동하여 account가 없는 사람은 Create one!을 Click하고, 이전에 account가 있는 사람은 email address를 넣고 Next를 Click한다.
3. Creat One을 Click하였을 경우 Email Address부터 요구하는 정보를 Keyin하고 Continue를 Click한다.
4. 계정 등록이 끝나면, 최종 verify 메일이 옵니다.
6. 계정 인증 후, 비번 완료하면 끝납니다.
7. Channel Settings에서 PicoW에서 보낼 Data를 추가한다.
Channel 설정이 끝나고 PicoW를 통하여 Measure된 Data를 MQTT를 통해 전송하면 하기와 같이 Display된다.
실내 불쾌 지수와 실외 불쾌지수는 Add Widget을 하여 설정하였다.
SW를 누르면 방범 Mode On / Off가 Toggle한다.
방범 Mode가 On되어 있을 경우 PIR센서를 통하여 움직임이 감지되면 PIR_Counter를 Increase시키고,
방범Mode가 Off되면 PIR_Counter를 '0'로 초기화 시키고 움직임이 감지되어도 PIR_Counter는 '0'로 유지한다.
□ 5. Message전송 방법 및 결과.
Message전송 결과.
설정 방법
- App / React를 선정하고 하기와 같이 설정을 진행한다.
- 외출모드에서 PIR센서의 움직임이 2회 이상 Detection되었을 경우 Tweeter를 통해 경고 Message를 전송한다.
- 실내 불쾌지수가 75이상일 경우 Tweeter를 통해 불쾌지수가 높기 때문에 에어컨을 On을 추천한다..
Message전송 관련 설정 결과.
□ 6. Source Code
Library설정
# Thingspeak연결
import network
from umqtt.robust import MQTTClient
import time
import sys
# Configuration parameters
#=======================================================
WIFI_SSID = 'User SSID'
WIFI_PASSWORD = 'User Passward'
THINGSPEAK_MQTT_CLIENT_ID = "User Client ID"
THINGSPEAK_MQTT_USERNAME = "User Name"
THINGSPEAK_MQTT_PASSWORD = "User Password"
THINGSPEAK_CHANNEL_ID = 'User Channel ID'
#=======================================================
# turn off the WiFi Access Point
ap_if = network.WLAN(network.AP_IF)
ap_if.active(False)
# connect the device to the WiFi network
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(WIFI_SSID, WIFI_PASSWORD)
# wait until the device is connected to the WiFi network
MAX_ATTEMPTS = 5
attempt_count = 0
while not wifi.isconnected() and attempt_count < MAX_ATTEMPTS:
attempt_count += 1
time.sleep(1)
if attempt_count == MAX_ATTEMPTS:
print('could not connect to the WiFi network')
sys.exit()
# To use a secure connection (encrypted) with TLS:
# set MQTTClient initializer parameter to "ssl=True"
# Caveat: a secure connection uses more heap space
THINGSPEAK_MQTT_USERNAME = THINGSPEAK_MQTT_CLIENT_ID
client = MQTTClient(server=b"mqtt3.thingspeak.com",
client_id=THINGSPEAK_MQTT_CLIENT_ID,
user=THINGSPEAK_MQTT_USERNAME,
password=THINGSPEAK_MQTT_PASSWORD,
ssl=False)
try:
client.connect()
except Exception as e:
print('could not connect to MQTT server {}{}'.format(type(e).__name__, e))
sys.exit()
#온습도 센서의 I2C연결
from machine import Pin
from machine import I2C
import ahtx0
# I2C for the AHT20 : Pin15와 Pin14에 연결되어 있고 통신속도는 400KHz로 설정함.
i2c = I2C(1, scl=Pin(15), sda=Pin(14), freq=400000)
# 실내 온도 습도를 읽는 Routine
def ahtx20measure():
# Create the sensor object using I2C
sensor = ahtx0.AHT10(i2c)
return sensor.temperature, sensor.relative_humidity
#Display 설정 : SSD1306
# import library and create object oled
from ssd1306 import SSD1306_I2C
oled_i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)
oled = SSD1306_I2C(128, 64, oled_i2c, addr=0x3C)
# Clear display :
def displayClear():
oled.fill(0)
oled.show()
# create a function do display all data:
def displayData(intemp, inhumi, inrate, outtemp, outhumi, outrate, mode, pir ):
oled.fill(0)
oled.text("InT : " + str(intemp) + "oC", 0, 4)
oled.text("InH : " + str(inhumi) + "%",0, 16)
oled.text("DCI : " + str(inrate) + " ", 0, 29) #DCI : Discomfort Index
if mode == 1:
oled.text("OutMode : " + str(outtemp) + " ", 0, 43)
else :
oled.text("InMode : " + str(outtemp) + " ", 0, 43)
oled.text("Pir : " + str(pir), 0, 57)
oled.show()
#UART 설정 : L475IOT Board를 UART로 연결
from machine import UART
uart0 = UART(0, baudrate=115200, tx=Pin(12), rx=Pin(13))
def measure_data():
time.sleep(0.5)
if uart0.any() > 0:
str = uart0.readline()
str = str.decode()
str = str.rstrip()
str = str.split(" ")
return str[1], str[2]
#방범 Mode시 외부 침입을 Detect하기 위하여 PIR 센서의 입력을 External Interrupt로 연결하여
# 방범 Mode에서 외부 침입이 감지되면 PIR_Coutnr를 증가 시킨다.
from time import sleep
PIR = Pin(11, Pin.IN, Pin.PULL_DOWN)
PIR_count = 0
def pir_rising(k):
global PIR_count
sleep(0.01)
if k.value(): # PIR Deteted, 1, HIGH
if OUT_status == 1: #방범 Mode일 경우
PIR_count = PIR_count +1
print('Mode = Out :',PIR_count)
else :
PIR_count = 0
print('Mode = In :',PIR_count)
#Mode SW를 통해 방범 Mode의 설정.
OUT = Pin(18, Pin.IN, Pin.PULL_DOWN)
OUT_status = 0
def out_rising(j):
global OUT_status
sleep(0.01)
if j.value():
if OUT_status == 1:
OUT_status = 0
else :
OUT_status = 1
# print(OUT_status)
OUT.irq(out_rising, Pin.IRQ_RISING)
# Continually publish two fields to a Thingspeak channel using MQTT
PUBLISH_PERIOD_IN_SEC = 20 #Update주기 설정 : 20초
while True:
try:
credentials = bytes("channels/{:s}/publish".format(THINGSPEAK_CHANNEL_ID), 'utf-8')
Intemp, Inhumi, Outtemp, Outhumi = collectData()
Inrate = 9/5*Intempf -0.55*(1-Inhumif/100) * (9/5*Intempf-26)+32
Outrate = 9/5*Outtempf -0.55*(1-Outhumif/100) * (9/5*Outtempf-26)+32
print(Intemp,Inhumi,Inrate,Outtemp,Outhumi,Outrate,OUT_status,PIR_count)
displayData(Intemp,Inhumi,Inrate,Outtemp,Outhumi,Outrate,OUT_status,PIR_count)
payload = "field1="+str(Intemp)+"&field2="+str(Inhumi)+"&field3="+str(Inrate)+"&field4="+str(Outtemp)+"&field5="+str(Outhumi)+"&field6="+str(Outrate)+"&field7="+str(PIR_count)
client.publish(credentials, payload)
time.sleep(PUBLISH_PERIOD_IN_SEC)
□ 7. 데모 Capture / 동영상 Link
동영상 Link : https://youtu.be/hTe8YEaBCP4
1) Demo시 Thingspeak screen & IDE
□ 8. PROJECT후기 ( 선택한 개발툴과 프로그래밍 언어의 장·단점 및 특징 등 )
단순 결과물 제출보다는 Pico W의 장·단점, 선택한 개발툴과 프로그래밍 언어의 장·단점 및 특징, 사용하신 클라우드 서비스의 장·단점 및 특징들을 포함하여 제출해 주시기 바랍니다.
Raspberry Pi PicoW 보드의 장점.
Raspberry Pi Pico 보드는 유연한 디지털 인터페이스를 갖춘 고성능 마이크로컨트롤러 보드로서
다른 Board와 비교하여 가장 큰 장점은 $6의 가격입니다.
출처 : https://dronebotworkshop.com/picow-arduino/
RP2040 칩 기능:
- 듀얼 ARM Cortex-M0+ @ 133MHz
- 6개의 독립 뱅크에 264kB 온칩 SRAM
- 전용 QSPI 버스를 통해 최대 16MB의 오프칩 플래시 메모리 지원
- DMA 컨트롤러
- 완전히 연결된 AHB 크로스바
- 보간기 및 정수 분배기 주변 장치
- 코어 전압을 생성하는 온칩 프로그래밍 가능 LDO
- USB 및 코어 클록 생성을 위한 2개의 온칩 PLL
- 30개의 GPIO 핀(그 중 4개는 아날로그 입력으로 사용할 수 있음)
- 주변기기
- 2개의 UART
- 2개의 SPI 컨트롤러
- 2 I2C 컨트롤러
- 16 PWM 채널
- USB 1.1 컨트롤러 및 PHY(호스트 및 장치 지원 포함)
- 8 PIO 상태 머신
Pico-W의 아쉬운 점 :
1. 현재는 블루투스가 지원되지 않는다는 것입니다.
2. 5GHz WiFI를 지원하지 않는다.
출처 : https://dronebotworkshop.com/picow-arduino/
Micropython :
이번 Quest에서 MicorPython이라는 것을 처음 접해 보았습니다. Python과 무었이 다를까?
아마도 MCU에서 Python program을 수행시키기 위해 몸집을 줄인것으로 이해하였습니다.
Python과 동일하게 Library를 import하여 사용하는 것도 동일하여 처음 사용해 보는 저로서는 어렵지 않게 예제를 수행시킬 수 있었습니다.
다만 C나 C++와는 다른 Data format을 이해하고 형을 변경시키는 과정에서 시간이 걸렸습니다.
따라서 micro Python을 이해하고 사용하기 위해서는 Python에 대한 기초 지식이 필요할 것으로 판단됩니다.
하지만 타 언어에 비해서 MicroPython을 사용하는데 시간이 많이 걸리지 않고, 또한 Arduino에서 사용하였던 Sensor나 부품들을 사용할 수 있기에 교육용으로 사용하기에는 좋을 것같습니다.
다만, 이번 Project를 하면서 Pico-W가 Hold가 되거나 Boot Mode에서 Firmware를 Download했음에도 인식이 되지 않는 등 MicroPython Firmware에 안정화 작업이 필요한 것으로 보여집니다. 따라서 Pico-W를 사용하여 MicroPython으로 상용제품읆 만드는 것은 다양한 문제가 있을 수 있으나 교육용으로 사용하는데는 Open되어 있는 Library를 사용하여 손쉽고 빠르게 주변 기기들을 제어하고 통신할 수 있다는 것 만으로도 충분한 가능성이 있을 것 같습니다.
저의 경우를 본다면 DHT11 Sensor가 동작이 되지않아서 대치할 만한 Sensor를 찾던 중 STM32L745 IOT Board에 동일한 기능의 Sensor뿐만 아니라 여러가지 Sensor가 있다는 것을 알게 되었습니다. STM32L745 IOT Board의 센서 Data를 이용하기 위하여 UART를 이용하였고, MicroPython에서는 하기의 단 몇 Line을 통해서 Sensor Board와 Pico-W와의 연결 및 Data을 가져올 수 있었습니다.
C 언어를 사용하였을 경우 보다 시간 및 Coding Line수가 비교할 수 없을 만큼 간단하여 처음 사용하는 사람도 개념만 있다면 손쉽게 사용할 수 있을 것 같다.
from machine import UART
uart0 = UART(0, baudrate=115200, tx=Pin(12), rx=Pin(13))
if uart0.any() > 0:
str = uart0.readline()
하지만 단점으로는 Micro Python도 하나의 언어이기 때문에 Python에 대한 기초지식이 없다면 기존에 있는 것을 따라하기는 쉬울지 몰라도 새롭게 무엇인가를 추가하는데에는 문제가 발생할 수 있습니다. 또한 문제가 발생하였을 때에 Library에서 발생하는 것이라면 더 더욱 Debugging이 쉽지 않을 것입니다.
결론적으로 말한다면 Embedded System에서 사용하는 C/C++를 사용하는 것보다는 빠른 시간안에 결과물을 도출할 수 있어 교육용이나 기본 성능을 확인하는 평가용으로는 좋은 Solution이 될 것 같습니다. 하지만 상업용으로 MicroPython을 생각하신다면 좀 더 고민을 해 보아야 할 것 같습니다.
클라우드 서비스의 장·단점 및 특징
ThingSpeak는 타 Cloud Service에 비해 가입철차가 간편하고 측정된 Data를 Upload하는데 쉽다. 그리고 수학적 계산이 필요한 경우 Matlab이라는 강력한 Tool을 사용할 수 있어서 Data 분석에 탁월하다. 또한 간단한 설정만으로 Tweet을 할 수 있어서 결과를 Tweet으로 받아 볼 수 있다.
다만, Phone으로 Message를 전달하려고 하는 경우 타 Application을 사용해야 되는 만큼 ThingSpeak에서 지원하지 않는 기능이 필요한 경우에는 복잡해 진다.
Azure / AWS 같은 경우 Data하나를 Upload하기 위해서 거쳐야할 절차가 복잡해서 교육용으로 사용하기에는 어렵지 않을까 생각된다.
저도 Azure를 연결하고 측정 Data를 Upload하고 LED On/Off를 하는데 2일이 걸렸다. 아마도 많은 신청자들이 알 수 없는 Error에 막히고 수많은 절차에 질려서 포기하지 않았을까 싶다. AWS또한 동일하여 예제 Program을 이용하여 MQTT를 연결하는데만도 넘어야될 산이 많다. 아마도 Azure나 AWS가 친숙하지 않고 설정해야 될 항목이 많아서세미나를 해 주신 내용이 없었다면 MQTT를 연결하는데 더 많은 시간이 걸렸을 것이다.
Azure / AWS는 상용으로 사용하는데는 보안 인증등 신뢰성 측면에서 높은 점수를 줄 수 있을것 같으나, 교육용으로는 사용하기에는 해당 설정 만으로 너무 진이 빠지는 것아 같다.
□ 9. 참조 사이트
□ https://thonny.org/
□ https://core-electronics.com.au/projects/wifi-garage-door-controller-with-raspberry-pi-pico-w-smart-home-project/
□ https://www.raspberrypi.com/products/raspberry-pi-pico/
□ https://circuitpython.org/board/raspberry_pi_pico/
□ https://www.cnx-software.com/2022/07/03/getting-started-with-wifi-on-raspberry-pi-pico-w-board/
□ https://dronebotworkshop.com/soil-moisture/ : IOT로 정원 물주기 등 다수의 Project 참고
□ https://dronebotworkshop.com/picow-arduino/
- 첨부파일
- Quest4_Final.zip 다운로드
로그인 후
참가 상태를 확인할 수 있습니다.