smart mirror project [day 10]
DIY IOT - smart mirror project이제는 day 10이라고 하기엔 너무 민망할 정도로 꽤 오래 끌긴 했습니다마는... (이보게 처음 착수한 게 두 달 전일세...)
띄엄띄엄 하다보니 4월 28일, 열흘째.
...어쩌면 이것이 완성이라고 할 수도 있는, 뭐 그런 것일까?
드디어 모든 재료를 득템하시었다. 일단 거울 뒤에 두꺼운 하드보드지(;;;)를 대기로 했고 흰색, 노란색, 검정색을 모두 대조해봤다.
결과적으로 온전히 거울의 역할을 하기엔 역시 검정색이 제격인 걸로 판단! 노란색 1500원짜리 하드보드지여 안녕. 기분 우울할 때 노란색을 보면 좋다던데, 이 하드보드지는 그런 용도로 쓰기로...
그리고 조립... 혹은 일종의 시공 같은 것이 시작되었다. 이렇게. 그러니까 이분들은 거울의 뒷면이 되는 셈이다.
참고로 말씀드리자면, 생각보다 뭔가 잘 안 붙는다. 공간도 뜨고. 어쩌면 전기과 내지 기계과 나온 분들이 '전선을 저렇게 붙이다니'라면서 학을 뗄 지도... (비판을 겸허히 받아들일테니 이사람에게 댓글로 조언을...ㅎㅎ 어찌 고정+정리하오리까..)
라즈베리파이는 보드판을 대서 내사랑 3M 고리걸이테이프- 일명 찍찍이로 고정했다. 엄청 찍찍해서(?) 절대 떨어질 친구가 아니다.
아 이 번잡한 자태. 사실 부착을 어떻게 해야할지 몰라 꽤 고민했다. 아무튼 했고, 뭐 터질 일(?)만 없다면 이대로 냅두는 게 나을 것 같기도 하다...
그래서 앞면 드디어 개봉 박두!
놀랍게도 화면이 들어와있는 상태다. 세상에. 이건 거의 매직아이 수준인데, 내 눈엔 라즈베리파이 구동 화면이 보인다. ㅋㅋㅋ 가상현실 같나. 왜이런고 보니 모니터 밝기 자체가 50% 에 불과한 초기 모드여서, 이걸 100%까지 올렸다. 그리고 주변의 조명을 살짝 낮추고... (불을 완전히 끄면 참 잘 보일텐데, 그럼 내 얼굴이 안 보이겠지...)
이제 보이는가! 아, 이거 하느라 살이 다 빠져서 턱라인이 드러났... 은 농담이고, 어젯밤에 잠을 설쳤다. (근황은 필요없...)
아무튼, 색상이 여전히 연하디 연하여 아래의 뉴스와 날씨는 사실상 안 보인다고 봐야 한다. 따라서 이 모든 GUI 색상을 바꾸고, 화면 자체를 하얀색으로 바꾸는 것이 가장 효율적일 것 같다.
더불어 완벽하게 전체화면이 된다면, 위에 라즈베리파이 바도 안 보이고 좋을텐데... 그러려면 html-javascript를 활용하는 편이 더 나았으려나 싶기도 하다. (나는 파이썬으로 해보고 싶었으니!)
이걸 어딘가 어둡고, 조명이 아래에서 비추며(영향이 있을까), 꽤 괜찮은 스팟에다가 설치해보려고 한다. 물론 코드도 바꿔야할테고. 아아, 무려 모니터가 절전모드까지 된다. 이건 어떻게 조절해야하지.
이제, 코드를 공개한다.
물론 여기서 아직도 고쳐야 할 게 많다. 위에서 말했듯 색깔도 그렇고, 아직 실시간으로 변하는 것이 제대로 작동하지 않는다. 더구나 최근 GUI배치를 이리저리 바꿨더니 별로 안 예뻐지기도 했다. UI도 넣을거다. 흐린 날은 예쁜 구름이 뜨고, 맑은 날은 햇님이 방긋 웃는 애니메이션도 첨가하고 싶다.
이렇듯 아직도 하고 싶은 게 참 많다.
일단 하긴 했다!!!!
>> 비용
나 같은 경우엔 위에도 썼다시피 연구실에 굴러다니는 것들(라즈베리파이 키트, 각종 케이블), 차후 구매 조건으로 받은 샘플 거울(실제로 구입도 했다) 등에서 돈을 꽤 아꼈다. 만일, 모든 것을 내가 샀다면, 아마 이정도 나오지 않았을까.
1. 라즈베리파이3 (요즘 나온 것을 사는 게 낫지 않겠나!) - 35불. 다만 초보자용 키트를 통째로 사는 게 좋을 것 같다. 스타트키트가 현재 10만원 선... 아 좀 비싸긴 비싸다. 파이2만 해도 7만원대였는데.
2. 모니터 - 알*익스프레스에서 싼 것을 고른 것이 우리돈 4만원쯤 했다. (앞에 day 8을 보시라) 대신 오래 기다려야한다. 한 2~3주 잊고 지내면 온다.
3. 원웨이미러 - 두 가지 종류가 있다. 코팅이 거울 뒷면에 된 것, 앞 면에 된 것. 나는 앞면에 된 것을 골랐는데, 이게 뒷면 코팅보다 그나마 더 밝은 편이다. 참고로 앞면 코팅은 지문이 잘 묻어난다. 6만5000원에 운송비가 포함되는 경우도 있다. 유리라 택배로 배송이 안 돼 배송비가 상당히 비싸다. 공장에 가지러 간다고 하든 업체측과 잘 이야기를 해보든 하길 권한다.
4. USB 허브, wifi 동글, 무선 마우스, 키보드 등등은 알아서...
5. 각종 케이블과 재료들 (hdmi to hdmi, usb전원선, 모니터용 직류전원장치, 하드보드지, 접착용 테이프 등) - 이것저것하면 2~3만원 정도
>> 코드
여기저기서 가져오고 고치고 하느라 사실 크레딧 표시가 잘 안 됐다. 그저 이런 느낌으로 했다는 것만 참고해주시길.
import wx
import time
from urllib2 import urlopen
from json import loads
import codecs
from forecastiopy import *
class Total(wx.Frame):
def __init__(self, parent, id, title):
super(Total, self).__init__(parent, id, title, size=(800, 600))
font= wx.Font(24, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False,'Arial')
self.SetForegroundColour('#6DC9C9')
self.SetBackgroundColour('#4A4A4A')
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Centre()
self.Show()
dt = wx.DateTime()
self.seoul = wx.StaticText(self, -1, dt.FormatTime(), (20,20))
self.seoul.SetFont(font)
self.OnTimer(None)
self.timer=wx.Timer(self)
self.timer.Start(1000)
self.Bind(wx.EVT_TIMER, self.OnTimer)
self.Refresh()
def OnPaint(self, event):
dc = wx.PaintDC(self)
r = dc.GetFullTextExtent('M')
for i in xrange(3):
px, py = 20, 180+r[1]*i
dc.DrawText(title_list[i], px, py)
font1 = wx.Font(16, wx.FONTFAMILY_DEFAULT, wx.NORMAL, wx.NORMAL)
self.SetFont(font1)
dc.EndDrawing()
dc2 = wx.PaintDC(self)
k = dc2.GetFullTextExtent('M')
for j in xrange(3):
px, py = 20, 100+k[0]*j
dc2.DrawText(weatherlist[j], px, py)
dc2.EndDrawing()
def OnTimer(self, evt):
self.dt = wx.DateTime()
now= self.dt.Now()
self.seoul.SetLabel(' ' + str(now.Format(('%d %a %T'), wx.DateTime.GMT9)))
#news again
def call_the_articles():
url = 'http://api.nytimes.com/svc/topstories/v1/home.json?api-key=키는 본인이 받아서 쓰시길'
return loads(urlopen(url).read())
articles = call_the_articles()
def x():
l = []
#if __name__ == '__main__':
for story in articles['results']:
l.append(story['title'].encode('utf-8', 'replace'))
return l
title_list = x()
#weather forecast again
apikey = ' 이건 본인이 받아서 쓰시길 '
Seoul = [37.335887, 126.584063]
fio = ForecastIO.ForecastIO(apikey,
units=ForecastIO.ForecastIO.UNITS_SI,
lang=ForecastIO.ForecastIO.LANG_ENGLISH,
latitude=Seoul[0], longitude=Seoul[1])
def call_forecast():
a = []
if fio.has_daily() is True:
daily = FIODaily.FIODaily(fio)
a.append('In 24hrs : ' + unicode(daily.icon))
if fio.has_currently() is True:
currently = FIOCurrently.FIOCurrently(fio)
a.append('Now : ' + unicode(currently.icon) + ' ' + unicode(currently.temperature) + ' C')
a.append(unicode(daily.summary))
return a
weatherlist = call_forecast()
#call
def main():
ex = wx.App()
Total(None, -1, 'good')
ex.MainLoop()
if __name__ == '__main__':
main()
'DIY IOT - smart mirror project' 카테고리의 다른 글
smart mirror project [day 11] (3) | 2016.05.04 |
---|---|
smart mirror project [day 9] (0) | 2016.04.18 |
smart mirror project [day 8] (0) | 2016.04.12 |
smart mirror project [day 7] (0) | 2016.03.28 |
smart mirror project [day 6] (0) | 2016.02.25 |