香港腕表价格交流群

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

2020-09-02 09:45:32

[+]

前言


前两天在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 plain copy

  1. sudo apt-get install python-requests python-lxml python-serial git build-essential python-dev  

  2. git clone https://github.com/adafruit/Adafruit_Python_DHT.git  

  3. cd Adafruit_Python_DHT  

  4. sudo python ./setup.py install  


第二步,测试硬件连接是否正确

[python] view plain copy

  1. #coding=utf-8  

  2. import datetime  

  3. import json  

  4. import os  

  5. import sys  

  6. import time  

  7. import threading  

  8. from wave_share_43inch_epaper import *  

  9.   

  10. GAP = 2  

  11.   

  12. screen = Screen('/dev/ttyAMA0')  

  13. screen.connect()  

  14. time.sleep(GAP)  

  15. screen.handshake()  

  16.   

  17. screen.clear()  

  18. screen.set_memory(MEM_SD)  

  19. screen.set_rotation(ROTATION_180)  

  20. screen.set_ch_font_size(FONT_SIZE_64)  

  21. screen.set_en_font_size(FONT_SIZE_64)  

  22. screen.text(200,270,u”HELLO WORLD")  

  23. screen.update()  

  24. time.sleep(GAP)  

  25. screen.disconnect()  

  26. time.sleep(GAP)  


运行该脚本后会在屏幕上打印出HELLO WORLD,看到这个现实就表示你的线是接对了,串口可以正常的工作了

其中关于作者在原文中提供的代码Python脚本已开源,欢迎参观指导:https://github.com/emptyhua/epaper_clock)

封装了对于串口屏操作的类,我们可以很方便的控制屏幕现实。凡是使用了作者的代码后发现,脚本运行一次后就不会再更新屏幕的显示了,需要重新运行才能刷新,于是我自己重新写了代码,对屏幕的布局做了一些调整,增加了一些有趣的功能。

注意:关于串口屏有个问题就是刷新速度很慢,大概需要1.5秒,因此为了屏幕显示的时间我设置为了每隔60秒刷新一次,这样既能降低屏幕刷新频率,也可以节约耗电。

数据获取

在程序中会定时的从天气接口API中获取天气数据,我增加了一个几个动态显示数据的地方

1、明日预报上方的有趣的小图片,根据微雪4.3inch电子墨水屏官方的用户手册中把图片专为能够支持的格式(效果真的很一般),不过你可以去一些素材网上下载黑白的图片作为资源

2、屏幕左下方的消息提示,可以通过自己服务器的接口返回(建议用json格式)你想显示的数据(撩妹技能)


其他问题

串口异常

在长时间运行后发现串口通讯会失败,具体什么原因没有找到,所以我在遇到异常的时候会重新建立与屏幕的连接,以及在原作者对于屏幕串口代码中发送消息的函数中容易出现异常,我修改了一个地方

[python] view plain copy

  1. def _send(self, frame):  

  2.        self.socket.write(frame)  

  3.        self.socket.flushInput();  

  4.        return self.socket.read(self.socket.inWaiting())  

  5.        '''''这里有bug,不能都指定读取10个字节数据,会造成异常'''  

  6.        #return self.socket.read(10)  


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

重启问题

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


自动启动脚本

[plain] view plain copy

  1. #!/bin/sh  

  2. ### BEGIN INIT INFO  

  3. # Provides:          weather_service  

  4. # Required-Start:    $remote_fs  

  5. # Required-Stop:     $remote_fs  

  6. # Default-Start:     2 3 4 5  

  7. # Default-Stop:      0 1 6  

  8. # Short-Description: Start or stop the weather service  

  9. ### END INIT INFO  

  10. case $1 in  

  11.     start)  

  12.         checkconnect() {  

  13.             #超时时间  

  14.             timeout=5  

  15.             target=www.baidu.com  

  16.             while :  

  17.             do  

  18.                 #获取响应状态码  

  19.                 ret_code=`curl -I -s --connect-timeout $timeout $target -w %{http_code} | tail -n1`  

  20.   

  21.                 if [ "x$ret_code" = "x200" ]; then  

  22.                     #网络畅通  

  23.                     echo "network ok." >> /root/start.log  

  24.                     break  

  25.                 else  

  26.                     #网络不畅通  

  27.                     date '+%Y-%m-%d %T' >> /root/start.log  

  28.                     echo "network not connect." > /root/start.log  

  29.                     python /root/weather/display_error.py  

  30.                     sleep 5  

  31.                 fi  

  32.             done  

  33.         }  

  34.         date '+%Y-%m-%d %T' >> /root/start.log  

  35.         echo "wake up e-paper ..."  

  36.         python /root/weather/wake_up.py  

  37.         echo "check network ..." >> /root/start.log  

  38.         checkconnect;  

  39.         #echo "autossh ..." >> /root/start.log  

  40.         #nohup autossh -M 5678 -NR 19999:localhost:22 root@你的服务器IP >/dev/null 2>&1 &  

  41.         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  

  42.         nohup python /root/weather/weather_service.py >/dev/null 2>&1 &  

  43.         echo "service started" >> /root/start.log  

  44.         date '+%Y-%m-%d %T' >> /root/start.log  

  45.         ;;  

  46.     stop)  

  47.         echo "e-paper sleep ..." >> /root/start.log  

  48.         python /root/weather/sleep.py  

  49.         sleep 1  

  50.         echo "kill autossh..." >> /root/start.log  

  51.         ps -ef | grep autossh | grep -v grep | awk '{print $2}' | xargs kill -9  

  52.         echo "service stop" >> /root/start.log  

  53.         ;;  

  54.     *)  

  55.         echo "Usage: $0 (start|stop)"  

  56.     ;;  

  57. esac  


将此脚本放在/etc/init.d目录下,修改权限 chmod 777 weather_service

执行

[plain] view plain copy

  1. 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 转载请注明出处


友情链接

Copyright © 2023 All Rights Reserved 版权所有 香港腕表价格交流群