Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PyconKR 2018 Python으로 나만의 IOT 구축하기
Search
Bill-Park
August 17, 2018
Programming
1.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PyconKR 2018 Python으로 나만의 IOT 구축하기
Pycon KR 2018 Python으로 나만의 IOT 구축하기에 사용한 발표 자료입니다.
Bill-Park
August 17, 2018
Other Decks in Programming
See All in Programming
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
210
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
140
golang-bob.pdf
iwatsukayura
0
130
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
290
contenteditable と日本語入力に向き合う
colorful12
0
200
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
0
500
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
260
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
2
650
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
250
Featured
See All Featured
Amusing Abliteration
ianozsvald
1
350
Evolving SEO for Evolving Search Engines
ryanjones
0
330
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
620
First, design no harm
axbom
PRO
2
1.3k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.2k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Design in an AI World
tapps
1
350
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