Skip to main content

Grove - OLED 显示屏 1.12&#34

我们的全新 1.12 英寸 OLED 显示屏非常适合需要小型显示屏且支持 16 级灰度的场景。OLED 的可视部分对角线尺寸为 1.12 英寸,包含 96x96(版本 1.0)或 128x128(版本 2.0)灰度像素。由于显示屏使用 OLED 技术,因此无需背光,且对比度非常高。

此 OLED 使用 SSD1327(V1.0)或 SH1107G(V2.1)驱动芯片来管理显示屏。您可以通过 4 线 I2C(时钟、数据、电源和接地引脚)与驱动芯片通信。

pir

规格

  • 通信模式:I2C
  • 灰度显示:16 级灰度
  • 支持正常和反色显示
  • 支持连续水平滚动
  • Grove 兼容接口

版本


产品版本变更发布日期
Grove - OLED 显示屏 1.12" V1.0初始版本2012 年 3 月
Grove - OLED 显示屏 1.12" V2.1驱动 IC 从 SSD1327 更改为 SH1107G,灰度像素从 96X96 升级到 128X1282015 年 11 月

详细规格


项目参数值
工作电压3.3/5 V
点阵96x96
显示颜色16 级灰度
OLED 显示屏LY120-96096
驱动芯片SSD1327Z
点大小0.15(W)mm x 0.15(H)mm
点间距0.75(W)mm x 0.175(H)mm
工作温度-40~70 oC
tip

更多关于 Grove 模块的详细信息,请参考 Grove 系统

支持的平台

Arduino树莓派

pir

pir

caution

上述提到的支持平台仅表示模块的软件或理论兼容性。在大多数情况下,我们仅为 Arduino 平台提供软件库或代码示例。不可能为所有可能的 MCU 平台提供软件库或演示代码。因此,用户需要自行编写软件库。

入门指南

使用 Arduino

硬件

在这里,我们将通过一个简单的演示向您展示如何使用 Grove - OLED 显示屏。首先,您需要准备以下物品:

Seeeduino V4Grove - OLED 显示屏 1.12``基础扩展板

pir

pir

pir

立即购买立即购买立即购买

这是一个易于使用的模块,您需要做的就是将模块连接到基础扩展板的 I2C 接口。模块有 4 个引脚,定义如下:

引脚功能说明电缆颜色
pin1SCLI2C 时钟黄色
pin2SDAI2C 数据白色
pin3VCC电源,5V/3.3V红色
pin4GND地线黑色

硬件概览

软件

  • 步骤 1. 通过 Grove 电缆将 Grove - OLED 显示屏 1.12'' 连接到基础扩展板的 I2C 接口。

  • 步骤 2. 打开 Arduino IDE 并通过库管理器 (Sketch > Include Library > Manage Libraries) 安装 u8g2 库。

  • 步骤 3. 在搜索框中输入 "u8g2",选择最新版本并点击 "Install" 按钮。
  • 步骤 4. 在 Arduino IDE 中上传以下演示代码。
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>

U8G2_SH1107_SEEED_128X128_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);

void setup(void) {
u8g2.begin();
}

void loop(void) {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB10_tr);
u8g2.drawStr(0,24,"Hello World!");
} while ( u8g2.nextPage() );
}
success

如果一切正常,Grove - OLED 显示屏 1.12'' 的屏幕上将显示 "Hello World!"。

note

如果您没有基础扩展板,Seeeduino Vx 系列 具有 I2C 接口,也可以正常工作。

U8g2 库介绍

U8g2 是一个用于嵌入式设备的单色图形库。U8g2 支持单色 OLED 和 LCD,包括我们的芯片 SSD1327/SH1107G。

Arduino 的 U8g2 库可以通过 Arduino IDE 的库管理器安装。U8g2 还包括 U8x8 库:

U8g2

  • 包含所有图形处理功能(线条/框/圆形绘制)。
  • 支持多种字体。字体高度几乎没有限制。
  • 需要在微控制器中占用一些内存来渲染显示。

U8x8

  • 仅支持文本输出(字符设备)。
  • 仅允许适合 8x8 像素网格的字体。
  • 直接写入显示屏。不需要在微控制器中使用缓冲区。

这里提供了 U8g2 库 Wiki 以及 U8g2 API 参考 页面。

使用 Raspberry Pi(搭配 Grove 基础帽)

硬件

  • 步骤 1. 本项目所需物品:
Raspberry PiGrove 基础帽 Grove - OLED 显示屏 1.12''
  • 步骤 2. 将 Grove 基础帽插入 Raspberry Pi。
  • 步骤 3. 将 Grove - OLED 显示屏 1.12'' 连接到基础帽的 I2C 接口。
  • 步骤 4. 通过 USB 电缆将 Raspberry Pi 连接到电脑。

软件

  • 步骤 1. 按照 软件设置 配置开发环境,并在 Raspberry Pi 上安装 grove.py。
  • 步骤 2. 执行以下命令运行代码。
# Python3 的虚拟环境
virtualenv -p python3 env
source env/bin/activate
#输入命令
grove_lcd_1.2inches

以下是 sh1107g.py 的代码。

'''
这是以下产品的代码:
- `Grove - 16 x 2 LCD (黑底红字) <https://www.seeedstudio.com/Grove-16-x-2-LCD-Black-on-Re-p-3197.html>`_
- `Grove - 16 x 2 LCD (黑底黄字) <https://www.seeedstudio.com/Grove-16-x-2-LCD-Black-on-Yello-p-3198.html>`_
- `Grove - 16 x 2 LCD (白底蓝字) <https://www.seeedstudio.com/Grove-16-x-2-LCD-White-on-Blu-p-3196.html>`_

示例:

.. code-block:: python

import time
from grove.factory import Factory

# LCD 16x2 字符
lcd = Factory.getDisplay("JHD1802")
rows, cols = lcd.size()
print("LCD 型号: {}".format(lcd.name))
print("LCD 类型 : {} x {}".format(cols, rows))

lcd.setCursor(0, 0)
lcd.write("hello world!")
lcd.setCursor(0, cols - 1)
lcd.write('X')
lcd.setCursor(rows - 1, 0)
for i in range(cols):
lcd.write(chr(ord('A') + i))

time.sleep(3)
lcd.clear()
'''
from grove.display.base import *
# from upm.pyupm_lcd import *
from grove.i2c import Bus
import sys

# sphinx autoapi 必需
__all__ = ["SH1107G"]

BasicFont = [
[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
[0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00],
[0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00],
[0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00],
[0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00],
[0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00],
[0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00],
[0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00],
[0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00],
[0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00],
[0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00],
[0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00],
[0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00],
[0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00],
[0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00],
[0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00],
[0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00],
[0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00],
[0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00],
[0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00],
[0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00],
[0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00],
[0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00],
[0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00],
[0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00],
[0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00],
[0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00],
[0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00],
[0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00],
[0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00],
[0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00],
[0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00],
[0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00],
[0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00],
[0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00],
[0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00],
[0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00],
[0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00],
[0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00],
[0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00],
[0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00],
[0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00],
[0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00],
[0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00],
[0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00],
[0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00],
[0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00],
[0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00],
[0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00],
[0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00],
[0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00],
[0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00],
[0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00],
[0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00],
[0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00],
[0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00],
[0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00],
[0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00],
[0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00],
[0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00],
[0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00],
[0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00],
[0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00],
[0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00],
[0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00],
[0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00],
[0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00],
[0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00],
[0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00],
[0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00],
[0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00],
[0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00],
[0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00],
[0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00],
[0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00],
[0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00],
[0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00],
[0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00],
[0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00],
[0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00],
[0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00],
[0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00],
[0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00],
[0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00],
[0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00],
[0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00],
[0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00],
[0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00],
[0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00],
[0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00],
[0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00],
[0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00],
[0x00,0x00,0x7F,0x00,0x00,0x00,0x00],
[0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00],
[0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00],
[0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00],
]

class SH1107G(Display):
'''
OLED 显示屏 1.12"(v2) 使用芯片 SH1107G。

参数:
address(int): I2C 设备地址,默认为 0x3E。
'''
MAX_GRAY = 100
_REG_CMD = 0x00
_REG_DATA = 0x40
_PAGE_CNT = 16
_PAGE_BYTES = 128
_TOTAL_BYTES= _PAGE_CNT * _PAGE_BYTES

_DISPLAY_CMD_OFF = 0xAE;
_DISPLAY_CMD_ON = 0xAF;

_BASE_LOW_COLUMN_ADDR = 0x00;
_BASE_HIGH_COLUMN_ADDR = 0x10;
_BASE_PAGE_START_ADDR = 0xB0;
def __init__(self, address = 0x3C):
super(SH1107G, self).__init__()
self._bus = Bus()
self._addr = address

if self._bus.write_byte(self._addr, 0):
print("检查是否插入了 OLED SH1107G,然后重试")
sys.exit(1)

id = self._bus.read_byte_data(self._addr, SH1107G._REG_CMD)
# print(" id = 0x{:2x}".format(id))
self._sh1107 = (id & 0x3F) == 0x07

blk = [0xAE] # 显示关闭
blk.append(0xD5) # 设置 Dclk
blk.append(0x50) # 100Hz
blk.append(0x20) # 设置行地址
blk.append(0x81) # 设置对比度控制
blk.append(0x80)
blk.append(0xA0) # 段重映射
blk.append(0xA4) # 设置整个显示屏开启
blk.append(0xA6) # 正常显示
blk.append(0xAD) # 设置外部 VCC
blk.append(0x80)
blk.append(0xC0) # 设置公共扫描方向
blk.append(0xD9) # 设置相位长度
blk.append(0x1F)
blk.append(0xDB) # 设置 Vcomh 电压
blk.append(0x27)
blk.append(0xAF) # 显示开启
blk.append(0xB0)
blk.append(0x00)
blk.append(0x10)
self._cmds(blk)
self.clear()

def _cmd(self, cmd):
try:
self._bus.write_byte_data(self._addr,
SH1107G._REG_CMD, cmd)
except IOError:
print("*** 检查是否插入了 OLED 模块 ***")
sys.exit(1)

def _cmds(self, cmds):
for c in cmds:
self._cmd(c)

def _datas(self, datas):
length = len(datas)
data = bytearray(length + 1)
data[0] = SH1107G._REG_DATA
for i in range(length):
data[i + 1] = datas[i]
try:
self._bus.write_i2c_block_data(self._addr,
SH1107G._REG_DATA, datas)
except IOError:
print("*** 检查是否插入了 OLED 模块 ***")
sys.exit(1)

@property
def name(self):
'''
获取设备名称

返回:
string: SH1107G/SSD1307 取决于插入的设备。
'''
return "SH1107G"

def type(self):
'''
获取设备类型

返回:
int: ``TYPE_GRAY``
'''
return TYPE_GRAY

def size(self):
'''
获取显示屏尺寸

返回:
(行数, 列数): 显示屏尺寸,以字符为单位。
'''
return 16, 16

def clear(self):
'''
清除屏幕并将光标定位到左上角。
'''
zeros = [ 0x0 for dummy in range(SH1107G._TOTAL_BYTES) ]
self.draw(zeros, SH1107G._TOTAL_BYTES)

def draw(self, data, bytes):
'''
快速传输/绘制大量数据(由 data 指定)到 OLED,
传输大小由 bytes 指定。

参数:
data (list of int): 要传输/绘制的数据
bytes (int) : 数据大小
'''

# 所有页面填充数据
for i in range(SH1107G._PAGE_CNT):
if i > bytes / SH1107G._PAGE_BYTES:
return
self._cmd(self._BASE_PAGE_START_ADDR + i)
self._cmd(self._BASE_LOW_COLUMN_ADDR)
self._cmd(self._BASE_HIGH_COLUMN_ADDR)
# 填充一个页面字节
for k in range(0, SH1107G._PAGE_BYTES, 32):
# I2C 每次传输限制为 32 字节
begin = i * SH1107G._PAGE_BYTES + k
end = begin + 32
self._datas(data[begin:end])

def home(self):
'''
将光标定位到 OLED 的左上角。
即,在显示屏上输出后续文本时使用该位置。
'''
self.setCursor(0, 0)

def setCursor(self, row, column):
'''
定位 OLED 光标;即设置位置,
后续写入 OLED 的文本将在该位置显示。

参数:
row (int): 光标定位的行,0 表示第一行
column(int): 光标定位的列,0 表示第一列

返回:
None
'''
self._cmd(self._BASE_PAGE_START_ADDR + row)
self._cmd(0x08 if column % 2 else self._BASE_LOW_COLUMN_ADDR)
self._cmd(self._BASE_HIGH_COLUMN_ADDR + (column >> 1))

def _putchar(self, c):
asc = ord(c)
if asc < 32 or asc > 127:
asc = ord(' ')
for i in range(8):
fontmap = []
fontmap.append(BasicFont[asc - 32][i])
self._datas(fontmap)

def write(self, msg):
'''
向 OLED 写入字符。

参数:
msg (string): 要写入显示屏的字符

返回:
None
'''
for i in range(len(msg)):
self._putchar(msg[i])

def _backlight_on(self, en):
self._cmd(self._DISPLAY_CMD_ON if en else self._DISPLAY_CMD_OFF)


def main():
import time

oled = SH1107G()
rows, cols = oled.size()
print("OLED 型号: {}".format(oled.name))
print("OLED 类型 : {} x {}".format(cols, rows))

oled.backlight(False)
time.sleep(1)

oled.backlight(True)
oled.setCursor(0, 0)
oled.write("hello world!")
oled.setCursor(0, cols - 1)
oled.write('X')
oled.setCursor(rows - 1, 0)
for i in range(cols):
oled.write(chr(ord('A') + i))

time.sleep(3)
oled.clear()

if __name__ == '__main__':
main()
(env)pi@raspberrypi:~ grove_lcd_1.2inches
success

如果一切正常,您将能够看到以下结果

您可以通过简单地按下 ctrl+c 来退出此程序。

在线原理图查看器

资源


项目

智能农作物:在传统农业中实施物联网! 我们与自然的使命是保护它,通过 Helium 的物联网设计和实施技术以及监测方法。

自动植物浇水系统 一个使用 ESP8266 和 Android 应用程序浇灌植物并监测温度的设备。

飞行 BeagleBone Green BBBmini 是一款先进的 Linux 自动驾驶仪/飞行控制器 Cape,适用于 BeagleBone。它可以用于无人机、飞机或探测车。

技术支持与产品讨论

感谢您选择我们的产品!我们提供多种支持渠道,以确保您使用我们的产品时体验顺畅。我们提供多种沟通方式,以满足不同的偏好和需求。

Loading Comments...