雖然樹莓派本身可以透過HDMI連接到大尺寸的螢幕上,但是在把它當作是物聯網裝置時,讓它可以在一些小尺寸的螢幕上顯示一些必要的資訊也是很常見的應用。除了在上一篇文章中介紹的,如何在LCD上顯示資料之外,本篇會整理一下在0.96吋的OLED SSD1306上顯示資訊所需要的程式碼。
先來看看本篇文章的主角:
至於連線的部份,因為它使用了I2C介面,所以除了把樹莓派上的5V和GND接到ssd1306上的VCC和GND之外,另外兩條線SDA和SCL,樹莓派把它們分別放在實體編號3和實體編號5的那兩支接腳上,在連接上應該沒有太大的難度。
連接完畢之後,可以執行以下的指令,檢查是否可以順利找到已連接的I2C裝置:
i2cdetect -y 1
執行結果應該看起來會像是下面這個樣子:
看到那個3c就表示連接正常。接著,最重要的是要裝對模組,先來看安裝所需要的是哪一個模組:
pip install adafruit-circuitpython-ssd1306
以下是簡單的測試程式碼:
from board import SCL, SDA
import busio
import adafruit_ssd1306
i2c = busio.I2C(SCL, SDA)
display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
display.fill(1)
display.show()
上述程式在執行之後,如果你的SSD1306的連接線是正常的話,就會在畫面上看到所有的像素都被點亮的情況。
那麼應該如何顯示出文字呢?只要利用PIL模組裡面的功能,然後再用圖像的方式把準備好的文字貼上去就可以了。首先需要安裝pillow模組如下:
pip install pillow
以下是測試用的程式碼:
from board import SCL, SDA
import busio
import adafruit_ssd1306
from PIL import Image, ImageDraw, ImageFont
i2c = busio.I2C(SCL, SDA)
display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
display.fill(1)
display.show()
width, height = 128, 32
image = Image.new("1", (width, height))
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
draw.text((0,0), "Hello", font=font, fill=1)
draw.text((0, 10), "12345678", font=font, fill=1)
display.image(image)
display.show()
以下的程式碼是加上溫濕度感測器的顯示功能,在這個例子中我們使用的是DHT11,並把其out的接腳連接到實體接腳第7腳(GPIO4)的位置上:
import Adafruit_DHT
from board import SCL, SDA
import busio
import adafruit_ssd1306
from PIL import Image, ImageDraw, ImageFont
i2c = busio.I2C(SCL, SDA)
display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
width, height = 128, 32
image = Image.new("1", (width, height))
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
try:
while True:
h, t = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, 4)
draw.rectangle((0, 0, width, height), outline=0, fill=0)
draw.text((0,0), "NKUST CCET", font=font, fill=1)
draw.text((0, 8), "Temperature:{}".format(t), font=font, fill=1)
draw.text((0, 16), "Humidity:{}".format(h), font=font, fill=1)
display.image(image)
display.show()
except KeyboardInterrupt:
print("See you")
以下是執行上述程式的結果: