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.7k
PyconKR 2018 Python으로 나만의 IOT 구축하기
Pycon KR 2018 Python으로 나만의 IOT 구축하기에 사용한 발표 자료입니다.
Bill-Park
August 17, 2018
Tweet
Share
Other Decks in Programming
See All in Programming
Go コードベースの構成と AI コンテキスト定義
andpad
0
140
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
0
270
tparseでgo testの出力を見やすくする
utgwkk
2
280
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
0
160
Context is King? 〜Verifiability時代とコンテキスト設計 / Beyond "Context is King"
rkaga
10
1.4k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
320
AIコーディングエージェント(Manus)
kondai24
0
210
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
630
Patterns of Patterns
denyspoltorak
0
300
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
280
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
410
AIの誤りが許されない業務システムにおいて“信頼されるAI” を目指す / building-trusted-ai-systems
yuya4
6
3.9k
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
37
7.1k
A Tale of Four Properties
chriscoyier
162
23k
Done Done
chrislema
186
16k
Become a Pro
speakerdeck
PRO
31
5.7k
Utilizing Notion as your number one productivity tool
mfonobong
2
190
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
27
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Odyssey Design
rkendrick25
PRO
0
430
Designing Experiences People Love
moore
143
24k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
6.7k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
286
14k
New Earth Scene 8
popppiees
0
1.2k
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