樹莓派+串列埠墨水電子螢幕+溫度溼度感測器打造專屬時鐘

weixin_33866037發表於2017-07-04

前兩天在http://shumeipai.nxez.com/上看到一篇文章《宅男必備:配備電子紙螢幕的抽紙盒》,發現作者使用樹莓派和一些硬體裝置打造了一款特別有趣的東西,於是我也特別感興趣,特別感謝作者的文章,讓我對樹莓派愛的一發不可收拾。

於是趕緊買按照作者的推薦買了裝置回來準備動手做,花了大概兩天時間我就做出來了,我還沒有為它加上一個漂亮的外殼,目前為止是這樣的。

6735717-6653a78f384a4da0

在原文中作者提供了一些程式碼,但是在實際過程中我發現對於沒開發過這種嵌入式的小白來說是非常痛苦的,特別是硬體連線方式比較迷茫。先給出樹莓派2的GPIO圖

6735717-1979522ec6a3f0bd

樹莓派的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個位元組

重啟問題

如果你要把這個送給小白當禮物的話,首先要保證在重啟,斷電,斷網等情況能夠恢復顯示,因此我增加了一個啟動任務,能夠在重啟電腦過後啟動我們的指令碼或者在沒有網路連線的情況下提示使用者進行網路連線。

6735717-293a5ca87e5fea0e

自動啟動指令碼

[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指令碼,用來往螢幕上顯示網路未連線的資訊,當網路連線正常後繼續執行下面的指令碼,這樣可以保證我們的程式在重啟後依然能正常工作。

最終效果

6735717-d0eb93d94caefa52
6735717-9289496dbfea4ad1

程式碼

我將自己寫的程式碼放在了github上面(https://github.com/zhujunxxxxx/weather_clock)

相關文章