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
最后重启即可。