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

前言

前两天在 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
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: ESP8266是一款集成了Wi-Fi模块的51单片机,可以实现物联网应用。温湿度传感器是一种用于测量环境中温度和湿度的设备。 在使用ESP8266和51单片机搭建温湿度传感器时,首先需要连接温湿度传感器到单片机的引脚。传感器通常有三个引脚,分别是VCC、GND和DATA。通过将VCC引脚连接到单片机的电源引脚,GND引脚连接到单片机的地引脚,然后将DATA引脚连接到单片机的一个可用IO引脚上。 在软件方面,我们可以使用Arduino IDE编写代码来读取传感器数据并将其发送到云端或通过串口输出。通过使用适当的库,我们可以简化与传感器的通信过程。 编写代码时,我们可以首先初始化串口进行输出,并初始化温湿度传感器。然后,我们可以设置一个定时器来定期读取传感器数据。读取数据后,我们可以将数据发送到预定的目的地,例如通过Wi-Fi发送到服务器或通过串口发送到电脑。 在实际应用中,我们可以将ESP8266和51单片机与温湿度传感器一起使用,以监测室内或室外的温度和湿度变化。这可以用于自动化系统,例如自动调节空调或通风系统,以保持适宜的温湿度。 总而言之,使用ESP8266和51单片机搭建温湿度传感器可以实现温湿度数据的实时监测和远程传输,为物联网应用提供了可靠的基础。 ### 回答2: ESP8266是一款高性能、低功耗的Wi-Fi模块,适用于物联网项目。而51单片机是常用的微控制器,具有广泛的应用领域。温湿度传感器用于测量环境的温度和湿度,并将数据传输到控制器进行处理。 在使用ESP8266和51单片机进行温湿度传感器的编程时,需先连接温湿度传感器到单片机的GPIO引脚上。然后,通过相应的电路和代码,可以读取温湿度传感器的数据。 首先,在代码中需引入相应的库文件,例如DHT库以支持温湿度传感器的读取。然后,定义所需的引脚和变量,配置单片机的GPIO引脚,以便与传感器通信。 接下来,通过相应的函数,读取温湿度传感器的数值。将传感器返回的数值进行解析,得到温度和湿度的数值。 最后,可以将得到的温湿度数据通过ESP8266模块通过Wi-Fi连接发送到云服务器或其他设备上。这样,可以实现远程监控温湿度数据的功能。 总之,使用ESP8266和51单片机结合温湿度传感器可以实现温湿度数据的监测和传输。这对于需要对环境进行实时监测的物联网项目非常实用。 ### 回答3: ESP8266是一款功能强大的Wi-Fi模块,而51单片机是一种常用的嵌入式控制器。温湿度传感器是一种用于测量环境温度和湿度的设备。 ESP8266和51单片机可以配合使用温湿度传感器,实现对环境温湿度的监测和数据传输功能。具体的实现方式可以是,通过51单片机来读取温湿度传感器的数据,然后利用ESP8266模块的Wi-Fi功能,将数据发送到云端或其他设备。 在实际应用中,可以通过编程来配置ESP8266和51单片机之间的通信协议,使它们能够互相连接和传递数据。同时,还可以利用ESP8266模块的强大功能,如TCP/IP协议栈和Web服务器功能,使温湿度数据可以通过互联网远程访问和监测。这样,用户可以通过手机、电脑等设备随时随地获取温湿度数据,而无需实时接触传感器。 此外,为了保证温湿度传感器的准确性和稳定性,在设计和制作过程中需要注意一些细节。例如,选择合适的传感器,注意传感器的精度和响应时间;同时,需合理布置电路和引脚连接,以及合理选择电源和信号线的布线方式,以避免干扰和故障。 总的来说,通过ESP8266和51单片机配合使用温湿度传感器,可以实现对环境温湿度的远程监测和数据传输,为用户提供更便利和智能化的环境管理解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值