树莓派使用Nokia 5110屏幕显示网速温度等

  • 2018-06-14
  • 274
  • 0
  • 0

Nokia 5110

长这样

驱动

PCD8544

资料

Google一搜各种博客都有介绍,毕竟我不是学硬件的,底层什么的就不说了。好玩就行

引脚

  • rst:外部复位引脚
  • ce:显示屏使能引脚
  • dc:数据/命令引脚
  • din:串行数据输入端
  • clk:串行时钟输入端
  • vcc:电源引脚
  • bl: 亮度调节
  • gnd:接地

先看看驱动代码-python

修改自(Adafruit)
这里用的是BCM模式

接线(BCM)

  • dc 13
  • rst 5
  • sclk 26
  • din 19
  • cs 6
  • vcc 20
  • bl 21
  • gnd 0v

显示信息

网速

显示路由器的网速,电脑网速就没必要了
我用的是老毛子固件,所以用这个固件的可以参考我的代码

代码量不大,我就没写注释了

# coding:utf-8
import requests
import time
from math import fabs
from base64 import b64encode
# from demjson import decode


class RaspberryMonitorNetSpeed:
    url = 'http://192.168.123.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 get_human_speed(self):
        """这里返回的是M/s这种网速,[下载,上传]"""
        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 __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_bits_speed(self):
        """这里返回的是Mbps这种网速,[下载,上传]"""
        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'


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)

温度

这里用的是DTH11,驱动同样参考这个(Adafruit)

开始显示

代码量同样不大,没写注释

import time
import datetime
from PCD8544 import PCD8544 as lcd
import threading
import Adafruit_DHT
from speed import RaspberryMonitorNetSpeed as rmn

ns = [-1, -1]
th = [-2, -2]


def main():
    a = lcd(dc=13, rst=5, sclk=26, din=19, cs=6, vcc=20, bl=21)
    a.begin(contrast=60)
    tmp = threading.Thread(target=network_speed)
    tmp.setDaemon(True)
    tmp.start()
    tmp = threading.Thread(target=temperature_humidity)
    tmp.setDaemon(True)
    tmp.start()
    while True:
        try:
            a.clear()
            # 上传速度
            a.draw_str(0, 'U: ' + str(ns[1]))
            # 下载速度
            a.draw_str(1, 'D: ' + str(ns[0]))
            # 温度
            a.draw_str(2, 'T: ' + str(th[1]) + ' C')
            # 湿度
            a.draw_str(3, 'H: ' + str(th[0]) + '%')
            # 时间
            a.draw_str(4, datetime.datetime.now().__str__()[5:].lstrip('0').split('.')[0])
            a.display()
            time.sleep(1)
        except KeyboardInterrupt:
            a.quit()
            exit(0)

def network_speed():
    global ns
    b = rmn('bankroft', '123456')
    while True:
        time.sleep(1)
        ns = b.get_human_speed()

def temperature_humidity():
    global th
    pin = 25
    while True:
        time.sleep(10)
        th = Adafruit_DHT.read_retry(11, 25)


if __name__ == '__main__':
    main()

运行

依赖

python3

安装

Adafruit_GPIO
Adafruit_DHT
requests

运行

python main.py

成果

评论

还没有任何评论,你来说两句吧

发表评论