【实验番外篇】任务一:MY OLED~~启动I2C接口,驱动OLED屏
原计划其实是想驱动搁置了有一段时间了的ALIENTEK 2.8寸 TFT液晶屏,无奈LG的驱动IC兼容性上不知怎样,可能还需要一段时间才能搞定。还是先来移植一下手中的其他模块吧~~
最近一直强迫自己使用UBUNTU来调试RPi,才发现还是“同门”间好沟通啊,比在WINDOWS下操作还是方便啊~~
扯远啦。。。下面才是正题:
模块信息:OLED显示屏,128×64,标准I2C接口
VCC --> 3V3
SDA --> GPIO02(SDA1, I2C)
SCL --> GPIO03(SCL1, I2C)
GND --> GND
(一)启动I2C接口
1、打开模块配置文件
sudo nano /etc/modules
添加如下两项内容
i2c-bcm2708
i2c-dev
安装python-smbus系统管理总线接口和I2C调试工具
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
打开黑名单,把I2C放出来
sudo nano /etc/modprobe.d/raspi-blacklist.conf
将对应项目注释掉
然后,建议重启一下~~用lsmod指令查看一下驱动是否载入成功
使用i2cdetect -l指令查看树莓派上的I2C总线,树莓派1代使用的是I2C-0,树莓派2代使用的是I2C-1,后面编程时需要注意这点
使用i2cdetect -y 1指令扫描当前挂载的所有I2C从机,我的OLED屏默认地址是0x51,0x3b应该是RPi上的设备,UU代表设备忙
用i2cdump指令可以查看器件内部寄存器值,用法为i2cdump -y 总线号 设备地址,目前模块还没有开启,寄存器处于初始状态
PS:i2cget和i2cset指令:分别可以对寄存器进行获取和写入。用法为i2cget -y 总线号 设备地址 寄存器地址 模式和i2cset -y 总线号 设备地址 寄存器地址 数值 模式;模式默认为b(byte)即读取8bit数据,i2cget可用模式有b/w/c,i2cset可用模式有b/w/c/i/s,其中w为word(16bit),i和s分别为I2C和SMBUS的block数据。
2、代码移植及显示效果
这次依然用的还是python,新建了2个python脚本,一个用来存放显示代码,一个用来存放功能代码
显示代码如下:
# coding=utf-8
__author__ = 'chronos'
#!/usr/bin/python
import time
import oledFunc
# OLED I2C ADDRESS
oledaddress = 0x51
# OLED RESET
oledFunc.oledreset(oledaddress)
time.sleep(1)
#OLED DISPLAY STRING
oledFunc.oledstr(oledaddress, 0, 0, 'RaspberryPi DIY')
oledFunc.oledstr(oledaddress, 2, 0, ' CHRONOS OLED ')
while True:
# 读取CPU温度信息
file = open("/sys/class/thermal/thermal_zone0/temp")
# 读取结果,并转换为浮点数
temp = float(file.read()) / 1000
# 关闭文件
file.close()
# 显示CPU温度及当前系统时间
oledFunc.oledstr(oledaddress, 4, 0, 'CPU TEMP:'+str(temp))
oledFunc.oledstr(oledaddress, 6, 0, time.strftime("%y-%m%d %X"))
# 前两行文字向左滚动
oledFunc.oledscrollhorizontal(oledaddress, oledFunc.SCROLL_LEFT, 0, 3, oledFunc.FRAMS_2)
# 250ms更新一次
time.sleep(0.25)
功能代码:
# coding=utf-8
__author__ = 'chronos'
#!/usr/bin/python
import smbus
# open /dev/i2c-1
bus = smbus.SMBus(1)
# OLED FUNC CMD
WRITE_OCMD = 0x01
WRITE_ODAT = 0x02
OLED_RESET = 0x03
DISP_8X16STR = 0x10
DISP_AREA = 0x11
FILL_AREA = 0x12
SET_SCROHOR = 0x13
SET_SCROVER = 0x14
SET_SCROVERHOR = 0x15
SET_ADDRESS = 0x21
PAGE0 = 0x00
PAGE1 = 0x01
PAGE2 = 0x02
PAGE3 = 0x03
PAGE4 = 0x04
PAGE5 = 0x05
PAGE6 = 0x06
PAGE7 = 0x07
SCROLL_UP = 0x01
SCROLL_DOWN = 0x00
SCROLL_RIGHT = 0x26
SCROLL_LEFT = 0x27
SCROLL_VR = 0x29
SCROLL_VL = 0x2A
FRAMS_2 = 0x07
FRAMS_3 = 0x04
FRAMS_4 = 0x05
FRAMS_5 = 0x00
FRAMS_25 = 0x06
FRAMS_64 = 0x01
FRAMS_128 = 0x02
FRAMS_256 = 0x03
# OLED RESET
# 函数功能 :模块复位
# 第1个参数:为模块的地址
def oledreset(addr):
bus.write_byte(addr, OLED_RESET)
# OLED FILLAREA
# 函数功能 :在指定的范围填充指定的数据
# 第1个参数:为模块的地址
# 第2个参数:所要填充数据的起始页
# 第3个参数:所要填充数据的结束页
# 第4个参数:所要填充数据的起始列
# 第5个参数:所要填充数据的结束列
# 第6个参数:所要填充的数据
def oledfillarea(addr, spage, epage, scolumn, ecolumn, filldata):
buff = [spage, epage, scolumn, ecolumn, filldata]
bus.write_i2c_block_data(addr, FILL_AREA, buff)
# OLED DISPLAY STRING
# 函数功能 :在指定的地方开始显示指定点阵数据图英文字符串
# 第1个参数:为模块的地址
# 第2个参数:所要显示英文字符串的起始页
# 第3个参数:所要显示英文字符串的起始列
# 第4个参数:所要显示的英文字符串
def oledstr(addr, page, column, strs):
buff = [page, column]
lstr = map(ord, strs)
buff.extend(lstr)
bus.write_i2c_block_data(addr, DISP_8X16STR, buff)
# OLED Scroll Horizontal
# 函数功能 :指定区域显示的内容向左还是向右翻滚
# 第1个参数:为模块的地址
# 第2个参数:指定向左还是向右翻滚 SCROLL_LEFT SCROLL_RIGHT
# 第3个参数:要翻滚的起始页
# 第4个参数:要翻滚的结束页
# 第3个参数:翻滚帧
def oledscrollhorizontal(addr, lr, spage, epage, frames):
buff = [lr, spage, epage, frames]
bus.write_i2c_block_data(addr, SET_SCROHOR, buff)
# OLED Scroll Vertical
# 函数功能 :指定区域显示的内容向上翻或向下翻
# 第1个参数:为模块的地址
# 第2个参数:指定向上或者向下翻滚 SCROLL_UP SCROLL_DOWN
# 第3个参数:最上方翻滚起始行
# 第4个参数:最下方翻滚结束行
# 第3个参数:翻滚步数大小
# 第4个参数:翻滚快慢延时
def oledscrollvertical(addr, scrollupdown, rowsfixed, rowsscroll, scrollstep, stepdelay):
buff = [scrollupdown, rowsfixed, rowsscroll, scrollstep, stepdelay]
bus.write_i2c_block_data(addr, SET_SCROVER, buff)
# OLED Scroll Mixed
def oledscrollmixed(addr, fixedarea, scrollarea, vlr, spage, epage, frames, offset):
buff = [fixedarea, scrollarea, vlr, spage, epage, frames, offset]
bus.write_i2c_block_data(addr, SET_SCROVERHOR, buff)
# OLED Deactivate Scroll
# 函数功能 :显示的内容停止翻滚
# 第1个参数:为模块的地址
def oleddeactivatescroll(addr):
bus.write_byte_data(addr, WRITE_OCMD, 0x2E)
# OLED Set Location
def oledsetlocation(addr, page, column):
buff = [0xB0 | page, column % 16, column/16+0x10]
bus.write_i2c_block_data(addr, WRITE_OCMD, buff)
上传视频,大家看看效果哈~~
http://v.youku.com/v_show/id_XNzgwNDM1NDc2.html