使用诺基亚Nokia5110做树莓派的显示屏

树莓派是一个嵌入式的设备,在很多时候一般不需要屏幕显示的,基本都是后台运行一些程序。但有时候需要简单显示一些数值(比如显示,树莓派IP地址,CPU和内存使用率,当前的日期时间等),还是需要显示屏的。虽然树莓派有HDMI接口,但是为了显示几个数据而连接一个HDMI显示器当然非常不方便也不好用。于是我们可以把废旧的手机显示屏,比如采用SPI通讯协议的诺基亚Nokia5110的显示屏拆下来连接树莓派的GPIO接口上做简单的数据显示和人机交互。如果结合树莓派连上DS1805温度采集就能当一个电子温度计来使用了,但这次我们主要讲显示屏。温度的显示,可以关注我们牛人技术下次会讲到。


Nokia5110显示屏引脚的定义以及和树莓派GPIO连接的方法
诺基亚的这块屏幕是款简单的8针脚,黑白显示屏幕,并且一个屏可显示多行,然后我们使用的是PCD8544驱动。
RST:外部复位引脚
CE:显示屏使能引脚
DC:数据/命令引脚
Din:串行数据输入端
CLK:串行时钟输入端
Vcc:电源引脚
BL: 亮度调节
Gnd:地

RST——GPIO 21 外部复位引脚
CE——GPIO 22 显示屏使能引脚
DC——GPIO 23 数据/命令引脚
Din——GPIO 24 串行数据输入端
CLK——GPIO 25 串行时钟输入端
Vcc——GPIO 28 电源引脚
BL——GPIO 29 亮度调节
Gnd——GPIO 0V 接地线负
这里完成硬件的连接,就可以开始安装相关的软件了。


下载安装wiring pi模块(如果是C语言控制)
我们进入树莓派的home目录,并从git上下载开源代码,然后进行编译安装。
cd /home/
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build
cd /home/查看是否下载和编译成功
完成安装后为后续5110提供运行环境


编写PYTHON显示测试代码
# coding:utf-8 #这里要用utf8文本编辑器编辑,否则PY脚本无法运行。
import time  #增加时钟模块
import requests
from math import fabs
from base64 import b64encode
 
class RaspberryMonitorNetSpeed:
    url = 'http://192.168.1.1/update.cgi?output=netdev' 
    headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
            'Cache-Control': 'max-age=0',
            # 'Connection':'keep-alive',
            'Connection': 'close',
            'Cookie': 'n56u_cookie_bw_rt_tab=WAN',
            'Host': '192.168.123.1',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
        }
    last_time = 0
    last_rbytes = 0
    last_tbytes = 0
 
    #构造函数初始化用户和密码等信息
    def __init__(self, username, passwd):
        self.headers['Authorization'] = 'Basic '+b64encode((username+':'+passwd).encode()).decode()
        data = self.__get_wan_rx_and_tx()
        self.last_rbytes = data[0]
        self.last_tbytes = data[1]
        self.last_time = data[2]
 
    def set_auth(self, username, passwd):
        self.headers['Authorization'] = 'Basic '+b64encode((username+':'+passwd).encode()).decode()
 
    def __get_wan_rx_and_tx(self):
        text = requests.get(self.url, headers=self.headers).text
        try:
            rx = int(text.split(',')[25].lstrip('rx:').strip(), 16)
            tx = int(text.split(',')[26].lstrip('tx:').rstrip('}\n').strip(), 16)
            new_time = time.time()
        except (IndexError, ValueError, TypeError):
            return False
        return [rx, tx, new_time]
 
    def __bytes_to_humanspeed(self, B):
        absval = fabs(B) / 1024
        megabyte = 1024
        gigabyte = megabyte * 1024
        terabyte = gigabyte * 1024
        # petabyte = terabyte * 1024
        if absval < megabyte:
            return str(round(absval, 2)) + ' KB/s'
        elif absval < gigabyte:
            return str(round(absval / megabyte, 2)) + ' M/s'
        else:
            return str(round(absval / gigabyte, 2)) + ' G/s'


    def get_human_speed(self):
        data = self.__get_wan_rx_and_tx()
        if data:
            down_speed = 0
            up_speed = 0
            try:
                down_speed = self.__bytes_to_humanspeed((data[0] - self.last_rbytes) / (data[2] - self.last_time))#返回下载速度信息
                up_speed = self.__bytes_to_humanspeed((data[1] - self.last_tbytes) / (data[2] - self.last_time))#上传速度信息
            except ZeroDivisionError:
                pass
            self.last_rbytes = data[0]
            self.last_tbytes = data[1]
            self.last_time = data[2]
            return down_speed, up_speed
 
    def get_bits_speed(self):
        data = self.__get_wan_rx_and_tx()
        if data:
            down_speed = self.__bytes_to_bitrate((data[0] - self.last_rbytes) / (data[2] - self.last_time))
            up_speed = self.__bytes_to_bitrate((data[1] - self.last_tbytes) / (data[2] - self.last_time))
            self.last_rbytes = data[0]
            self.last_tbytes = data[1]
            self.last_time = data[2]
            return down_speed, up_speed
 
    def __bytes_to_bitrate(self, B):
        bits = B * 8
        absval = fabs(bits)
        kilobit = 1000
        megabit = kilobit * 1000
        gigabit = megabit * 1000
        if absval < megabit:
            return str(round(bits / kilobit, 2)) + ' Kbps'
        elif absval < gigabit:
            return str(round(bits / megabit, 2)) + ' Mbps'
        else:
            return str(round(bits / gigabit, 2)) + ' Gbps'
 
#这里是主入口函数,初始化LCD1602等信息
if __name__ == '__main__':
    from lcd1602 import LCD1602
    a = RaspberryMonitorNetSpeed('username', 'password')
    lcd = LCD1602()
#不停的循环显示
    while True:
        tmp = a.get_human_speed()
        lcd.lcd_string('u:' + tmp[1], lcd.LCD_LINE_1)
        lcd.lcd_string('d:' + tmp[0], lcd.LCD_LINE_2)
        time.sleep(2)
把上面的代码保存到/home目录下的test01.py并且使用chmod 777 命令增加执行权限,然后我们就可以使用命令来运行这个PYTHON脚步了。如果一切正常的话,你就能看到树莓派的网卡上的数据实时传输信息。需要注意的是,这里我们需要用到python3的一些外部库文件,比如Adafruit_GPIO,requests,Adafruit_DHT等等。

总结
总体来将使用诺基亚Nokia5110来作为树莓派的显示屏的操作还是有点难度和风险的,首先在连接树莓派GPIO和5110的针脚时候就千万要注意别连接出错。在加电前一定要梳理清楚是否连接正确否则怕容易烧坏机器。其次在安装一些驱动模块的时候,要注意兼容性的问题。


本文由作者自行上传发布,文章仅代表作者个人观点。如需转载,务必声明出处和网址,否则保留相关权利。

网友评论 comments

发表评论

电子邮件地址不会被公开。必填项已用 *标注

暂无评论

牛人技术博客 | About US | 湘ICP备13000282号-8 |
Copyright © 2009 - 2023 NRJS Corporation, All Rights Reserved
添加图标到手机桌面
扫二维码
扫二维码
返回顶部