미세먼지 IoT ‘Tob’
하나님이 이르시되 빛이 있으라 하시니 빛이 있었고 빛이 하나님이 보시기에 좋았더라 (창 1:4-5)
히브리어 Tob(טוב)는 ‘좋다, 아름답다, 온전하다, 선하다’는 의미.
Members
김하준, 송다혜, 이지선
Background
전세계적으로 미세 먼지가 사회적 문제로 떠올라 마스크를 쓰고 다니는 사람을 거리에서 어렵지 않게 발견할 수 있다. 하지만 실내 미세먼지에 대한 경각심은 아직 미미한 수준이다. 세계보건기구(WHO)에 따르면 전 세계에서 공기오염 영향으로 조기 사망한 700만명 중 61%가 특히 실내 공기오염에 영향을 받은 것으로 나타났다. 또한 미국 환경보호청(EPA)은 실내 공기를 현대인의 건강을 위협하는 5대 요인 중 하나로 꼽았다. ‘Tob’는 개인이 일상 속에서 지속적이고 정확하게 실내 미세 먼지 정보를 알 수 있도록 실내 미세 먼지를 실시간 측정하여 직관적으로 정보를 제공하는 IoT 제품이다. 사용자는 제품을 통해 실내와 실외 미세먼지 정보를 비교하여 실내의 환기 여부도 결정할 수 있다.
Concept
‘Tob’의 가장 큰 특장점은 제품 외형에 제약이 없는 것이다. 사용자는 본인이 원하는 건축물이나 상징물로 형태를 선택할 수 있다. 이는 기존 제품들의 고정적 틀에서 벗어나 사용자가 직접 제품 제작에 참여하여 재미의 요소를 더하고 제품의 가치를 높이고자 의도되었다. 프로토타입은 ‘한동대학교 효암 채플’ 모델로 전체 규격 32 × 8 × 22 cm로 제작되었다.
제작 시행착오
- 층층이 끼워지는 부분이 레이저 커팅으로 조금 더 태워져 두께가 달라져 헐거워지는 문제가 있다. 레이저 커팅을 하면서 생기는 오차를 고려해야 한다.
- 서로 다른 면을 결합하는 부분이 너무 좁은 간격으로 만들어 단단히 결합되기 위해서는 다른 장치를 유지해야 한다.
- 글씨를 파내기 위해서는 ㅁ,ㅂ,ㅇ,ㅍ,ㅎ과 같은 자음의 이어지는 부분을 고려하여 이음선을 만들어 주어야 한다.
- 곡선 부분을 표현하기 위해 총 길이를 예상하여 측정하여야 하는데 우리의 도면 같은 경우에는 정확한 원주의 일부 길이를 측정하기 어렵다. 그리하여 우리는 먼저 몸체 부분을 커팅하여 구부러진 부분을 감싸 실측하였다.
미세먼지 앱 ‘오늘’
사용자에게 실시간 미세먼지 정보를 제공하고 연동된 IoT 기기 ‘Tob’의 손쉬운 조작을 제공하는 어플이다.
-
미세먼지
국가공공데이터를 활용해 미세먼지 데이터를 실시간으로 불러와 상황에 맞는 디자인 인터렉션과 경고 문구를 띄워준다.
-
실내정보
실내 미세먼지 측정 IoT 기기인 ‘Tob’와 연동하여 실내 미세먼지 데이터를 직접 받아와 실내 공기 정보에 대한 안내 문구를 띄워준다.
-
위젯설정
사용자가 바깥 미세먼지 정보를 빠르고 편하게 알 수 있도록 심플하면서 직관적인 위젯 기능을 제공한다. 위젯에 사용될 아이콘 스타일이나 색상, 글씨크기를 조절할 수 있다.
-
제품설정
사용하는 제품과 연동하여 on/off를 원격 조정한다. 또한, 조명의 색상 타입도 조절이 가능하다.
Marvel prototype ‘오늘’ 체험해보기
미세먼지와 HUE 연동하는법
0. Introduction
이 설명서는 미세먼지 공공데이터를 google sheet로 받아오는 법을 먼저 숙지해야 한다. 마찬가지로 라즈베리 파이를 통해 실기간 미세먼지 농도를 측정하는 방법도 먼저 숙지해야 한다. 불빛을 통해 미세먼지 데이터를 사람들에게 시각적으로 전달하기 위하여 시도한 방법이다.
- 라즈베리 파이를 통해 실시간 미세먼지 농도 측정한 값을 HUE 와 연동하는 법 설명서
- 미세먼지 공공 데이터를 HUE 로 가져오는 방법 설명서
(just in case…) 모든 코드는 cmd (terminal)창에서 진행된다. 파일이 설치된 위치에 들어가서 python3 파일이름.py로 실행한다.
1. 라즈베리 파이를 통해 실시간 미세먼지 농도 측정한 값을 HUE 와 연동하는 법 설명서
라즈베리 파이를 통해 실기간 미세먼지 농도를 측정하는 방법은 이곳에서 설명하지 않는다. 이 곳에서 중점적으로 설명할 것은 HUE와 인터넷과의 연동이다. 이 과정이 있어야 HUE가 연동이 되어, 데이터를 받아올 수 있으므로 필수로 참고해야 한다. python 코드와 HUE를 연동하기 위해서는 2가지의 과정이 필요하다.
- 인터넷과 HUE 연동하여 어플로 조작 가능하도록 하기
- Username과 Hue 전구의 번호를 받아와 python과 연동하기
아래는 연동 전 setting에 관한 유튜브 영상이다. 영상을 참고하면 충분히 파이썬 코드와 연동에 필요한 과정들을 수행 가능하다.
1. 인터넷과 HUE 연동하여 어플로 조작 가능하도록 하기
- 근처 wifi 위치를 확인한다.
- wifi에 아래의 사진과 같은 philps bridge를 연결한다. (philips hue 전구 박스를 확인하면 있다.)
- 플레이 스토어, app store에서 philips hue를 다운 받는다.
- 어플의 화면을 켜 연동을 확인한다.
- bridge 본체의 버튼을 누르라는 안내문이 어플에 나타나면 동그란 버튼을 눌러준다.
- 전구를 HUE에 등록한다.
2. Username과 Hue 전구의 번호를 받아와 python과 연동하기
b = Bridge("192.168.0.9", "fwVQGMv9TZ0bx1lXms6TVrgKs9-6YEGze3kEn42g")
lights = b.lights
light_num1 = 8
light_num2= 9
- 파이썬과 hue를 연동하기 위하여서는 총 ip 주소, username, light number가 필요하다. ip 주소를 받아오는 과정은 단순 공유기의 ip를 받아오는 것이 아니다. HUE 어플 내에서 따로 생성된 ip를 받아와야한다. 어플 내 하단 바의 설정 > Hue bridge 선택 하여 확인할 수 있다.
- username 을 받아오는 과정은 단순하다. 아래 코드를 수행하면 username 이 자동으로 프린트 된다. 프린트 된 유저네임을 복사하여 파이썬 코드의 username 위치에 작성하여주면 된다.
from qhue import create_new_username
username = create_new_username("192.168.0.8")
print(username)
- Light number을 받아오는 법은 생각보다 까다롭다. 어떠한 page에 들어가서 그곳에서 사용하는 문법으로 확인해봐야하는데 어렵지는 않지만, 이렇게까지 할 필요없이 0 (혹은 1) ~ 10 까지의 숫자를 넣어서 시도해보면 어렵지 않게 찾을 수 있을것이고, 대부분 처음 생성하는 light number은 1로, 그 후 추가되는 것은 숫자가 1 씩 증가할 것이다.
2. 미세먼지 공공 데이터를 HUE 로 가져오는 방법 설명서
미세먼지 공공 데이터를 구글 sheet로 업데이트 하는 과정은 이곳에서 설명하지 않는다. 아래사진과 같이 Sheet1에 미세먼지 데이터를 업데이트 했다고 가정해보자.
준비물
- 공공 데이터가 업데이트 된 구글 sheet
- 숫자 수치에 따라 빛의 밝기가 변하는 hue 코드
이 중 가장 최근의 데이터만을 받아오기 위하여 한 줄만 새로운 Sheet에 업데이트 한다.
이 새롭게 업데이트 된 한 줄을 “준비된 숫자 수치에 따라 빛의 밝기가 변하는 hue 코드”에 업로드 한다.
import urllib.request
url = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vT8zy7UI5D1Y-cvo5-19HVyOSapGmDa4S8Vt0H1v_tMPT2ZcQrfEubkQR8bGJkwMJHbECFqNMSyGvpn/pub?gid=1192547099&single=true&output=csv'
file_name = 'Hajun.csv'
urllib.request.urlretrieve(url, file_name)
csvfile = open(file_name, 'r')
lineList = csvfile.read().splitlines()
csvfile.close()
tmp1,tmp2,tmp3,tmp4,dust10,tmp5,tmp6,tmp7,tmp8 = lineList[2].split(",")
print("dust10", dust10)
dust10 = int(dust10)
아래는 업로드 된 코드에 대한 설명이다(urllib library에 대한 설명은 https://blog.naver.com/is_king/221461183877을 참고. 구동자체와는 큰 관계가 없으니 이해를 생략해도 상관없음).
-
url = ‘주소값’ 은 google sheet에서 본인의 주소값을 작성하면 된다. 단순한 변수이다. 이어지는 코드에서 url 변수는 모두 이 변수선언에 해당된 주소값이다.
-
file_name = 파일이름 은 설정하고자 하는 본인의 파일 이름이다. 마찬가지로 단순한 변수이다.
-
urllib.request.urlretrieve(url, file_name), 즉 urlretrieve 함수는 설정한 url 주소(선언된 변수)에서 파일명대로 파일을 다운로드(ex.웹상 jpg 파일 다운로드 등)하는 것이다. 해당에서는 파일 이름의 확장자명이 csv이므로 csv로 다운로드한다.
-
csvfile 변수에 ‘r’, 즉 read 모드로 연 파일을 저장한다.
-
그 후 linelist에 read 모드로 받아온 파일의 정보를 line 별로 나눠서(splitlines) 리스트화한다. 위의 경우에는 linelist에 [[latest data],[Y,N,D,H,미세먼지10,온도,습도,강수량,풍향], [2019,6,16,17,3,19.4,77,0,41]] 로 저장되어있다.
-
이 중 lineList[2].split(“,”) 즉 3번째 줄의 데이터를 , 를 기준으로 나눠서 선언된 tmp1, tmp2, tmp3, tmp4, dust10, tmp5, tmp6, tmp7, tmp8 에 저장한다. 이 중, 미세먼지 데이터는 5번째로 ‘3’ 이 dust10 에 저장되었다. 저장된 정보는 string type이다.
-
따라서 숫자로 변환하여 주기 위하여 int(dust10)을 하여 인트형으로 변환한다.
그 후,
if dust10 < 1:
b.lights(light_num1, 'state', bri=255, hue=45000, sat=255) #blue
b.lights(light_num2, 'state', bri=255, hue=45000, sat=255) #blue
“준비된 숫자 수치에 따라 빛의 밝기가 변하는 hue 코드” 의 변수 대입 정보를 변경하여 반영시킨다.