livin' seberia

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만원 정도

------------------------------------------------------------------------------------------------------------------------------------
= 23만원 정도라고 생각하면 될 것 같다. 아이고 비싸다.


혹자는 이렇게 말했다. "장난감을 만드는 데엔 돈이 드는 법"이라고. 하지만 만들어 보는 것에는 분명 그만한 가치가 있다. 개인적으론 이런 저런 코드 짜보고 짱구 굴리고, 스파크 튀는 것도 구경하고(ㄷㄷ) 예쁘게 조립도 해보면서 꽤 많은 걸 배웠다. 일단 뭐든 완성은 해봐야한다. (그렇게 치면 이건 아직 미완오브 미완이지만 ㅠㅠ 차근차근 더 보완해갈테다!!!) 



>> 코드

여기저기서 가져오고 고치고 하느라 사실 크레딧 표시가 잘 안 됐다. 그저 이런 느낌으로 했다는 것만 참고해주시길. 

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