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

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

Bill-Park
August 17, 2018

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

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

Bill-Park

August 17, 2018
Tweet

Other Decks in Programming

Transcript

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

    들지 않는다! 4. 라즈베리파이로 서버 만들기 5. 텔레그램 봇 추가하기
  2. PyBoard란? • MicroPython이 구동되는 개발용 보드 • REPL을 통해 프로그래밍

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

    램 • 94KB의 Python 스크립트 저장공간 • 최대 64GB Micro sd 지원
  4. 어떤걸 살까? 공식 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
  5. 미세먼지 수치가 높다! • 연일 최고치를 찍는다. • 일기예보 수치를

    못믿겠다. (공원이나 건물위에 측정기가 있다.) • 지금 이곳의 수치를 알고싶다. 이미지 출처 http://www.kyongbuk.co.kr/?mod=news&act=articleView&idxno=1014380
  6. PMS5003 • 레이저 측정방식 • 최소 0.3 측정 가능 •

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

    : 52 • 서울 모 대학 : 31 • 서울 모 카페 : 50 • 깨끗한 거실 : 9 • 납땜 직후 방 : 95
  8. 값을 받아오려면? #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)
  9. PWM 제어란? • 펄스 폭 제어(Pulse Width Modulation) • 12V를

    1초 단위로 On / Off한다면? • 만약 0.001초 단위라면? • 약 6V
  10. 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
  11. 적당한 온습도? • 나는 적당한데 다른 사람은 덥다고 한다. •

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

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

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

    60% -> 적-당 • 70% -> 찝찝하다 • 80% -> 으아아아아아아아아아아
  16. 라즈베리파이에서 제어 • 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
  17. 카트리지 히터 • 높은 저항을 가진 와이어가 내장 • 와이어의

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

    제어신호로 높은 전압 제어 가능 • 빠른 반응속도 • 수명이 길다. • 노이즈가 적다. • 비싸다.
  19. 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
  20. esp8266 준비하기 • AT 커맨드로 제어(TTL 레벨의 시리얼 통신) •

    펌웨어 : ai-thinker-v1.1.1-115200 • ESP8266Flasher 사용
  21. 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
  22. 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
  23. 센서 혹은 하드웨어 type • 온도 ­ t • 습도

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

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

    • PyBoard에서 RPi로 응답 • get,type,value,OK ex)get,h ex)get,h,80.4,OK
  26. 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
  27. DB 사용하기 • SQLAlchemy 사용 • PyBoard 목록 관리(ip, port,

    type) • 센서 값 저장(ip, type, value, time)
  28. 하드웨어 제어하기 • /set 명령어 • 원하는 값 선택하기 •

    연결할 곳 선택하기 • 원하는 상태 선택하기