树莓派是一个嵌入式的设备,在很多时候一般不需要屏幕显示的,基本都是后台运行一些程序。但有时候需要简单显示一些数值(比如显示,树莓派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