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.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
Amazon Bedrock Agentsを用いてアプリ開発してみた!
har1101
0
330
OSSで起業してもうすぐ10年 / Open Source Conference 2024 Shimane
furukawayasuto
0
100
EventSourcingの理想と現実
wenas
6
2.3k
Make Impossible States Impossibleを 意識してReactのPropsを設計しよう
ikumatadokoro
0
170
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
860
Content Security Policy入門 セキュリティ設定と 違反レポートのはじめ方 / Introduction to Content Security Policy Getting Started with Security Configuration and Violation Reporting
uskey512
1
530
GitHub Actionsのキャッシュと手を挙げることの大切さとそれに必要なこと
satoshi256kbyte
5
430
Ethereum_.pdf
nekomatu
0
460
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.1k
距離関数を極める! / SESSIONS 2024
gam0022
0
280
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
2
660
Realtime API 入門
riofujimon
0
150
Featured
See All Featured
A Philosophy of Restraint
colly
203
16k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
506
140k
A Tale of Four Properties
chriscoyier
156
23k
Practical Orchestrator
shlominoach
186
10k
For a Future-Friendly Web
brad_frost
175
9.4k
Writing Fast Ruby
sferik
627
61k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Designing for Performance
lara
604
68k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
120
Git: the NoSQL Database
bkeepers
PRO
427
64k
Building Applications with DynamoDB
mza
90
6.1k
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