攻略:如何用一天時間做一個開源版的Nest
英文原文:Building an open source Nest
上周科技界最大的新聞恐怕就是谷歌花了 32 億美刀收購了大名鼎鼎的智能設備公司 Nest。它的兩款產品(智能溫控器和煙霧探測器)以優秀的工業設計和顛覆性的功能為人稱道。更重要的是,Nest 向我們展現了什么才是用戶想要的“物聯網”產品。
不過,Nest 固然好,在中國想要得到它可不容易。它在淘寶上的價格高達 1200+ 人名幣。不過不用擔心,在這個創客橫行的時代,神馬硬件都是浮云。買不到?太貴?不用擔心,我們來自己動手做一個。
來自于開源硬件領域的 Spark 已經利用自家的產品把這事搞定了,而且只是 3 個工程師花了一天的時間,成本也不過幾十美金。讓我們一起來看看他們是怎么做到的。
1. 硬件部分
先來看看我們都需要哪些零件:
- 主控板,Spark Core;
- 溫度顯示屏,Adafruit 8x8 LED 矩陣,接口是通用 I2C 總線;
- 主傳感器是 Honeywell Humidlcon 的溫度濕度傳感器,和顯示屏共享 I2C 總線;
- 我們可以暫時利用 LED 燈來代替我們的空調;
- 你需要讓設備知道什么時候有人在家,我們選用 Panasonic PIR motion detector;
- 外殼;
(注:這些零件除了 Spark Core 之外,你在淘寶上都可以輕松找到,價格也會便宜不少。Spark Core 可以考慮用 Arduino + Wi-Fi 模塊來代替,不過程序部分可能會麻煩不少。)
搞定上述零件(除了外殼)后,我們需要把這些東西都用面包板連接起來,這個過程需要大概 1 個小時。使用面包板能夠幫你快速制作出第一版的產品原型,而且便于修改。
下一步,是給我們的“Nest”做一個外殼。官方外殼的材質采用的是玻璃和鋁的材質,這兩種材料質感不錯但是不方便在家里加工。我們選用木材和亞克力板來代替。
首先,我們用 CNC 來加工兩塊木頭,一個作為固定的基座,另一個則是可以自由旋轉的調溫裝置,順時針轉調高溫度。接下來,用激光切割機加工三塊亞克力板,一塊是正面顯示溫度 的面板,一塊是背面固定在墻面上的安裝板,第三塊連接在可以旋轉的那塊木頭上,使其成為一個電位器。
一旦我們完成了外殼,我們就需要把所有的面包板零件都塞進去,調整一下零件的布局,用焊接的方式固定電路。
2. 軟件部分(Spark 團隊已經將所有代碼上傳至 Github)
調溫器的程序(又稱固件)需要實現從傳感器讀取數據、控制繼電器和在屏幕上顯示溫度等等功能。同時,我們還需要一個無線信號接收器,以便遠程從 手機或電腦上來控制溫度。 當然,調溫器還要實現基本的機器學習的功能,以便它能夠根據人是否在家而自動控溫,這部分代碼需要跑在云端上。
之所以稱這部分軟件為“固”件,是因為相對其他軟件而言,這部分代碼除了研發團隊外,在用戶使用過程中基本上不會再接觸到。如果我們讓設備能夠聯網,就能通過遠程讓固件升級,方便迭代。如果你使用了 Spark Core,就可以通過他們的在線 IDE 來更新代碼。
調溫器的控制部分是通過一個在線云端 App 來實現的。所以,我們可以改用迭代更快的 Ruby on Rails 來搞定程序,而不是麻煩的嵌入式 C。Spark Cloud 通過自帶的 REST API 來連接設備,這意味著你可以將其嵌入到任何可以產生 HTTP request 的程序中,基本上所有語言都可以做到這一點。用戶界面是一個 web app,你可以通過上面的 javascript 來選定你想要的溫度。同時,在頁面下方會生成一個歷史溫度的曲線圖。
3. 連接
如果你分別搞定了硬件和軟件,最簡單的把它們連接起來的方法就是通過一個 Wi-Fi 模塊,這樣就可以讓你的產品成為一個本地 Wi-Fi 的終端。Spark Core 自帶 Wi-Fi 模塊,并且因為其內置的微處理器,連接變得非常容易。Spark Core 能自動通過加密通道連接 Spark Cloud,你無須再額外構建代碼來操作 Wi-Fi 模塊,或者是適配通訊協議。
4. 組裝
現在,調溫器的所有部分都已將完成了,下一步就是把這些零件都塞進我們的木頭外殼中,再把它固定在墻上。想必大家在這部分都不會花太多時間。裝配好之后,我們的 Nest 就算正式完成啦!
整個制作過程花費了 70 美金(其中,Spark Core 39 美金);木材和亞克力板很容易找到。時間上,3.5 個工程師從第一天上午十點搞到第二天凌晨 3 點半(有一個人提前上床睡覺去了)。提前做的工作只是去訂購一些電子元件。
另外, Spark 團隊強調,這篇文章的目的并不是說任何人都可以在一天時間內創立一家價值 32 億美金的公司……但是,現在這事已經變得沒那么難了。
“所有的巨頭都來自于一開始幾百塊錢的產品原型。”所以,你還在等什么?
<span id="shareA4" class="fl"> </span>
</div>