之前我们已经介绍过使用LED数码管显示我们想要的信息。但是数码管的显示内容有限,仅能显示数字、部分字母和符号。如果我们想要显示更多的信息,如汉字,图形等,那我们就需要更好的显示设备。

显示器在我们日常生活中已经随处可见。常见的显示器主要有以下几种:CTR显示器、LCD显示器、LED显示器。

CRT显示器:CRT显示器是一种使用阴极射线管的显示器,阴极射线管主要有五部分组成,分别是电子枪,偏转线圈,荫罩,荧光粉层及玻璃外壳。CRT纯平显示器具有可视角度大、无坏点、色彩还原度高、色度均匀、可调节的多分辨率模式、响应时间极短等LCD显示器难以超过的优点。我们以前的老式电视机,电脑显示屏就是这种显示器,最大的缺点就是体积太大。

树莓派触摸屏加模组(0.96寸OLED显示屏模块介绍)(1)

CRT显示器

LCD显示器:LCD显示器即液晶显示器,优点是机身薄,占地小,辐射小。LCD液晶显示器的工作原理,在显示器内部有很多液晶粒子,它们有规律地排列成一定的形状,并且它们的每一面的颜色都不同分为:红色,绿色,蓝色。这三原色能还原成任意的其他颜色,当显示器收到电脑的显示数据的时候会控制每个液晶粒子转动到不同颜色的面,来组合成不同的颜色和图像。也因为这样液晶显示屏的缺点是色彩不够艳,可视角度不够高等。

树莓派触摸屏加模组(0.96寸OLED显示屏模块介绍)(2)

LCD显示器:

LED显示器:它是一种通过控制半导体发光二极管的显示方式,用来显示文字、图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。LED显示器已广泛应用于大型广场、商业广告、体育场馆、信息传播、新闻发布、证券交易等,可以满足不同环境的需要。

树莓派触摸屏加模组(0.96寸OLED显示屏模块介绍)(3)

大型LED显示器


在一般的机器人、智能小车的应用中并不需要显示太多的内容,我们今天就来介绍一块非常迷你的显示屏——0.96寸OLED显示屏模块。

树莓派触摸屏加模组(0.96寸OLED显示屏模块介绍)(4)

0.96寸OLED显示屏模块

模块介绍

OLED,即有机发光二极管(OrganicLight-EmittingDiode,OLED),又称为有机电激光显示。有机发光显示技术由非常薄的有机材料涂层和玻璃基板构成。当有电荷通过时这些有机材料就会发光。该显示模块,支持多种控制芯片,完全兼容Arduino,51系列,MSP430系列,STM32 / 2,CSR IC等。屏幕仅有0.96寸,小巧玲珑,全屏点亮时功耗仅0.08W,超高亮度和对比度可调。

模块参数:

驱动芯片

SSD1306

支持接口

I2C

分辨率

128×64

显示尺寸

0.96英寸

显示颜色

白光/蓝光/黄蓝双色(黄蓝双色为上黄下蓝固定区域不可变动)

外形尺寸

27.5×27.8(mm)

玻璃尺寸

26.7×19.26×1.4(mm)

显示区域

21.74(W)×10.864(mm)

点间距

0.17×0.17(mm)

点大小

0.15×0.15(mm)

管脚数

4针

工作温度

-20℃~70℃

存储温度

-30℃~80℃

工作电压

5V / 3.3V

引脚定义:

尺寸图示:

树莓派触摸屏加模组(0.96寸OLED显示屏模块介绍)(5)

电路图:

树莓派触摸屏加模组(0.96寸OLED显示屏模块介绍)(6)

树莓派驱动实例

硬件设备:

接线图:

树莓派4B有专用的IIC接口,引脚3,5接屏幕的SDA和SCL两个引脚,连上电源就OK了。

树莓派触摸屏加模组(0.96寸OLED显示屏模块介绍)(7)

树莓派4B引脚图

程序:

我们在树莓派上使用python程序编程。

如果要在屏幕上显示汉字,我们需要知道汉字的字模。我们采用PCtoLCD2002字模软件取字,方法如下:

树莓派触摸屏加模组(0.96寸OLED显示屏模块介绍)(8)

字模如下:

# 小(0) 煜(1) 创(2) 客(3) 世(4) 界(5) fonts={ 此处改:[0x01,0x01,0x01,0x01,0x01,0x11,0x11,0x11,0x21,0x21,0x41,0x81,0x01,0x01,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x04,0x02,0x02,0x02,0x00,0x00,0x00,0x00],#小0 此处改:[0x10,0x11,0x11,0x15,0x59,0x51,0x51,0x90,0x10,0x13,0x10,0x29,0x24,0x40,0x47,0x80,0x00,0xFC,0x04,0xFC,0x04,0xFC,0x04,0x40,0x20,0xFE,0x00,0x04,0x88,0x00,0xFE,0x00],#煜1 此处改:[0x08,0x08,0x14,0x12,0x21,0x40,0xBE,0x22,0x22,0x22,0x2A,0x24,0x20,0x20,0x1F,0x00,0x04,0x04,0x04,0x24,0x24,0xA4,0x24,0x24,0x24,0x24,0x24,0x24,0x84,0x84,0x94,0x08],#创2 此处改:[0x02,0x01,0x7F,0x40,0x88,0x0F,0x10,0x2C,0x03,0x1C,0xE0,0x1F,0x10,0x10,0x1F,0x10,0x00,0x00,0xFE,0x02,0x04,0xF0,0x20,0x40,0x80,0x70,0x0E,0xF0,0x10,0x10,0xF0,0x10],#客3 此处改:[0x02,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x13,0x10,0x10,0x10,0x1F,0x00,0x20,0x20,0x20,0x20,0x20,0xFE,0x20,0x20,0x20,0x20,0xE0,0x00,0x00,0x00,0xFC,0x00],#世4 此处改:[0x00,0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x02,0x0C,0x34,0xC4,0x04,0x08,0x08,0x10,0x00,0xF0,0x10,0x10,0xF0,0x10,0x10,0xF0,0x80,0x60,0x58,0x46,0x40,0x40,0x40,0x40],#界5 }

仔细看会发现字模中还有“此处改”的汉字,这个位置等同于汉字的地址;我们需要把对应的汉字转为16进制编码,python程序如下。

# txt2hex为建字模用的。 # 将中文转成16进制编码 def txt2hex(ch_str): for k in ch_str: code = 0x00 data_code = k.encode("utf-8") code |= data_code[0] << 16 code |= data_code[1] << 8 code |= data_code[2] print(k " " hex(code)) txt2hex('小煜创客世界')

运行程序得到:

小 0xe5b08f 煜 0xe7859c 创 0xe5889b 客 0xe5aea2 世 0xe4b896 界 0xe7958c

将编码填入字模中,最后得到:

# 小(0) 煜(1) 创(2) 客(3) 世(4) 界(5) fonts={ 0xe5b08f:[0x01,0x01,0x01,0x01,0x01,0x11,0x11,0x11,0x21,0x21,0x41,0x81,0x01,0x01,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x04,0x02,0x02,0x02,0x00,0x00,0x00,0x00],#小0 0xe7859c:[0x10,0x11,0x11,0x15,0x59,0x51,0x51,0x90,0x10,0x13,0x10,0x29,0x24,0x40,0x47,0x80,0x00,0xFC,0x04,0xFC,0x04,0xFC,0x04,0x40,0x20,0xFE,0x00,0x04,0x88,0x00,0xFE,0x00],#煜1 0xe5889b:[0x08,0x08,0x14,0x12,0x21,0x40,0xBE,0x22,0x22,0x22,0x2A,0x24,0x20,0x20,0x1F,0x00,0x04,0x04,0x04,0x24,0x24,0xA4,0x24,0x24,0x24,0x24,0x24,0x24,0x84,0x84,0x94,0x08],#创2 0xe5aea2:[0x02,0x01,0x7F,0x40,0x88,0x0F,0x10,0x2C,0x03,0x1C,0xE0,0x1F,0x10,0x10,0x1F,0x10,0x00,0x00,0xFE,0x02,0x04,0xF0,0x20,0x40,0x80,0x70,0x0E,0xF0,0x10,0x10,0xF0,0x10],#客3 0xe4b896:[0x02,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x13,0x10,0x10,0x10,0x1F,0x00,0x20,0x20,0x20,0x20,0x20,0xFE,0x20,0x20,0x20,0x20,0xE0,0x00,0x00,0x00,0xFC,0x00],#世4 0xe7958c:[0x00,0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x02,0x0C,0x34,0xC4,0x04,0x08,0x08,0x10,0x00,0xF0,0x10,0x10,0xF0,0x10,0x10,0xF0,0x80,0x60,0x58,0x46,0x40,0x40,0x40,0x40],#界5 }

使用树莓派驱动屏幕还需要安装库:Adafruit_SSD1306,安装过程就不详细赘述了,可以自行百度。

显示小煜LOGO:

# 用0.96寸屏显示小煜LOGO # 导入所需模块 import time import Adafruit_GPIO.SPI as SPI import Adafruit_SSD1306 from PIL import Image from PIL import ImageDraw from PIL import ImageFont # Raspberry Pi pin configuration: RST = None # 128x64 display with hardware I2C: disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST) # Initialize library. disp.begin() # Clear display. disp.clear() disp.display() # Make sure to create image with mode '1' for 1-bit color. width = disp.width #128 height = disp.height #64 image = Image.new('1', (width, height)) # Get drawing object to draw on image. draw = ImageDraw.Draw(image) # 调用默认字体,或者自行设置指定字体 font = ImageFont.load_default() font16 = ImageFont.truetype('/usr/share/fonts/truetype/ttf-bitstream-vera/VeraBd.ttf', 16) ################################### ## 汉字部分 ################################### #1、先建立字模,可以用 pc2lcd2002完美版 软件,设置如下,即可生成字模,注意字模选项要如图设置 #2、将每个中文字转成16进制编码, 可用下面的模块【txt2hex】生成对应关系 如(小= 0xe5b08f) #3、把字模每行开头的【改此处】替换为这个汉字的16进制数, #4、最终字模结果如下: fonts={ 0xe5b08f: [0x01,0x01,0x01,0x01,0x01,0x11,0x11,0x11,0x21,0x21,0x41,0x81,0x01,0x01,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x04,0x02,0x02,0x02,0x00,0x00,0x00,0x00],#小",0 0xe7859c:[0x10,0x11,0x11,0x15,0x59,0x51,0x51,0x90,0x10,0x13,0x10,0x29,0x24,0x40,0x47,0x80,0x00,0xFC,0x04,0xFC,0x04,0xFC,0x04,0x40,0x20,0xFE,0x00,0x04,0x88,0x00,0xFE,0x00],#煜",1 0xe5889b:[0x08,0x08,0x14,0x12,0x21,0x40,0xBE,0x22,0x22,0x22,0x2A,0x24,0x20,0x20,0x1F,0x00,0x04,0x04,0x04,0x24,0x24,0xA4,0x24,0x24,0x24,0x24,0x24,0x24,0x84,0x84,0x94,0x08],#创",2 0xe5aea2:[0x02,0x01,0x7F,0x40,0x88,0x0F,0x10,0x2C,0x03,0x1C,0xE0,0x1F,0x10,0x10,0x1F,0x10,0x00,0x00,0xFE,0x02,0x04,0xF0,0x20,0x40,0x80,0x70,0x0E,0xF0,0x10,0x10,0xF0,0x10],#客",3 0xe4b896:[0x02,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x13,0x10,0x10,0x10,0x1F,0x00,0x20,0x20,0x20,0x20,0x20,0xFE,0x20,0x20,0x20,0x20,0xE0,0x00,0x00,0x00,0xFC,0x00],#世",4 0xe7958c:[0x00,0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x02,0x0C,0x34,0xC4,0x04,0x08,0x08,0x10,0x00,0xF0,0x10,0x10,0xF0,0x10,0x10,0xF0,0x80,0x60,0x58,0x46,0x40,0x40,0x40,0x40],#界",5 } #在屏幕上显示汉字, txt2lcd("字符串内容",屏幕x坐标,屏幕y坐标),支持中英文混显 def txt2lcd(ch_str, xx, yy): for k in ch_str: print(k) if k in ("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijlkmnopqrstuvwxyz,.!(') "): #如果当前字符是英文、数字或标点,则直接调用自身字库显示,内容可以自己修改 draw.text((xx,yy), k,font=font16, fill=255) xx=xx 12 else: #如果检测到当前字符是中文,则直接调用自定义的字模显示 code = 0x00 # 将中文转成16进制编码 data_code = k.encode("utf-8") code |= data_code[0] << 16 code |= data_code[1] << 8 code |= data_code[2] byte_data = fonts[code] for y in range(0, 16): left8 = bin(byte_data[y]).replace('0b', '') left8 = ('00000000' left8)[-8:] #如果不足8位,直接补齐8位,如从0010,补齐成00000010,代表汉字每一行左半部分8个像素点。0代表像素点不亮,1代表像素点亮 right8 = bin(byte_data[y 16]).replace('0b', '') right8 = ('00000000' right8)[-8:] #代表汉字每一行右半部分8个像素点 all16 = left8 right8 #拼成每一行16个像素点 #print(all16) for x in range(0, 16): #开始循环检测,如果是1,则在这个位置点亮像素点 if all16[x] == "1" : weizhi=(xx x,yy y) draw.point(weizhi,fill=255) xx=xx 16 #显示完一个汉字,显示下一个时,x位置向右移16像素 ######################### # 主程序循环开始 ######################### while True: # 先清理屏幕 draw.rectangle((0,0,width,height), outline=0, fill=0) # 使用draw.polygon 画出三个四边形 draw.polygon([(47, 9), (47, 33), (68, 46),(68, 21)], outline=255, fill=1) draw.polygon([(56, 12), (73, 3), (90, 12),(73, 22)], outline=255, fill=1) draw.polygon([(70, 26), (70, 46), (87, 36),(87, 16)], outline=255, fill=1) # 显示中文 txt2lcd('小煜创客世界',20,48) # txt2lcd('显示内容',坐标) # 刷新屏幕,显示内容 disp.image(image) disp.display() # 每隔几秒刷新一次 time.sleep(0.1)

结果展示:

树莓派触摸屏加模组(0.96寸OLED显示屏模块介绍)(9)

显示动态图片:

#用0.96寸屏显示动态图片 import time import Adafruit_GPIO.SPI as SPI import Adafruit_SSD1306 from PIL import Image # Raspberry Pi pin configuration: RST = None # Note the following are only used with SPI: DC = 23 SPI_PORT = 0 SPI_DEVICE = 0 # 128x64 display with hardware I2C: disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST) # Initialize library. disp.begin() # Clear display. disp.clear() disp.display() while True: i = 0 for i in range(51): #循环读取所有图片依次显示 # Load image based on OLED display height. Note that image is converted to 1 bit color. image = Image.open('/home/pi/Documents/python/P3/' str(i) '.png').convert('1') disp.image(image) disp.display() # 刷新屏幕,显示内容 # 每隔几秒刷新一次 time.sleep(0.01)

原图:

树莓派触摸屏加模组(0.96寸OLED显示屏模块介绍)(10)

显示结果:

,