Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PyconKR 2018 Python으로 나만의 IOT 구축하기

0d0025effabb26d62072842c9aa99eba?s=47 Bill-Park
August 17, 2018

PyconKR 2018 Python으로 나만의 IOT 구축하기

Pycon KR 2018 Python으로 나만의 IOT 구축하기에 사용한 발표 자료입니다.

0d0025effabb26d62072842c9aa99eba?s=128

Bill-Park

August 17, 2018
Tweet

Transcript

  1. Python으로 나만의 IOT 구축하기 미세먼지, 온습도편 Bill Park

  2. None
  3. None
  4. 목차 1. Pyboard란? 2. 미세먼지 수치가 높다! 3. 온습도가 마음에

    들지 않는다! 4. 라즈베리파이로 서버 만들기 5. 텔레그램 봇 추가하기
  5. PyBoard?

  6. PyBoard란? • MicroPython이 구동되는 개발용 보드 • REPL을 통해 프로그래밍

    가능 • Raw REPL 모드로 스크립트 실행 가능 • Micro sd안의 스크립트 실행 가능
  7. 성능은? • 168MHz의 CPU • 1024KB의 플래쉬 롬 • 192KB의

    램 • 94KB의 Python 스크립트 저장공간 • 최대 64GB Micro sd 지원
  8. 어떤걸 살까? 공식 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
  9. 왜 카피보드인가 • 동일한 성능 • 싼 가격

  10. 미세먼지 수치가 높다!

  11. 미세먼지 수치가 높다! • 연일 최고치를 찍는다. • 일기예보 수치를

    못믿겠다. (공원이나 건물위에 측정기가 있다.) • 지금 이곳의 수치를 알고싶다. 이미지 출처 http://www.kyongbuk.co.kr/?mod=news&act=articleView&idxno=1014380
  12. 미세먼지 센서를 사용해 보자

  13. PMS5003 • 레이저 측정방식 • 최소 0.3 측정 가능 •

    TTL 레벨(3.3V)의 시리얼 통신 사용 • passive 모드 지원 (active모드는 버퍼에 쌓인다)
  14. 실측결과 • 10, 단위 ∶ /* • 부산 모 공항

    : 52 • 서울 모 대학 : 31 • 서울 모 카페 : 50 • 깨끗한 거실 : 9 • 납땜 직후 방 : 95
  15. 값을 받아오려면? #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)
  16. 공기청정기를 사용해 보자

  17. 공기청정기 제어하기 • 자작 공기청정기 • 12V 팬으로 작동 •

    TR회로 + PyBoard의 GPIO
  18. 공기청정기 동작 영상

  19. TR회로

  20. PWM 제어란? • 펄스 폭 제어(Pulse Width Modulation) • 12V를

    1초 단위로 On / Off한다면? • 만약 0.001초 단위라면? • 약 6V
  21. 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
  22. 온습도가 마음에 들지 않는다

  23. 적당한 온습도? • 나는 적당한데 다른 사람은 덥다고 한다. •

    나는 건조한데 옆에서는 괜찮다고 한다. • 측정해 보자!
  24. DHT22 • ± 0.5℃, ± 2%의 정밀도 • 펄스출력 사용

    • 내장함수가 있다. • 현재 펌웨어에선 사용 불가
  25. 함수를 만들까? 펌웨어 업데이트?

  26. 펄스 출력 이미지 출처 http://www.electronicwings.com/sensors-modules/dht11

  27. 함수를 만들자 • 2일간의 삽질 • 그냥 펌웨어 업데이트를 하자

  28. 펌웨어 업데이트 하기 • Dfu-util v0.9 사용(업데이트 툴) • Hand-made

    PYBv3 1.9.4 펌웨어
  29. 내장 함수를 사용해 보자 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. 나에게 맞는 온도는? (여름편) • 30도 -> 면 티가 어디있지

    주섬주섬 • 31도 -> 선풍기를 틀자 • 32도 -> 샤워 후 선풍기와 있으면 OK • 33도 -> 에어컨 사고 싶다. 아이스 팩이나 가져와야지 • 34도 -> 1번 봤다.
  31. 나에게 맞는 습도는? (여름편) • 50% -> 안구건조증이 재발한다 •

    60% -> 적-당 • 70% -> 찝찝하다 • 80% -> 으아아아아아아아아아아
  32. 온습도를 조절해 보자

  33. 선풍기 제어하기 • 스마트 플러그 사용(BroadLink) • Python Library가 있음

  34. 동작 예시

  35. 라즈베리파이에서 제어 • 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
  36. 겨울을 대비해 보자

  37. 가습기 제어하기 • 자작 가열식 가습기 • 150W 카트리지 히터를

    사용 • SSR + PyBoard의 GPIO
  38. 카트리지 히터 • 높은 저항을 가진 와이어가 내장 • 와이어의

    발열을 이용한 히터 이미지 출처 https://www.researchgate.net/figure/Watlow-C1A-9602-Cartridge-Heater-27_fig9_266737700
  39. SSR(반도체 릴레이) • 릴레이 : 일종의 전자 스위치 • 작은

    제어신호로 높은 전압 제어 가능 • 빠른 반응속도 • 수명이 길다. • 노이즈가 적다. • 비싸다.
  40. SSR On/Off 예시

  41. SSR 회로

  42. 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
  43. 서버 만들기

  44. 서버의 역할 • PyBoard(노드)와 통신 • 외부와 통신 • 데이터

    저장 • 아주 약간의 똑똑함 RPi
  45. 왜 RPi 인가? • GPIO를 가지고 있다. • 네트워크 연결이

    쉽다. • 싸다.
  46. 어떻게 통신할 것인가?

  47. 어떻게 통신할 것인가? • 집 안에서 사용 • 무선이면 좋겠다

    • esp8266(NodeMCU)을 활용
  48. esp8266 준비하기 • AT 커맨드로 제어(TTL 레벨의 시리얼 통신) •

    펌웨어 : ai-thinker-v1.1.1-115200 • ESP8266Flasher 사용
  49. UDP 통신을 해보자

  50. 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
  51. 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
  52. RPi에서 받기 data, addr = sock.recvfrom(128) print(data) # ex) b'reg,192.168.0.22,8000,d\r\n’

  53. RPi에서 보내기 get_sensor_text = 'get,' + board_type sock.sendto(get_sensor_text.encode(), (board_ip, board_port))

  54. 프로토콜

  55. 센서 혹은 하드웨어 type • 온도 ­ t • 습도

    ­ h • 미세먼지 ­ d • 가습기 ­ r • 공기청정기 ­ p • 스마트 플러그 - sp
  56. RPi에 PyBoard 등록 • UDP 통신에 사용할 ip, port, 센서

    혹은 하드웨어의 type • reg,ip,port,type ex)reg,192.168.0.22,7100,h
  57. RPi -> PyBoard • RPi에서 PyBoard 데이터 요청 • get,type

    • PyBoard에서 RPi로 응답 • get,type,value,OK ex)get,h ex)get,h,80.4,OK
  58. 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
  59. DB에 저장하기

  60. DB 사용하기 • SQLAlchemy 사용 • PyBoard 목록 관리(ip, port,

    type) • 센서 값 저장(ip, type, value, time)
  61. 등록된 PyBoard

  62. 저장된 센서값

  63. crontab 사용하기 * * * * * python3 /home/pi/pycon2018/get_sensor_value.py >>

    ~/pycon2018/get_sensor_value.py.log 2>&1
  64. 그래프로 보기

  65. 텔레그램 봇 추가하기

  66. 텔레그램 봇 사용하기 • Command 명령어 사용(/get, /set) • Inline

    Keyboard 기능 사용
  67. 실시간 값 불러오기 • /get 명령어 • 원하는 값 선택하기

  68. 하드웨어 제어하기 • /set 명령어 • 원하는 값 선택하기 •

    연결할 곳 선택하기 • 원하는 상태 선택하기
  69. 업그레이드

  70. 측정하기 • 라돈 • CO2 • 용존산소량 • 토양 수분

  71. 제어하기 • 에어컨 • 전기장판(혹은 보일러) • 조명 • 가스

  72. Q & A