Nokia 5110
长上图这样。
驱动
PCD8544
资料
Google 一搜各种博客都有介绍,毕竟我不是学硬件的,底层什么的就不说了。好玩就行。
引脚
rst:外部复位引脚
ce:显示屏使能引脚
dc:数据/命令引脚
din:串行数据输入端
clk:串行时钟输入端
vcc:电源引脚
bl: 亮度调节
gnd:接地
先看看驱动代码
修改自(Adafruit),这里用的是 BCM 编码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 | # coding:utf-8 import time import Adafruit_GPIO as GPIO import Adafruit_GPIO.SPI as SPI LCDWIDTH = 84 LCDHEIGHT = 48 ROWPIXELS = LCDHEIGHT / / 6 PCD8544_POWERDOWN = 0x04 PCD8544_ENTRYMODE = 0x02 PCD8544_EXTENDEDINSTRUCTION = 0x01 PCD8544_DISPLAYBLANK = 0x0 PCD8544_DISPLAYNORMAL = 0x4 PCD8544_DISPLAYALLON = 0x1 PCD8544_DISPLAYINVERTED = 0x5 PCD8544_FUNCTIONSET = 0x20 PCD8544_DISPLAYCONTROL = 0x08 PCD8544_SETYADDR = 0x40 PCD8544_SETXADDR = 0x80 PCD8544_SETTEMP = 0x04 PCD8544_SETBIAS = 0x10 PCD8544_SETVOP = 0x80 FONT = { ' ' : [ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ], '!' : [ 0x00 , 0x00 , 0x5f , 0x00 , 0x00 ], '"' : [ 0x00 , 0x07 , 0x00 , 0x07 , 0x00 ], '#' : [ 0x14 , 0x7f , 0x14 , 0x7f , 0x14 ], '$' : [ 0x24 , 0x2a , 0x7f , 0x2a , 0x12 ], '%' : [ 0x23 , 0x13 , 0x08 , 0x64 , 0x62 ], '&' : [ 0x36 , 0x49 , 0x55 , 0x22 , 0x50 ], "'" : [ 0x00 , 0x05 , 0x03 , 0x00 , 0x00 ], '(' : [ 0x00 , 0x1c , 0x22 , 0x41 , 0x00 ], ')' : [ 0x00 , 0x41 , 0x22 , 0x1c , 0x00 ], '*' : [ 0x14 , 0x08 , 0x3e , 0x08 , 0x14 ], '+' : [ 0x08 , 0x08 , 0x3e , 0x08 , 0x08 ], ',' : [ 0x00 , 0x50 , 0x30 , 0x00 , 0x00 ], '-' : [ 0x08 , 0x08 , 0x08 , 0x08 , 0x08 ], '.' : [ 0x00 , 0x60 , 0x60 , 0x00 , 0x00 ], '/' : [ 0x20 , 0x10 , 0x08 , 0x04 , 0x02 ], '0' : [ 0x3e , 0x51 , 0x49 , 0x45 , 0x3e ], '1' : [ 0x00 , 0x42 , 0x7f , 0x40 , 0x00 ], '2' : [ 0x42 , 0x61 , 0x51 , 0x49 , 0x46 ], '3' : [ 0x21 , 0x41 , 0x45 , 0x4b , 0x31 ], '4' : [ 0x18 , 0x14 , 0x12 , 0x7f , 0x10 ], '5' : [ 0x27 , 0x45 , 0x45 , 0x45 , 0x39 ], '6' : [ 0x3c , 0x4a , 0x49 , 0x49 , 0x30 ], '7' : [ 0x01 , 0x71 , 0x09 , 0x05 , 0x03 ], '8' : [ 0x36 , 0x49 , 0x49 , 0x49 , 0x36 ], '9' : [ 0x06 , 0x49 , 0x49 , 0x29 , 0x1e ], ':' : [ 0x00 , 0x36 , 0x36 , 0x00 , 0x00 ], ';' : [ 0x00 , 0x56 , 0x36 , 0x00 , 0x00 ], '<' : [ 0x08 , 0x14 , 0x22 , 0x41 , 0x00 ], '=' : [ 0x14 , 0x14 , 0x14 , 0x14 , 0x14 ], '>' : [ 0x00 , 0x41 , 0x22 , 0x14 , 0x08 ], '?' : [ 0x02 , 0x01 , 0x51 , 0x09 , 0x06 ], '@' : [ 0x32 , 0x49 , 0x79 , 0x41 , 0x3e ], 'A' : [ 0x7e , 0x11 , 0x11 , 0x11 , 0x7e ], 'B' : [ 0x7f , 0x49 , 0x49 , 0x49 , 0x36 ], 'C' : [ 0x3e , 0x41 , 0x41 , 0x41 , 0x22 ], 'D' : [ 0x7f , 0x41 , 0x41 , 0x22 , 0x1c ], 'E' : [ 0x7f , 0x49 , 0x49 , 0x49 , 0x41 ], 'F' : [ 0x7f , 0x09 , 0x09 , 0x09 , 0x01 ], 'G' : [ 0x3e , 0x41 , 0x49 , 0x49 , 0x7a ], 'H' : [ 0x7f , 0x08 , 0x08 , 0x08 , 0x7f ], 'I' : [ 0x00 , 0x41 , 0x7f , 0x41 , 0x00 ], 'J' : [ 0x20 , 0x40 , 0x41 , 0x3f , 0x01 ], 'K' : [ 0x7f , 0x08 , 0x14 , 0x22 , 0x41 ], 'L' : [ 0x7f , 0x40 , 0x40 , 0x40 , 0x40 ], 'M' : [ 0x7f , 0x02 , 0x0c , 0x02 , 0x7f ], 'N' : [ 0x7f , 0x04 , 0x08 , 0x10 , 0x7f ], 'O' : [ 0x3e , 0x41 , 0x41 , 0x41 , 0x3e ], 'P' : [ 0x7f , 0x09 , 0x09 , 0x09 , 0x06 ], 'Q' : [ 0x3e , 0x41 , 0x51 , 0x21 , 0x5e ], 'R' : [ 0x7f , 0x09 , 0x19 , 0x29 , 0x46 ], 'S' : [ 0x46 , 0x49 , 0x49 , 0x49 , 0x31 ], 'T' : [ 0x01 , 0x01 , 0x7f , 0x01 , 0x01 ], 'U' : [ 0x3f , 0x40 , 0x40 , 0x40 , 0x3f ], 'V' : [ 0x1f , 0x20 , 0x40 , 0x20 , 0x1f ], 'W' : [ 0x3f , 0x40 , 0x38 , 0x40 , 0x3f ], 'X' : [ 0x63 , 0x14 , 0x08 , 0x14 , 0x63 ], 'Y' : [ 0x07 , 0x08 , 0x70 , 0x08 , 0x07 ], 'Z' : [ 0x61 , 0x51 , 0x49 , 0x45 , 0x43 ], '[' : [ 0x00 , 0x7f , 0x41 , 0x41 , 0x00 ], '\\' : [ 0x02 , 0x04 , 0x08 , 0x10 , 0x20 ], ']' : [ 0x00 , 0x41 , 0x41 , 0x7f , 0x00 ], '^' : [ 0x04 , 0x02 , 0x01 , 0x02 , 0x04 ], '_' : [ 0x40 , 0x40 , 0x40 , 0x40 , 0x40 ], '`' : [ 0x00 , 0x01 , 0x02 , 0x04 , 0x00 ], 'a' : [ 0x20 , 0x54 , 0x54 , 0x54 , 0x78 ], 'b' : [ 0x7f , 0x48 , 0x44 , 0x44 , 0x38 ], 'c' : [ 0x38 , 0x44 , 0x44 , 0x44 , 0x20 ], 'd' : [ 0x38 , 0x44 , 0x44 , 0x48 , 0x7f ], 'e' : [ 0x38 , 0x54 , 0x54 , 0x54 , 0x18 ], 'f' : [ 0x08 , 0x7e , 0x09 , 0x01 , 0x02 ], 'g' : [ 0x0c , 0x52 , 0x52 , 0x52 , 0x3e ], 'h' : [ 0x7f , 0x08 , 0x04 , 0x04 , 0x78 ], 'i' : [ 0x00 , 0x44 , 0x7d , 0x40 , 0x00 ], 'j' : [ 0x20 , 0x40 , 0x44 , 0x3d , 0x00 ], 'k' : [ 0x7f , 0x10 , 0x28 , 0x44 , 0x00 ], 'l' : [ 0x00 , 0x41 , 0x7f , 0x40 , 0x00 ], 'm' : [ 0x7c , 0x04 , 0x18 , 0x04 , 0x78 ], 'n' : [ 0x7c , 0x08 , 0x04 , 0x04 , 0x78 ], 'o' : [ 0x38 , 0x44 , 0x44 , 0x44 , 0x38 ], 'p' : [ 0x7c , 0x14 , 0x14 , 0x14 , 0x08 ], 'q' : [ 0x08 , 0x14 , 0x14 , 0x18 , 0x7c ], 'r' : [ 0x7c , 0x08 , 0x04 , 0x04 , 0x08 ], 's' : [ 0x48 , 0x54 , 0x54 , 0x54 , 0x20 ], 't' : [ 0x04 , 0x3f , 0x44 , 0x40 , 0x20 ], 'u' : [ 0x3c , 0x40 , 0x40 , 0x20 , 0x7c ], 'v' : [ 0x1c , 0x20 , 0x40 , 0x20 , 0x1c ], 'w' : [ 0x3c , 0x40 , 0x30 , 0x40 , 0x3c ], 'x' : [ 0x44 , 0x28 , 0x10 , 0x28 , 0x44 ], 'y' : [ 0x0c , 0x50 , 0x50 , 0x50 , 0x3c ], 'z' : [ 0x44 , 0x64 , 0x54 , 0x4c , 0x44 ], '{' : [ 0x00 , 0x08 , 0x36 , 0x41 , 0x00 ], '|' : [ 0x00 , 0x00 , 0x7f , 0x00 , 0x00 ], '}' : [ 0x00 , 0x41 , 0x36 , 0x08 , 0x00 ], '~' : [ 0x10 , 0x08 , 0x08 , 0x10 , 0x08 ], '\x7f' : [ 0x00 , 0x7e , 0x42 , 0x42 , 0x7e ], } X = 13 Y = 5 class PCD8544( object ): """Nokia 5110/3310 PCD8544-based LCD display.""" def __init__( self , dc, rst, sclk = None , din = None , cs = None , gpio = None , spi = None , vcc = None , bl = None ): self ._sclk = sclk self ._din = din self ._dc = dc self ._cs = cs self ._rst = rst self ._gpio = gpio self ._spi = spi self ._buffer = [ 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xC0 , 0xE0 , 0xF0 , 0xF8 , 0xFC , 0xFC , 0xFE , 0xFF , 0xFC , 0xE0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xF0 , 0xF0 , 0xE0 , 0xE0 , 0xC0 , 0x80 , 0xC0 , 0xFC , 0xFF , 0xFF , 0xFF , 0xFF , 0x7F , 0x3F , 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x0F , 0x1F , 0x3F , 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xE7 , 0xC7 , 0xC7 , 0x87 , 0x8F , 0x9F , 0x9F , 0xFF , 0xFF , 0xFF , 0xC1 , 0xC0 , 0xE0 , 0xFC , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC , 0xFC , 0xFC , 0xFC , 0xFE , 0xFE , 0xFE , 0xFC , 0xFC , 0xF8 , 0xF8 , 0xF0 , 0xE0 , 0xC0 , 0xC0 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x80 , 0xC0 , 0xE0 , 0xF1 , 0xFB , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x7F , 0x1F , 0x0F , 0x0F , 0x87 , 0xE7 , 0xFF , 0xFF , 0xFF , 0x1F , 0x1F , 0x3F , 0xF9 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xF8 , 0xFD , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0x7F , 0x3F , 0x0F , 0x07 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xF0 , 0xFE , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFE , 0x7E , 0x3F , 0x3F , 0x0F , 0x1F , 0xFF , 0xFF , 0xFF , 0xFC , 0xF0 , 0xE0 , 0xF1 , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFC , 0xF0 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03 , 0x03 , 0x03 , 0x03 , 0x03 , 0x03 , 0x03 , 0x03 , 0x01 , 0x01 , 0x01 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x03 , 0x0F , 0x1F , 0x3F , 0x7F , 0x7F , 0xFF , 0xFF , 0xFF , 0xFF , 0x7F , 0x7F , 0x1F , 0x03 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ] if self ._gpio is None : self ._gpio = GPIO.get_platform_gpio() self ._gpio.setup(vcc, GPIO.OUT) self ._gpio.setup(bl, GPIO.OUT) self ._gpio.output(vcc, 1 ) self ._gpio.output(bl, 1 ) if self ._rst is not None : self ._gpio.setup( self ._rst, GPIO.OUT) # Default to bit bang SPI. if self ._spi is None : self ._spi = SPI.BitBang( self ._gpio, self ._sclk, self ._din, None , self ._cs) # Set pin outputs. self ._gpio.setup( self ._dc, GPIO.OUT) # Initialize buffer to Adafruit logo. def command( self , c): """Send command byte to display.""" # DC pin low signals command byte. self ._gpio.set_low( self ._dc) self ._spi.write() def extended_command( self , c): """Send a command in extended mode""" # Set extended command mode self .command(PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION) self .command(c) # Set normal display mode. self .command(PCD8544_FUNCTIONSET) self .command(PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL) def begin( self , contrast = 40 , bias = 4 ): """Initialize display.""" self .reset() # Set LCD bias. self .set_bias(bias) self .set_contrast(contrast) def reset( self ): """Reset the display""" if self ._rst is not None : # Toggle RST low to reset. self ._gpio.set_low( self ._rst) time.sleep( 0.1 ) self ._gpio.set_high( self ._rst) def display( self ): """Write display buffer to physical display.""" # TODO: Consider support for partial updates like Arduino library. # Reset to position zero. self .command(PCD8544_SETYADDR) self .command(PCD8544_SETXADDR) # Write the buffer. self ._gpio.set_high( self ._dc) self ._spi.write( self ._buffer) def clear( self ): """Clear contents of image buffer.""" self ._buffer = [ 0 ] * (LCDWIDTH * LCDHEIGHT / / 8 ) def set_contrast( self , contrast): """Set contrast to specified value (should be 0-127).""" contrast = max ( 0 , min (contrast, 0x7f )) # Clamp to values 0-0x7f self .extended_command(PCD8544_SETVOP | contrast) def set_bias( self , bias): """Set bias""" self .extended_command(PCD8544_SETBIAS | bias) def draw_str( self , y, s): """修改显示数据,y 为第几行,s 为要显示的数据""" if (y > = Y ) or (y < 0 ): return False x = 0 for c in s[ 0 : 14 ]: try : self ._buffer[y * 84 + x * 6 : y * 84 + x * 6 + 6 ] = FONT + [ 0 ] except KeyError: pass x + = 1 def draw_char( self , x, y): pass def quit( self ): self ._gpio.cleanup() |
接线(BCM)
dc 13
rst 5
sclk 26
din 19
cs 6
vcc 20
bl 21
gnd 0v
显示信息
网速
显示路由器的网速,电脑网速就没必要了。
我用的是老毛子固件,所以用这个固件的可以参考我的代码。
代码量不大,我就没写注释了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | # 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)。
开始显示
代码量同样不大,没写注释。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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
安装 Python 库
Adafruit_GPIO
Adafruit_DHT
requests
运行
1 | python main.py |
成果
作者:简书 Bankroft
这手机的液晶屏能不能模块化?就像VGA的液晶显示器一样,使用统一的标准接口?使得即使是Nokia手机主板也可以连接其他手机上的液晶屏作为显示器
这个需要其他手机支持的。5110的屏幕已经是模块化的了。