在嵌入式系統開發中,顯示器扮演著重要的角色,方便開發者監控系統狀態和顯示資料。本文將介紹如何使用 Python 控制樹莓派連線的各種顯示器,包含 I2C 控制的七段顯示器、雙色 LED 矩陣顯示器以及 Sense HAT LED 矩陣顯示器。透過程式碼範例和圖表,讀者可以學習如何設定顯示器、顯示訊息、圖形以及日期時間等資訊。此外,文章也說明瞭如何設定 I2C 通訊以及使用 Adafruit 和 Sense HAT 的 Python 函式庫。

顯示器介紹

在使用樹莓派(Raspberry Pi)時,雖然可以使用監視器或電視作為顯示器,但有時候使用較小且專門設計的顯示器會更方便。在本章中,我們將探討可以連線到樹莓派的各種顯示器。其中一些食譜需要使用無焊接麵包板(solderless breadboard)和公對母跳線(male-to-female jumper wires)。

日誌記錄程式

以下是日誌記錄程式的範例:

import time
import logging

# 設定日誌檔案路徑
logging_file = "/media/pi/temp_log_2019_06_17.csv"

# 設定日誌週期(10分鐘)
log_period = 600

while True:
    # 記錄溫度
    log_temp()
    
    # 等待日誌週期
    time.sleep(log_period)

這個程式會每10分鐘記錄一次溫度,並將資料儲存到指定的日誌檔案中。

執行程式

要執行這個程式,需要使用sudo許可權,以允許存取USB隨身碟:

$ sudo python3 ch_13_temp_log.py

程式執行後,會顯示日誌檔案的路徑,並開始記錄溫度資料。

討論

當您將USB隨身碟插入樹莓派時,它會自動安裝到 /media/pi 目錄下。如果有多個可移除的磁碟機連線到您的樹莓派,程式會使用它找到的第一個目錄。日誌檔案的名稱是根據當前的日期構建的。如果您在電子試算表中開啟檔案,您將可以直接編輯它。您的電子試算表可能會要求您指定資料的分隔符號,這將是一個逗號。

圖表顯示

圖13-31顯示了一組使用此食譜捕捉的資料,以及使用Gnumeric電子試算表在樹莓派上開啟的結果檔案。

相關資源

此程式可以輕鬆地適應用於本章中使用的其他任何感測器。

如需將感測器資料記錄到網路服務的範例,請參考食譜16.7。

顯示器選擇

在下一章中,我們將探討可以連線到樹莓派的各種顯示器,包括液晶顯示器、LED矩陣顯示器等。這些顯示器可以用於顯示感測器資料、系統資訊或其他任何您想要顯示的內容。

使用四位數LED顯示器

您想要在老式的七段LED顯示器中顯示一個四位數字。

解決方案

使用I2C LED模組(如圖14-1所示),並將其連線到Raspberry Pi。您需要以下元件:

  • 四根母對母跳線
  • Adafruit 4×7段LED顯示器,具有I2C揹包
  • Raspberry Pi

連線Raspberry Pi和模組的步驟如下:

  • 顯示器上的VCC(+)連線到Raspberry Pi的5V引腳
  • 顯示器上的GND(-)連線到Raspberry Pi的GND引腳
  • 顯示器上的SDA(D)連線到Raspberry Pi的GPIO 2(SDA)引腳
  • 顯示器上的SCL(C)連線到Raspberry Pi的GPIO 3(SCL)引腳

注意,Adafruit還提供了一個大型LED顯示器。您可以使用相同的連線方式連線它到Raspberry Pi,但大型顯示器有兩個正極電源引腳:一個用於邏輯(V_IO)和一個用於顯示(5V)。這是因為大型顯示器需要更多電流。幸運的是,Raspberry Pi可以提供足夠的電源供應。您可以使用額外的母對母跳線將額外的引腳連線到GPIO聯結器上的第二個5V引腳。

要使此配方生效,您還需要設定Raspberry Pi的I2C功能,因此請先按照配方9.3進行設定。

輸入以下命令以安裝Adafruit程式碼以支援此顯示器:

$ cd /home/pi
$ cd Adafruit_Python_LED_Backpack
$ sudo python setup.py install

Adafruit函式庫中包含範例,我們將使用其中一個範例來演示顯示器的使用。使用以下命令執行程式,顯示器應該會顯示時間。注意,此程式碼僅適用於Python 2,因此請使用python命令(而非python3):

$ cd examples
$ sudo python ex_7segment_clock.py

討論

如果您在編輯器中開啟範例檔案ex_7segment_clock.py,您將看到以下關鍵命令:

from Adafruit_LED_Backpack import SevenSegment

此命令匯入函式庫程式碼到您的程式中。然後,您需要建立一個SevenSegment例項,使用以下程式碼:

segment = SevenSegment.SevenSegment(address=0x70)

每個I2C從裝置都有一個地址號碼。LED板上有三對焊接墊,可以透過焊接來更改地址。這對於從單個Raspberry Pi執行多個I2C裝置至關重要。

要設定特定數字的內容,請使用以下命令:

segment.set_digit(0, 5)  # 設定第一位數字為5

內容解密:

  • SevenSegment類別負責控制七段LED顯示器。
  • address引數指定I2C地址。
  • set_digit方法設定特定數字的內容。

圖表翻譯:

  flowchart TD
    A[開始] --> B[匯入SevenSegment函式庫]
    B --> C[建立SevenSegment例項]
    C --> D[設定I2C地址]
    D --> E[設定數字內容]
    E --> F[顯示時間]

此圖表展示了使用七段LED顯示器的流程。首先,匯入SevenSegment函式庫,然後建立一個例項,設定I2C地址,最後設定數字內容並顯示時間。

顯示訊息於 I2C LED 矩陣顯示器

問題描述

您想要控制多彩 LED 矩陣顯示器上的畫素。

解決方案

使用 I2C LED 模組,例如 Adafruit bicolor LED 方形畫素矩陣,搭配 I2C 揹包,並將其連線到 Raspberry Pi 上。

所需材料

  • 四根母對母跳線(請參考「原型設計裝置和套件」)
  • Adafruit bicolor LED 方形畫素矩陣,搭配 I2C 揹包(請參考「模組」)

連線設定

  • 將顯示器上的 VCC (+) 連線到 Raspberry Pi 的 GPIO 聯結器上的 5V
  • 將顯示器上的 GND (-) 連線到 Raspberry Pi 的 GPIO 聯結器上的 GND
  • 將顯示器上的 SDA (D) 連線到 Raspberry Pi 的 GPIO 聯結器上的 GPIO 2 (SDA)
  • 將顯示器上的 SCL (C) 連線到 Raspberry Pi 的 GPIO 聯結器上的 GPIO 3 (SCL)

執行步驟

  1. 設定 Raspberry Pi 的 I2C:請先按照 Recipe 9.3 的步驟設定您的 Raspberry Pi,以啟用 I2C 功能。
  2. 安裝 Adafruit Python LED 揹包函式庫:執行以下命令來安裝所需的函式庫:

$ cd /home/pi $ cd Adafruit_Python_LED_Backpack $ sudo python setup.py install

3. **執行範例程式**:切換到 `examples` 目錄並執行範例程式:
   ```bash
$ cd examples
$ sudo python bicolor_matrix8x8_test.py

程式碼討論

範例程式展示了 Adafruit 函式庫的多功能性。程式開始時,匯入必要的模組並建立 BicolorMatrix8x8 物件:

import time
from PIL import Image
from PIL import ImageDraw
from Adafruit_LED_Backpack import BicolorMatrix8x8

display = BicolorMatrix8x8.BicolorMatrix8x8()

接著,程式迭代所有可能的顏色(紅、綠、黃),並對矩陣顯示器進行操作:

for c in [BicolorMatrix8x8.RED, BicolorMatrix8x8.GREEN, BicolorMatrix8x8.YELLOW]:
    # 迭代所有位置 x 和 y。

這個範例程式展示瞭如何使用 Adafruit 函式庫來控制 I2C LED 矩陣顯示器,並對其進行多彩的顯示。

圖表翻譯:

  flowchart TD
    A[設定 I2C] --> B[安裝 Adafruit 函式庫]
    B --> C[執行範例程式]
    C --> D[控制 LED 矩陣顯示器]

內容解密:

上述程式碼展示瞭如何使用 Adafruit 函式庫來控制 I2C LED 矩陣顯示器。首先,需要設定 Raspberry Pi 的 I2C 功能,然後安裝 Adafruit Python LED 揹包函式庫。接著,可以執行範例程式來控制 LED 矩陣顯示器。程式碼中使用了 BicolorMatrix8x8 類別來建立顯示器物件,並迭代所有可能的顏色來對顯示器進行操作。

使用 Sense HAT LED 矩陣顯示

Sense HAT 是一種擴充板,設計用於 Raspberry Pi,提供了一系列感測器和一個 8x8 的 LED 矩陣顯示。這個顯示可以用來顯示文字、圖形和動畫。

問題

您想要使用 Sense HAT 的 LED 矩陣顯示來顯示訊息和圖形。

解決方案

首先,按照 Recipe 9.16 安裝 Sense HAT 所需的軟體。然後,使用 Sense HAT 的函式庫命令來顯示文字和圖形。

範例程式碼

from sense_hat import SenseHat
from datetime import datetime
import time

# 建立 SenseHat 物件
sense = SenseHat()

# 清除顯示緩衝區
sense.clear()

# 設定畫素顏色
sense.set_pixel(0, 0, (255, 0, 0))  # 紅色

# 寫入顯示緩衝區到硬體
sense.write_display()

# 延遲 0.25 秒
time.sleep(0.25)

解釋

  • sense_hat 函式庫提供了 SenseHat 類別,用於控制 Sense HAT。
  • clear() 方法清除顯示緩衝區。
  • set_pixel() 方法設定畫素顏色。
  • write_display() 方法將顯示緩衝區寫入硬體。
  • time.sleep() 函式延遲執行。

顯示文字

# 顯示文字
sense.show_message("Hello, World!")

顯示圖形

# 顯示圖形
sense.set_pixels([
    (255, 0, 0), (0, 255, 0), (0, 0, 255),
    (255, 255, 0), (255, 0, 255), (0, 255, 255),
    (128, 128, 128), (255, 255, 255)
])

結合使用

# 結合使用
sense.show_message("Hello, World!")
time.sleep(1)
sense.set_pixels([
    (255, 0, 0), (0, 255, 0), (0, 0, 255),
    (255, 255, 0), (255, 0, 255), (0, 255, 255),
    (128, 128, 128), (255, 255, 255)
])

圖表翻譯:

  flowchart TD
    A[初始化 SenseHat] --> B[清除顯示緩衝區]
    B --> C[設定畫素顏色]
    C --> D[寫入顯示緩衝區到硬體]
    D --> E[延遲執行]
    E --> F[顯示文字或圖形]

圖表解釋:

  • 初始化 SenseHat 物件。
  • 清除顯示緩衝區。
  • 設定畫素顏色。
  • 寫入顯示緩衝區到硬體。
  • 延遲執行。
  • 顯示文字或圖形。

使用 Sense HAT 顯示日期和時間

日期和時間顯示程式

from sense_hat import SenseHat
from datetime import datetime

# 定義日期和時間的顏色
date_color = (255, 0, 0)  # 紅色
time_color = (0, 255, 0)  # 綠色

hat = SenseHat()

while True:
    # 取得當前的日期和時間
    now = datetime.now()
    
    # 格式化日期和時間
    date_message = '{:%d %B %Y}'.format(now)
    time_message = '{:%H:%M:%S}'.format(now)
    
    # 顯示日期和時間
    hat.show_message(date_message, text_colour=date_color)
    hat.show_message(time_message, text_colour=time_color)

程式解釋

  • 我們使用 SenseHat 類別來控制 Sense HAT。
  • 我們定義了兩種顏色:紅色 (date_color) 和綠色 (time_color),用於顯示日期和時間。
  • 我們使用 datetime.now() 函式來取得當前的日期和時間。
  • 我們使用 format() 函式來格式化日期和時間。
  • 我們使用 show_message() 函式來顯示日期和時間,同時指定了文字顏色。

顯示影像和設定畫素

影像顯示程式

from sense_hat import SenseHat
import time

hat = SenseHat()

# 定義紅色
red = (255, 0, 0)

# 載入影像
hat.load_image("image.png")

# 等待 5 秒
time.sleep(5)

# 設定畫素
hat.set_pixel(0, 0, red)

程式解釋

  • 我們使用 SenseHat 類別來控制 Sense HAT。
  • 我們定義了紅色 (red)。
  • 我們使用 load_image() 函式來載入影像。
  • 我們使用 set_pixel() 函式來設定畫素。

其他功能

  • scroll_speed:設定滾動速度。
  • back_colour:設定背景顏色。
  • set_rotation:設定顯示方向。
  • load_image:載入影像。

圖表翻譯

  graph LR
    A[初始化 Sense HAT] --> B[載入影像]
    B --> C[設定畫素]
    C --> D[顯示日期和時間]
    D --> E[設定滾動速度]
    E --> F[設定背景顏色]

圖表解釋

  • 初始化 Sense HAT。
  • 載入影像。
  • 設定畫素。
  • 顯示日期和時間。
  • 設定滾動速度。
  • 設定背景顏色。

從使用者經驗視角來看,本章節深入探討了樹莓派顯示方案的多樣性,涵蓋了從簡潔的日誌記錄程式輸出到圖形化介面顯示的各種應用場景。透過多維比較分析,我們可以看到,不同顯示方案各有千秋:簡單的四位數LED顯示器適用於展示關鍵資料,而 Sense HAT 則提供了更豐富的圖形化顯示能力,方便使用者進行更直觀的互動。然而,技術限制深析也提醒我們,I2C 裝置的地址衝突問題需要仔細考量,不同顯示方案的功耗及效能也需根據實際應用場景進行權衡。

技術整合至現有系統的策略和價值也得到了充分展現。無論是使用USB隨身碟記錄感測器資料,還是透過I2C介面控制LED矩陣顯示器,本章節都提供了詳盡的程式碼範例和硬體連線說明,降低了使用者實踐的門檻。此外,本章節也指出了被忽視的技術機會點,例如將日誌記錄程式應用於其他感測器資料的收集,以及利用Sense HAT更進階的圖形化顯示功能。

展望未來,隨著嵌入式系統的普及和物聯網技術的發展,樹莓派顯示方案的應用場景將更加多元化。我們預見,更高解析度、更低功耗、更易於整合的顯示技術將成為未來發展的趨勢。玄貓認為,深入理解不同顯示方案的特性,並根據實際需求進行技術選型,將是開發者在未來更好地利用樹莓派平臺進行創新的關鍵。對於追求更佳使用者經驗的開發者而言,持續探索和應用新的顯示技術將至關重要。