Raspberry Pi Pico筆記(12):SSD1306 LCD顯示線條/圖片(上)

一般較常作為開發板顯示的有兩種:一是 16x2 的 LCD,可參考:Raspberry Pi Pico筆記(5):1602LCD顯示時間及板載溫度,另一種是 OLED 顯示,常見的規格有0.96吋、1.44吋等各種不同尺寸的顯示屏幕,OLED的優點是顯示效果漂亮,且可顯示圖片。本篇將繼續實作如何使用 MicroPython 編寫程式,讓文字、線條及圖片顯示在0.96吋的 SSD1306,解析度大小為 128x64 像素;下一篇則紀錄如何將圖片轉成位元格式,再將圖片位元資料存到程式中的 framebuf ,顯示在 SSD1306 螢幕上。

[安裝SSD1306函式庫]

安裝 SSD1306 函式庫,可直接從 Thonny 進行安裝。請先開啟 Thonny 主程式,在功能表選擇「工具」→ 「管理套件」,在搜尋處輸入「SSD1306」如下圖:
點選「micropython-ssd1306」,進入下個畫面(如下圖),再按下「安裝」按鈕,安裝的步驟就完成,可以開始使用 SSD1306 函式庫了。

[材料]

  • Raspberry Pi Pico x1
  • SSD1306 TFT LCD x1
  • 排線 n 條

[接線圖]

Pi 接腳SSD1306 TFT LCD
Pin 36(3.3V)VCC
Pin 38(GND)GND
Pin 1(GP0)SDA
Pin 2(GP1)SCL



[圖形基本元素]

繪圖的基本原理是由點構成線、線構成面,在繪圖系統中,通常可以畫出點、線及各種圖形,如方形及三角型等,以下分別介紹各繪圖函式。要使用繪圖函式前,須先建立物件,會使用到上述安裝的 SSD1306 函式庫:
from ssd1306 import SSD1306_I2C

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)
物件建立完成後,可以使用以下繪圖指令進行繪圖或畫面捲動:

.畫點
在位置 x,y 處繪製一個像素,並使用 c 為繪製像素的顏色,其中1點亮,0熄滅。
oled.pixel(x, y, c)
.畫直線
從點 x1,y1 到 x2,y2 繪製一條對角線,並使用 c 為繪製像素的顏色。
oled.line(x1, y1, x2, y2, c)
.畫垂直線
從點 x,y 畫一條垂直線,高度為 h ,並使用 c 為繪製像素的顏色。
oled.vline(x, y, h, c)
.畫水平線
從點 x,y 畫一條水平線,寬度為 w, ,並使用 c 為繪製像素的顏色。
oled.hline(x, y, w, c)
.畫方形
繪製一個從點 x, y 開始的矩形,寬度為 w 和高度為 h ,並使用 c 為繪製像素的顏色。
oled.rect(x, y, w, h, c)
.畫實心方形
繪製一個從點 x, y 開始的填充矩形,寬度為 w 和高度為 h ,並使用 c 為繪製像素的顏色。
oled.fill_rect(x,y,w,h,c)
.顯示文字
在 x,y 座標顯示引號中的字串,並使用 c 為顯示的顏色(1為點亮,0為熄滅)。
oled.text("Hello world!", x, y, c)
.捲動整個畫面
當 pos 為正時,向右捲動 pos 像素;當 pos 為負時,向左捲動 pos 像素,並使用 c 為顯示的顏色(1為點亮,0為熄滅)。
oled.scroll(pos, c)

[程式]

程式中還有一個使用陣列繪製圖形的方法,先將圖形以陣列方式存在 ICON 變數,再透過繪點的指令 pixel 顯示出來。
from machine import Pin, I2C
import utime 
from ssd1306  import SSD1306_I2C

i2c = I2C(0,sda=Pin(0),scl=Pin(1),freq=40000)
oled = SSD1306_I2C(128,64,i2c)

oled.fill(0)
aux = 10

#愛心的點距陣列
ICON = [
    [ 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [ 0, 1, 1, 0, 0, 0, 1, 1, 0],
    [ 1, 1, 1, 1, 0, 1, 1, 1, 1],
    [ 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [ 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [ 0, 1, 1, 1, 1, 1, 1, 1, 0],
    [ 0, 0, 1, 1, 1, 1, 1, 0, 0],
    [ 0, 0, 0, 1, 1, 1, 0, 0, 0],
    [ 0, 0, 0, 0, 1, 0, 0, 0, 0],
]

while True:
    # 畫一個愛心
    for y, row in enumerate(ICON):
        for x, c in enumerate(row):
            oled.pixel(x, y, c)
    oled.show()    #顯示上面的圖形
    
    oled.hline(1,30,100,1)   #在(1,40)畫一長100的水平線
    oled.vline(1,30,10, 1)   #在(1,40)畫一高10的垂直線
    oled.text("Hi Ceiling!!", 0, 20, 1)   #在(0,30)顯示 Hello world!    
    oled.line(1, 40, 100, 60, 1)  # 在(1, 50)和(100, 60)兩點畫一條線
    oled.show()    #顯示上面的圖形
    
    utime.sleep(2)   #暫停2秒
    oled.fill(0)    #清除螢幕
    
    #向左捲動視窗
    for i in range(30, -42, -4):
        oled.text("Hi Ceiling!!", 0+i, 20, 1)    
        oled.scroll(i, 0)    
        oled.show()
        utime.sleep(0.1)
        oled.fill(0)     #清除螢幕

    #顯示數字 0~9    
    for i in range(10):
        number = str(i)
        oled.text(number,aux,0)
        oled.show()
        utime.sleep(1)
        aux = aux + 10
    aux = 10
    utime.sleep(2)   #暫停2秒
    oled.fill(0)    #清除螢幕    


[結果]


[參考資料]

Post a Comment

較新的 較舊