Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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.6k
PyconKR 2018 Python으로 나만의 IOT 구축하기
Pycon KR 2018 Python으로 나만의 IOT 구축하기에 사용한 발표 자료입니다.
Bill-Park
August 17, 2018
Tweet
Share
Other Decks in Programming
See All in Programming
社内活動の取り組み紹介 ~ スリーシェイクでこんな取り組みしてます ~
bells17
0
390
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
1
130
useSyncExternalStoreを使いまくる
ssssota
2
450
似たもの同士のPerlとPHP
uzulla
1
110
Symfony Mapper Component
soyuka
2
590
As an Engineers, let's build the CRM system via LINE Official Account 2.0
clonn
1
640
Cognitoが大型アップデート!Managed Loginとパスワードレスログインを実際に使ってみた@しむそくRadio Special Day1
tmhirai
3
270
DevTools extensions で 独自の DevTool を開発する | FlutterKaigi 2024
kokiyoshida
0
450
Full stack testing :: basic to basic
up1
1
890
Criando Commits Incríveis no Git
marcelgsantos
2
150
複雑な仕様に立ち向かうアーキテクチャ
myohei
0
130
Refactor your code - refactor yourself
xosofox
1
170
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.4k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
Thoughts on Productivity
jonyablonski
67
4.3k
Facilitating Awesome Meetings
lara
50
6.1k
Automating Front-end Workflow
addyosmani
1366
200k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
Documentation Writing (for coders)
carmenintech
65
4.5k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
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