樹莓派+串列埠墨水電子螢幕+溫度溼度感測器打造專屬時鐘
前兩天在http://shumeipai.nxez.com/上看到一篇文章《宅男必備:配備電子紙螢幕的抽紙盒》,發現作者使用樹莓派和一些硬體裝置打造了一款特別有趣的東西,於是我也特別感興趣,特別感謝作者的文章,讓我對樹莓派愛的一發不可收拾。
於是趕緊買按照作者的推薦買了裝置回來準備動手做,花了大概兩天時間我就做出來了,我還沒有為它加上一個漂亮的外殼,目前為止是這樣的。
在原文中作者提供了一些程式碼,但是在實際過程中我發現對於沒開發過這種嵌入式的小白來說是非常痛苦的,特別是硬體連線方式比較迷茫。先給出樹莓派2的GPIO圖
樹莓派的GPIO的介面在不同的編碼方式下有著不同的名稱
螢幕\樹莓派
DIN\TX(GPIO14)
DOUT\RX(GPIO15)
GND\GND
VCC\3V
這裡的硬體連線對應著圖來說是比較好接的,接下來是溫度溼度感測器的接線圖
DHT22\樹莓派
DOUT\GPIO04
GND\GND
VCC\3V
關於GND表示的是電源的負極,VCC表示電源正級
接好線後我們開始測試裝置的連線情況
第一步安裝一些必要的軟體依賴
[plain]view plaincopy
sudo apt-get install python-requests python-lxml python-serial git build-essential python-dev
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
cd Adafruit_Python_DHT
sudo python ./setup.py install
第二步,測試硬體連線是否正確
[python]view plaincopy
#coding=utf-8
importdatetime
importjson
importos
importsys
importtime
importthreading
fromwave_share_43inch_epaperimport*
GAP =2
screen = Screen('/dev/ttyAMA0')
screen.connect()
time.sleep(GAP)
screen.handshake()
screen.clear()
screen.set_memory(MEM_SD)
screen.set_rotation(ROTATION_180)
screen.set_ch_font_size(FONT_SIZE_64)
screen.set_en_font_size(FONT_SIZE_64)
screen.text(200,270,u”HELLO WORLD")
screen.update()
time.sleep(GAP)
screen.disconnect()
time.sleep(GAP)
執行該指令碼後會在螢幕上列印出HELLO WORLD,看到這個現實就表示你的線是接對了,串列埠可以正常的工作了
其中關於作者在原文中提供的程式碼(Python指令碼已開源,歡迎參觀指導:https://github.com/emptyhua/epaper_clock)
封裝了對於串列埠屏操作的類,我們可以很方便的控制螢幕現實。凡是使用了作者的程式碼後發現,指令碼執行一次後就不會再更新螢幕的顯示了,需要重新執行才能重新整理,於是我自己重新寫了程式碼,對螢幕的佈局做了一些調整,增加了一些有趣的功能。
注意:關於串列埠屏有個問題就是重新整理速度很慢,大概需要1.5秒,因此為了螢幕顯示的時間我設定為了每隔60秒重新整理一次,這樣既能降低螢幕重新整理頻率,也可以節約耗電。
在程式中會定時的從天氣介面API中獲取天氣資料,我增加了一個幾個動態顯示資料的地方
1、明日預報上方的有趣的小圖片,根據微雪4.3inch電子墨水屏官方的使用者手冊中把圖片專為能夠支援的格式(效果真的很一般),不過你可以去一些素材網上下載黑白的圖片作為資源
2、螢幕左下方的訊息提示,可以通過自己伺服器的介面返回(建議用json格式)你想顯示的資料(撩妹技能)
在長時間執行後發現串列埠通訊會失敗,具體什麼原因沒有找到,所以我在遇到異常的時候會重新建立與螢幕的連線,以及在原作者對於螢幕串列埠程式碼中傳送訊息的函式中容易出現異常,我修改了一個地方
[python]view plaincopy
def_send(self, frame):
self.socket.write(frame)
self.socket.flushInput();
returnself.socket.read(self.socket.inWaiting())
'''''這裡有bug,不能都指定讀取10個位元組資料,會造成異常'''
#return self.socket.read(10)
我將read函式的引數設定為了緩衝區的資料量,而不是原來的直接讀10個位元組
如果你要把這個送給小白當禮物的話,首先要保證在重啟,斷電,斷網等情況能夠恢復顯示,因此我增加了一個啟動任務,能夠在重啟電腦過後啟動我們的指令碼或者在沒有網路連線的情況下提示使用者進行網路連線。
自動啟動指令碼
[plain]view plaincopy
#!/bin/sh
### BEGIN INIT INFO
# Provides: weather_service
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start or stop the weather service
### END INIT INFO
case $1 in
start)
checkconnect() {
#超時時間
timeout=5
target=www.baidu.com
while :
do
#獲取響應狀態碼
ret_code=`curl -I -s --connect-timeout $timeout $target -w %{http_code} | tail -n1`
if [ "x$ret_code" = "x200" ]; then
#網路暢通
echo "network ok." >> /root/start.log
break
else
#網路不暢通
date '+%Y-%m-%d %T' >> /root/start.log
echo "network not connect." > /root/start.log
python /root/weather/display_error.py
sleep 5
fi
done
}
date '+%Y-%m-%d %T' >> /root/start.log
echo "wake up e-paper ..."
python /root/weather/wake_up.py
echo "check network ..." >> /root/start.log
checkconnect;
#echo "autossh ..." >> /root/start.log
#nohup autossh -M 5678 -NR 19999:localhost:22 root@你的伺服器IP >/dev/null 2>&1 &
autossh -M 5678 -4 -N -f root@你的伺服器IP -D 19999:localhost:22 -o "ServerAliveInterval 60″ -o "ServerAliveCountMax 3″ -o BatchMode=yes -o StrictHostKeyChecking=no -i SSH_KEY_FILE_PATH
nohup python /root/weather/weather_service.py >/dev/null 2>&1 &
echo "service started" >> /root/start.log
date '+%Y-%m-%d %T' >> /root/start.log
;;
stop)
echo "e-paper sleep ..." >> /root/start.log
python /root/weather/sleep.py
sleep 1
echo "kill autossh..." >> /root/start.log
ps -ef | grep autossh | grep -v grep | awk '{print $2}' | xargs kill -9
echo "service stop" >> /root/start.log
;;
*)
echo "Usage: $0 (start|stop)"
;;
esac
將此指令碼放在/etc/init.d目錄下,修改許可權 chmod 777 weather_service
執行
[plain]view plaincopy
sudo update-rc.d svn_serve defaults
將指令碼設為開機啟動,在上面的程式碼中autossh這段程式碼是我建立和我伺服器的反向隧道連線,這樣可以保證我的樹莓派在沒有公網的IP情況下,能夠通過我的伺服器連線上去,如果你沒有這個需要去掉就可以了,在啟動後會迴圈檢查網路連線情況,如果沒有連線會一直重試,並且執行display_error.py指令碼,用來往螢幕上顯示網路未連線的資訊,當網路連線正常後繼續執行下面的指令碼,這樣可以保證我們的程式在重啟後依然能正常工作。
我將自己寫的程式碼放在了github上面(https://github.com/zhujunxxxxx/weather_clock)
相關文章
- 【.NET 與樹莓派】溫度/溼度感測器——SHT30樹莓派
- 樹莓派-感測器篇樹莓派
- 沒有樹莓派顯示器,鍵盤,滑鼠,串列埠, 樹莓派怎麼無線上網?樹莓派串列埠
- 使用樹莓派3b+和DHT11監控溫溼度。樹莓派
- PiJuice:專為樹莓派打造的移動電源UI樹莓派
- 利用python獲取樹莓派的溫度Python樹莓派
- 軟體工程師樹莓派獲取室內溫溼度的坎坷之旅軟體工程工程師樹莓派
- 樹莓派3 打造定時播報電臺音樂鬧鐘、天氣等樹莓派
- DHT11溫溼度感測器原理剖析
- 在樹莓派用C#+Winform實現感測器監測樹莓派C#ORM
- 啟用樹莓派3B串列埠通訊能力樹莓派串列埠
- 如何用樹莓派搭建一個顆粒物感測器樹莓派
- 【.NET 與樹莓派】六軸飛控感測器(MPU 6050)樹莓派
- 【.NET 與樹莓派】氣壓感測器——BMP180樹莓派
- 樹莓派電臺樹莓派
- 樹莓派無線上網時,怎麼查它的ip(沒有螢幕)?樹莓派
- 小米溫溼度感測器釋出:自動開空調
- 使用 Arduino 和 LM35 溫度感測器監測溫度UI
- HX711壓力感測器+樹莓派python驅動程式樹莓派Python
- 計算機實驗室之樹莓派:課程 8 螢幕03計算機樹莓派
- 計算機實驗室之樹莓派:課程 9 螢幕04計算機樹莓派
- 計算機實驗室之樹莓派:課程 7 螢幕02計算機樹莓派
- 5、樹莓派3 Model B ——— 樹莓派PWM控制直流電機速度樹莓派
- 樹莓派搭建git伺服器 | 樹莓派小無相系列樹莓派Git伺服器
- 基於arduino uno的DHT11溫溼度感測器的使用UI
- 樹莓派使用入門:如何更新樹莓派樹莓派
- 樹莓派來做電視盒子樹莓派
- 樹莓派是什麼 樹莓派能做什麼 樹莓派的功能用途樹莓派
- 樹莓派3 B+ 的串列埠(USART)使用問題 (也是用C寫的)樹莓派串列埠
- STM32 模組篇-溫溼度感測器模組(DHT11)實驗
- 樹莓派使用樹莓派
- 樹莓派搭建FTP伺服器樹莓派FTP伺服器
- 樹莓派搭建私人伺服器樹莓派伺服器
- 樹莓派4B基於OpenCV的C++環境的串列埠通訊樹莓派OpenCVC++串列埠
- 使用樹莓派和projectx/os託管你自己的電子郵件樹莓派Project
- 使用樹莓派和 projectx/os 託管你自己的電子郵件樹莓派Project
- 樹莓派使用入門:用樹莓派學 Linux樹莓派Linux
- 樹莓派使用入門:透過樹莓派和 kali Linux 學習電腦保安樹莓派Linux