🚧 博客連接:用 Node.js 給樹莓派寫了個控制檯 | Amber前端
大一的時候就買了不少樹莓派,由於那時候還啥也不會,就大部分時間放在角落裏吃灰。最近考古看到一篇外國老哥用樹莓配搭建 Hadoop 集羣的文章,就把樹莓派拿出來從新改造了一下,做爲智能家居中心使用。好在當初就是用 lego 搭的外殼,如今要翻修也很容易,已經搗鼓以後看起來就像下面那樣。爲了能在 iOS
上用 HomeKit
控制家裏的幾個小米的智能燈,我選擇了 HomeAssistant 做爲智能家居中心,但樹莓派的散熱就成了個問題。node
雪乃坐鎮保佑不出 bugexpress
原本買樹莓派的時候就帶了風扇,但都是直接插在樹莓派的供電接口上的,也就是說,3.3v
供電的 GPIO
引腳是無法驅動 5v
工做電壓的風扇的,並且另外一方面這小風扇很是吵,並且成天整晚的開着承軸受不了(已經掛了一個了),因此我就去萬能的某寶買了一個建準的磁懸浮風扇,6cm
的風徑能夠給兩個樹莓派同時散熱。事實證實磁懸浮風扇果真名不虛傳,風量大還真的一點聲音都沒有。但爲了延長承軸壽命,仍是要設計一套能夠經過編程控制的風扇控制程序。apache
通過一番搜索,我參考了這篇文章。上面已經說過了,3.3v
的 GPIO
是無法直接給風扇供電的,因此我選擇了博文中的三極管方案,設計了這樣的電路:編程
在線的 CircuteLab 沒有
motor
,用lamp
將就一下吧bootstrap
我和博文中同樣選擇了 S9012
的 PNP
型三極管,風扇正極與樹莓派 5v
引腳相連,負極與三極管發射極相連,三極管基極與你想要使用的 GPIO
引腳(好比我這裏就是 8
號引腳 (GPIO 14
)) 相連,集電極接地便可。參考下面的樹莓派引腳圖:後端
⚠️ 注意
rpio
的引腳編號和實際的gpio
端口號不徹底對應,下面會講到瀏覽器
接下來,經過 node.js
編程控制風扇自動停啓。使用 node.js
是爲了下面和控制檯對接方便,示例代碼以下:網絡
const GPIO = require('rpio')
const PIN = 8 // 這裏的 8 號引腳對應 gpio 14,其他請查閱 rpi gpio 手冊:https://pinout.xyz/
const TEMP_LOW = 38 // 低於 38 攝氏度則中止運行
const TEMP_HIGH = 42 // 高於 42 攝氏度則開啓風扇
const TEMP_FILE = '/sys/class/thermal/thermal_zone0/temp'
/** * 讀取樹莓派當前溫度 * return {Number} 當前溫度 */
function cpuTemp () {
return parseFloat(require('fs').readFileSync(TEMP_FILE)) / 1000
}
setInterval(function () {
temp = cpuTemp()
console.log(`Current temp is ${temp}`)
if (isClose) {
if (temp > TEMP_HIGH) {
GPIO.write(PIN, GPIO.LOW)
console.log('Open air cooler')
isClose = false
}
} else {
if (temp < TEMP_LOW) {
GPIO.write(PIN, GPIO.HIGH)
console.log('Close air cooler')
isClose = true
}
}
}, 2000) // 每 2s 刷新一次
複製代碼
對了,這裏有個坑忘了說。包括我參考的那篇博客在內,大部分網絡上的資料都是經過給接口高電平來開啓風扇的,但事實上這是以
NPN
型三極管計算的結果,要使得PNP
工做於放大狀態應該使發射結正偏而集電結反偏,若是GPIO
引腳這時給高電平是無法使三極管正常工做的,因此這裏給低電平纔對。架構
爲了驗證這個我還把塵封的模電書找了出來好好複習了一下。
用 Node
編寫控制檯後端還比較簡單,主要架構就是 express
作服務端,bootstrap materialize design
+ d3.js
作前端頁面,再經過 socket.io
做爲 WebSocket
通信就好了。雖然簡單但代碼比較繁瑣,就不在這裏貼出來了,給幾個截圖意思一下:
性感風扇在線調戲
搭配 HomeAssistant 食用風味更佳
不過我不清楚是否是 d3.js
的鍋,反正如今性能不是很好,長時間運行後樹莓派卻是不燙了,電腦的 CPU 卻下不來了大霧,估計反覆操做 DOM
性能開銷仍是太大了,等明年再用 Vue
重構吧。