树莓派+串口墨水电子屏幕+温度湿度传感器打造专属时钟

前言

前两天在 http://shumeipai.nxez.com/上看到一篇文章《 宅男必备:配备电子纸屏幕的抽纸盒》,发现作者使用树莓派和一些硬件设备打造了一款特别有趣的东西,于是我也特别感兴趣,特别感谢作者的文章,让我对树莓派爱的一发不可收拾。
于是赶紧买按照作者的推荐买了设备回来准备动手做,花了大概两天时间我就做出来了,我还没有为它加上一个漂亮的外壳,目前为止是这样的。
树莓派+串口墨水电子屏幕+温度湿度传感器打造专属时钟_第1张图片
在原文中作者提供了一些代码,但是在实际过程中我发现对于没开发过这种嵌入式的小白来说是非常痛苦的,特别是硬件连接方式比较迷茫。先给出树莓派2的GPIO图
树莓派+串口墨水电子屏幕+温度湿度传感器打造专属时钟_第2张图片
树莓派的GPIO的接口在不同的编码方式下有着不同的名称

硬件连接

屏幕\树莓派
DIN\TX(GPIO14)
DOUT\RX(GPIO15)
GND\GND
VCC\3V
这里的硬件连接对应着图来说是比较好接的,接下来是温度湿度传感器的接线图
DHT22\树莓派
DOUT\GPIO04
GND\GND
VCC\3V
关于GND表示的是电源的负极,VCC表示电源正级
接好线后我们开始测试设备的连接情况
第一步安装一些必要的软件依赖
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

第二步,测试硬件连接是否正确
#coding=utf-8
import datetime
import json
import os
import sys
import time
import threading
from wave_share_43inch_epaper import *

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格式)你想显示的数据(撩妹技能)

其他问题

串口异常

在长时间运行后发现串口通讯会失败,具体什么原因没有找到,所以我在遇到异常的时候会重新建立与屏幕的连接,以及在原作者对于屏幕串口代码中发送消息的函数中容易出现异常,我修改了一个地方
 def _send(self, frame):
        self.socket.write(frame)
        self.socket.flushInput();
        return self.socket.read(self.socket.inWaiting())
        '''这里有bug,不能都指定读取10个字节数据,会造成异常'''
        #return self.socket.read(10)

我将read函数的参数设置为了缓冲区的数据量,而不是原来的直接读10个字节

重启问题

如果你要把这个送给小白当礼物的话,首先要保证在重启,断电,断网等情况能够恢复显示,因此我增加了一个启动任务,能够在重启电脑过后启动我们的脚本或者在没有网络连接的情况下提示用户进行网络连接。
树莓派+串口墨水电子屏幕+温度湿度传感器打造专属时钟_第3张图片

自动启动脚本
#!/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
执行
sudo update-rc.d svn_serve defaults
将脚本设为开机启动,在上面的代码中autossh这段代码是我建立和我服务器的反向隧道连接,这样可以保证我的树莓派在没有公网的IP情况下,能够通过我的服务器连接上去,如果你没有这个需要去掉就可以了,在启动后会循环检查网络连接情况,如果没有连接会一直重试,并且执行display_error.py脚本,用来往屏幕上显示网络未连接的信息,当网络连接正常后继续执行下面的脚本,这样可以保证我们的程序在重启后依然能正常工作。

最终效果

树莓派+串口墨水电子屏幕+温度湿度传感器打造专属时钟_第4张图片
树莓派+串口墨水电子屏幕+温度湿度传感器打造专属时钟_第5张图片

代码

我将自己写的代码放在了github上面( https://github.com/zhujunxxxxx/weather_clock)

原创性申明

本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处



你可能感兴趣的:(linux,c/c++,实验作品)