I2C接口的OLED在树莓派3上的应用(luma.oled驱动)

2016年9月写过一篇blog记录了如何将12864的OLED小显示屏应用到树莓派上。时至今日,当初给出的链接虽然还在,但已经有了 翻天覆地的更新,因此有必要重新学习下新的方法。

参考资料:http://shumeipai.nxez.com/2017/09/13/solve-the-raspberry-pi-drive-oled-problem.html#more-3449

接线方式未变,如下图,按颜色对应:


记得在raspi-config里启用I2C。

然后下载一些必备工具:

sudo apt-get install -y python-smbus
sudo apt-get install -y i2c-tools

运行一下 sudo i2cdetect -y 1

正常情况下默认在0x3C处有标注,这就说明接线成功了。

继续下载:

sudo apt-get install libfreetype6-dev libjpeg-dev build-essential

然后,如果使用python3:

sudo apt-get install python3-dev python3-pip
sudo -H pip3 install --upgrade luma.oled

如果决定还是用python2的,那就只需要简单的把上述命令行中的所有出现的3去掉即可。当然2和3也可以共存。装的过程可能会比较慢,耐心等待一下。

然后就可以写个python脚本测试了:

from luma.core.interface.serial import i2c, spi
from luma.core.render import canvas
from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106

serial = i2c(port=1, address=0x3C)
device = sh1106(serial)

with canvas(device) as draw:
    #draw.rectangle(device.bounding_box, outline="white", fill="black")
    draw.text((30, 40), "Hello World", fill="white")

注意 device = sh1106(serial) 这句。如果你是ssd1306的,可以把sh1106替换成ssd1306。我手头的屏一直以为是ssd1306的(包括给Arduino用的时候也是按ssd1306做初始化,没有任何问题),但是今次用ssd1306去初始化,python能运行,屏幕内容却闪退;改成原始的sh1106就正常。先不管,继续测。

改了一下原先的脚本,可以继续正常显示连接wifi获取到的IP地址:

#!/usr/bin/env python3

from luma.core.interface.serial import i2c, spi
from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106
from luma.core.render import canvas
from PIL import ImageDraw, ImageFont

import socket
import fcntl
import struct
#from subprocess import Popen,PIPE

def getIP(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    return socket.inet_ntoa(fcntl.ioctl( 
        s.fileno(), 
        0x8915,  # SIOCGIFADDR 
        struct.pack('256s', ifname[:15].encode('utf-8')) 
    )[20:24])

def stats(oled):
    font = ImageFont.load_default()
    font2 = ImageFont.truetype('/usr/share/fonts/truetype/freefont/FreeSans.ttf', 14)
    with canvas(oled) as draw:
        draw.text((2, 5), "IP: " + getIP("wlan0"), font=font2, fill=255)


def main():
    serial = i2c(port=1, address=0x3C)
    oled = sh1106(serial)
    stats(oled)

if __name__ == "__main__":
    main()

更多示例在:https://github.com/rm-hull/luma.examples


这次用Zero W来测试的。附送一个彩蛋:关闭Zero W的LED指示灯。这样做的东西在夜间能避免灯光干扰。我是无所谓,但可能有人对此敏感。

修改/boot/config.txt,加两句:
dtparam=act_led_trigger=none
dtparam=act_led_activelow=on

保存后执行:
echo 1 | sudo tee /sys/class/leds/led0/brightness

最后重启即可。


猜你喜欢

转载自blog.csdn.net/ki1381/article/details/79291138