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

原创 2016年07月18日 19:23:43

前言

前两天在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表示电源正级
接好线后我们开始测试设备的连接情况
第一步安装一些必要的软件依赖
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个字节

重启问题

如果你要把这个送给小白当礼物的话,首先要保证在重启,断电,断网等情况能够恢复显示,因此我增加了一个启动任务,能够在重启电脑过后启动我们的脚本或者在没有网络连接的情况下提示用户进行网络连接。


自动启动脚本
#!/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脚本,用来往屏幕上显示网络未连接的信息,当网络连接正常后继续执行下面的脚本,这样可以保证我们的程序在重启后依然能正常工作。

最终效果



代码

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

原创性申明

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



树莓派小显示器模拟带温度显示的时钟

玩树莓派也有半年了吧,玩到9月份的时候中断了一下,因为我可爱的女儿出生了 ^_^ 这下树莓派在家也真有应用的场景了。为了方便今后的使用,先为树莓派买了个7寸的电容屏,1024*600分辨率的。这货怎么...
  • ki1381
  • ki1381
  • 2017年01月04日 14:18
  • 1017

树莓派3做的OLED小时钟

刚刚搞定这个 :D 方法如上一篇,利用树莓派python驱动I2C OLED自带的示例程序改写的。...
  • ki1381
  • ki1381
  • 2016年09月04日 20:49
  • 2466

树莓派时钟

import tkinter as Tkinter,sys,time root=Tkinter.Tk() root.minsize(500, 500) Label1=Tkinter.Label(tex...
  • Martind
  • Martind
  • 2017年11月07日 09:23
  • 26

为树莓派3B添加一个实时时钟DS1302

1、在系统中安装wiringPi(这个就不多说了很简单) 2、连接ds1302模块和树莓派引脚 连接前需要在ds1302的DTA引脚上添加一个10K的上拉电阻, VCC—3.3V...

树莓派学习笔记——获取树莓派CPU温度

本文通过文件操作读取树莓派CPU温度,在linux系统中任何设备的操作都被抽象成为文件读写,通过读取/sys/class/thermal/thermal_zone0/temp文件中的内容便获得树莓派C...

github 的文件忽略

Github忽略文件设置经验 有很多文件不必使用git管理。例如Eclipse或其他IDE生成的项目文件,编译生成的各种目标或临时文件等。使用git status时,会在Un...

树莓派 GPIO学习笔记(3)--DS18B20温度传感器

接线方式18B20接线方式需要在VCC和数据端连接一个4.7k的电阻. 电阻被用于拉高数据输出线(data-line),并且保持数据输出的稳定。要注意DS18B20的方向,弧形的一边在图中的左侧。如...

Adafruit的樹莓派教程第十一課:DS18B20溫度傳感器

http://www.geekfan.net/10081/ 本文由 極客范 - Boyd Wang 翻譯自 Adafruit.com。歡迎加入極客翻譯小組,同我們一道翻譯與分享。轉載請參見文章末...
  • rocky69
  • rocky69
  • 2016年02月14日 17:54
  • 1597

Raspberry Pi 树莓派连接温度传感器DS18B20

来源:http://www.waveshare.net/study/article-607-1.html 本章讲解如果在linux系统下控制DS18B20 DS18B20是一个比较常用...

Qt加树莓派读取ds18b20温度传感器的值

一:DS18B20文件读取参考资料 二:DS!
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树莓派+串口墨水电子屏幕+温度湿度传感器打造专属时钟
举报原因:
原因补充:

(最多只允许输入30个字)