Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PyconKR 2018 Python으로 나만의 IOT 구축하기
Search
Bill-Park
August 17, 2018
Programming
0
1.5k
PyconKR 2018 Python으로 나만의 IOT 구축하기
Pycon KR 2018 Python으로 나만의 IOT 구축하기에 사용한 발표 자료입니다.
Bill-Park
August 17, 2018
Tweet
Share
Other Decks in Programming
See All in Programming
Some Quick Ideas To Improve Your Tests ( #jassttokyo )
teyamagu
PRO
2
2k
孤独のCTOグルメという やや奇抜な企画をやった目的と効果
shoheimitani
3
730
PHPカンファレンス関西2024でLTとスタッフした
ohmori_yusuke
2
120
before_rails_girls_after_rails_girls
maimux2x
0
300
So You Think You Know Git - Part 2
schacon
PRO
0
1.3k
期限が近づいてきた!Privacy Manifests対応
ryunakayama
5
3.1k
TokyoR#111_ANOVA
kilometer
1
710
Go1.22からの疑似乱数生成器について/go-122-pseudo-random-generator
convto
1
110
ADRを一年運用してみた/our_story_about_adr
hanhan1978
3
1.1k
phpunit/php-code-coverageって何をしてるんだ #phperkaigi
o0h
PRO
2
190
とにかくHTTP3をライトニングに話す / Anyway, I'll talk to Lightning about HTTP3.
seike460
PRO
0
110
WasmOS: Wasmを実行する自作Microkernel
riru
0
360
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
16k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
14
1.3k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
WebSockets: Embracing the real-time Web
robhawkes
59
6.9k
The Power of CSS Pseudo Elements
geoffreycrofte
58
4.9k
Happy Clients
brianwarren
91
6.3k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
355
22k
Embracing the Ebb and Flow
colly
78
4.1k
Keith and Marios Guide to Fast Websites
keithpitt
407
22k
What's new in Ruby 2.0
geeforr
335
31k
Designing with Data
zakiwarfel
94
4.8k
How STYLIGHT went responsive
nonsquared
92
4.7k
Transcript
Python으로 나만의 IOT 구축하기 미세먼지, 온습도편 Bill Park
None
None
목차 1. Pyboard란? 2. 미세먼지 수치가 높다! 3. 온습도가 마음에
들지 않는다! 4. 라즈베리파이로 서버 만들기 5. 텔레그램 봇 추가하기
PyBoard?
PyBoard란? • MicroPython이 구동되는 개발용 보드 • REPL을 통해 프로그래밍
가능 • Raw REPL 모드로 스크립트 실행 가능 • Micro sd안의 스크립트 실행 가능
성능은? • 168MHz의 CPU • 1024KB의 플래쉬 롬 • 192KB의
램 • 94KB의 Python 스크립트 저장공간 • 최대 64GB Micro sd 지원
어떤걸 살까? 공식 pyboard v1.1 28€ 카피보드 17.18$ 이미지 출처
https://store.micropython.org/product/PYBv1.1 https://www.aliexpress.com/item/STM32-STM32F405RGT6-Core-Board-For-MicroPython-Development-Board-for-Pyboard-Python-Learning-Module-STM32F405-with- Full/32802057980.html?spm=a2g0s.9042311.0.0.3b634c4d6LObFl
왜 카피보드인가 • 동일한 성능 • 싼 가격
미세먼지 수치가 높다!
미세먼지 수치가 높다! • 연일 최고치를 찍는다. • 일기예보 수치를
못믿겠다. (공원이나 건물위에 측정기가 있다.) • 지금 이곳의 수치를 알고싶다. 이미지 출처 http://www.kyongbuk.co.kr/?mod=news&act=articleView&idxno=1014380
미세먼지 센서를 사용해 보자
PMS5003 • 레이저 측정방식 • 최소 0.3 측정 가능 •
TTL 레벨(3.3V)의 시리얼 통신 사용 • passive 모드 지원 (active모드는 버퍼에 쌓인다)
실측결과 • 10, 단위 ∶ /* • 부산 모 공항
: 52 • 서울 모 대학 : 31 • 서울 모 카페 : 50 • 깨끗한 거실 : 9 • 납땜 직후 방 : 95
값을 받아오려면? #change to passive mode // 42 4D E1
00 00 01 70 pms.write('\x42\x4D') pms.writechar(225) #E1 pms.write('\x00\x00\x01\x70') #reset buffer pms.deinit() pms.init(9600) #get data // 42 4D E2 00 00 01 71 pms.write('\x42\x4D') pms.writechar(226) #E2 pms.write('\x00\x00\x01\x71') if pms.any() > 0 : data = pms.read(64) if len(data) == 32 and data[0] == 0x42 and data[1] == 0x4D : pm10 = data[8] << 8 | data[9] print(pm10)
공기청정기를 사용해 보자
공기청정기 제어하기 • 자작 공기청정기 • 12V 팬으로 작동 •
TR회로 + PyBoard의 GPIO
공기청정기 동작 영상
TR회로
PWM 제어란? • 펄스 폭 제어(Pulse Width Modulation) • 12V를
1초 단위로 On / Off한다면? • 만약 0.001초 단위라면? • 약 6V
PWM 제어 from pyb import Pin from pyb import Timer
fan_pin = Pin.cpu.C6 tim = pyb.Timer(8, freq=100) # 8번 타이머, 100Hz로 설정 purifier = tim.channel(1, Timer.PWM, pin=fan_pin, pulse_width=2000) # PWM 설정 purifier.pulse_width_percent(70) # 70%의 세기, 약 8.4V purifier.pulse_width_percent(85) # 85%의 세기, 약 10.2V purifier.pulse_width_percent(100) # 100%의 세기, 12V purifier.pulse_width_percent(0) # off
온습도가 마음에 들지 않는다
적당한 온습도? • 나는 적당한데 다른 사람은 덥다고 한다. •
나는 건조한데 옆에서는 괜찮다고 한다. • 측정해 보자!
DHT22 • ± 0.5℃, ± 2%의 정밀도 • 펄스출력 사용
• 내장함수가 있다. • 현재 펌웨어에선 사용 불가
함수를 만들까? 펌웨어 업데이트?
펄스 출력 이미지 출처 http://www.electronicwings.com/sensors-modules/dht11
함수를 만들자 • 2일간의 삽질 • 그냥 펌웨어 업데이트를 하자
펌웨어 업데이트 하기 • Dfu-util v0.9 사용(업데이트 툴) • Hand-made
PYBv3 1.9.4 펌웨어
내장 함수를 사용해 보자 from pyb import Pin import dht
dht_pin = Pin.cpu.B8 dht_sensor = dht.DHT22(dht_pin) dht_sensor.measure() temperature = dht_sensor.temperature() humidity = dht_sensor.humidity() print(temperature) # ex) 32.4 print(humidity) # ex) 80.4
나에게 맞는 온도는? (여름편) • 30도 -> 면 티가 어디있지
주섬주섬 • 31도 -> 선풍기를 틀자 • 32도 -> 샤워 후 선풍기와 있으면 OK • 33도 -> 에어컨 사고 싶다. 아이스 팩이나 가져와야지 • 34도 -> 1번 봤다.
나에게 맞는 습도는? (여름편) • 50% -> 안구건조증이 재발한다 •
60% -> 적-당 • 70% -> 찝찝하다 • 80% -> 으아아아아아아아아아아
온습도를 조절해 보자
선풍기 제어하기 • 스마트 플러그 사용(BroadLink) • Python Library가 있음
동작 예시
라즈베리파이에서 제어 • pip install broadlink import broadlink broadlink.setup('ssid', 'passwd',
3) # setup wifi devices = broadlink.discover(timeout=5) # find devices sp2.auth() # get device data sp2.set_power(True) # power on sp2.set_power(False) # power off
겨울을 대비해 보자
가습기 제어하기 • 자작 가열식 가습기 • 150W 카트리지 히터를
사용 • SSR + PyBoard의 GPIO
카트리지 히터 • 높은 저항을 가진 와이어가 내장 • 와이어의
발열을 이용한 히터 이미지 출처 https://www.researchgate.net/figure/Watlow-C1A-9602-Cartridge-Heater-27_fig9_266737700
SSR(반도체 릴레이) • 릴레이 : 일종의 전자 스위치 • 작은
제어신호로 높은 전압 제어 가능 • 빠른 반응속도 • 수명이 길다. • 노이즈가 적다. • 비싸다.
SSR On/Off 예시
SSR 회로
SSR On/Off from pyb import Pin ssr_pin = Pin.cpu.C7 ssr
= Pin(ssr_pin, Pin.OUT_PP) ssr.high() # relay on ssr.low() # relay off
서버 만들기
서버의 역할 • PyBoard(노드)와 통신 • 외부와 통신 • 데이터
저장 • 아주 약간의 똑똑함 RPi
왜 RPi 인가? • GPIO를 가지고 있다. • 네트워크 연결이
쉽다. • 싸다.
어떻게 통신할 것인가?
어떻게 통신할 것인가? • 집 안에서 사용 • 무선이면 좋겠다
• esp8266(NodeMCU)을 활용
esp8266 준비하기 • AT 커맨드로 제어(TTL 레벨의 시리얼 통신) •
펌웨어 : ai-thinker-v1.1.1-115200 • ESP8266Flasher 사용
UDP 통신을 해보자
PyBoard에서 보내기 def send_udp(serial, text) : send_command(serial, 'AT+CIPSEND=' + str(len(text)+2
)) send_command(serial, text) def send_command(serial, message, get_read = False): message += '\r\n' serial.write(message) if get_read : response = serial.read(serial.any()) return response
PyBoard에서 받기 def read_serial(serial, timeout = 3, time_wait = 0.5):
time.sleep(time_wait) start_time = pyb.millis() while True : available_count = serial.any() now_time = pyb.millis() if available_count != 0 or start_time + (timeout * 1000) < now_time : break if available_count != 0 : buffer_read = serial.read(available_count).decode("utf-8") buffer_return = list(None, buffer_read.replace('\r','').split('\n')) return buffer_return else : return None
RPi에서 받기 data, addr = sock.recvfrom(128) print(data) # ex) b'reg,192.168.0.22,8000,d\r\n’
RPi에서 보내기 get_sensor_text = 'get,' + board_type sock.sendto(get_sensor_text.encode(), (board_ip, board_port))
프로토콜
센서 혹은 하드웨어 type • 온도 t • 습도
h • 미세먼지 d • 가습기 r • 공기청정기 p • 스마트 플러그 - sp
RPi에 PyBoard 등록 • UDP 통신에 사용할 ip, port, 센서
혹은 하드웨어의 type • reg,ip,port,type ex)reg,192.168.0.22,7100,h
RPi -> PyBoard • RPi에서 PyBoard 데이터 요청 • get,type
• PyBoard에서 RPi로 응답 • get,type,value,OK ex)get,h ex)get,h,80.4,OK
RPi -> PyBoard • RPi에서 PyBoard 하드웨어 설정 • set,type,state,value
• PyBoard에서 RPi로 응답 • set,type,state,value,OK ex)set,p,on,1 ex)set,p,on,1,OK
DB에 저장하기
DB 사용하기 • SQLAlchemy 사용 • PyBoard 목록 관리(ip, port,
type) • 센서 값 저장(ip, type, value, time)
등록된 PyBoard
저장된 센서값
crontab 사용하기 * * * * * python3 /home/pi/pycon2018/get_sensor_value.py >>
~/pycon2018/get_sensor_value.py.log 2>&1
그래프로 보기
텔레그램 봇 추가하기
텔레그램 봇 사용하기 • Command 명령어 사용(/get, /set) • Inline
Keyboard 기능 사용
실시간 값 불러오기 • /get 명령어 • 원하는 값 선택하기
하드웨어 제어하기 • /set 명령어 • 원하는 값 선택하기 •
연결할 곳 선택하기 • 원하는 상태 선택하기
업그레이드
측정하기 • 라돈 • CO2 • 용존산소량 • 토양 수분
제어하기 • 에어컨 • 전기장판(혹은 보일러) • 조명 • 가스
Q & A