Pygame 提供了便捷的事件處理機制,可以輕鬆擷取滑鼠移動、點選等事件,方便開發者建構互動式應用。本文除了示範如何使用 Pygame 偵測滑鼠移動並取得座標外,也深入探討在樹莓派上設定和使用實時時鐘(RTC)模組,確保系統時間即使在斷電後也能保持準確。文章涵蓋了 RTC 模組的安裝、I2C 通訊設定、系統時間同步以及相關程式碼範例,並提供詳細的步驟說明和圖表輔助理解。此外,也討論瞭如何在系統啟動時自動載入 RTC 模組並同步時間,讓系統時間維護更加自動化。

使用 Pygame 偵測滑鼠移動

在 Python 中,偵測滑鼠移動可以使用 Pygame 這個強大的跨平臺函式庫。以下是實作的步驟:

安裝 Pygame

首先,您需要安裝 Pygame。您可以使用 pip 進行安裝:

pip install pygame

實作滑鼠移動偵測

下面是使用 Pygame 偵測滑鼠移動的範例程式碼:

import pygame
import sys

from pygame.locals import *

# 初始化 Pygame
pygame.init()

# 設定視窗大小
screen = pygame.display.set_mode((640, 480))

# 隱藏滑鼠指標
pygame.mouse.set_visible(0)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == MOUSEMOTION:
            # 印出滑鼠目前的位置
            print("滑鼠位置:", event.pos)

程式碼解釋

  1. 初始化 Pygame:我們首先需要初始化 Pygame 函式庫。
  2. 設定視窗大小:設定一個 640x480 的視窗大小。
  3. 隱藏滑鼠指標:隱藏滑鼠指標,以便我們可以在視窗中觀察到滑鼠的移動。
  4. 偵測滑鼠移動:在主迴圈中,偵測 MOUSEMOTION 事件,並印出滑鼠目前的位置。

執行程式

執行這個程式後,當您移動滑鼠時,程式會印出滑鼠目前的位置。

處理 Pygame 事件

在 Pygame 中,事件是用於處理使用者互動的,例如滑鼠移動、鍵盤按下等。以下是如何處理 Pygame 事件的範例:

處理QUIT事件

當使用者關閉 Pygame 視窗時,會觸發 QUIT 事件。可以使用以下程式碼來處理這個事件:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        sys.exit()

這段程式碼會在 QUIT 事件觸發時離開程式。

處理MOUSEMOTION事件

當滑鼠在 Pygame 視窗中移動時,會觸發 MOUSEMOTION 事件。可以使用以下程式碼來處理這個事件:

for event in pygame.event.get():
    if event.type == pygame.MOUSEMOTION:
        print("Mouse: (%d, %d)" % event.pos)

這段程式碼會在 MOUSEMOTION 事件觸發時印出滑鼠的絕對座標。

內容解密:

在上面的程式碼中,pygame.event.get() 函式用於取得所有發生的事件。然後,使用 if 陳述式來檢查事件的型別。如果事件是 QUIT 或 MOUSEMOTION,則執行相應的程式碼。

在 MOUSEMOTION 事件中,event.pos 屬性用於取得滑鼠的絕對座標。這個座標是相對於 Pygame 視窗左上角的。

圖表翻譯:

  flowchart TD
    A[Pygame 事件] --> B[QUIT 事件]
    B --> C[離開程式]
    A --> D[MOUSEMOTION 事件]
    D --> E[取得滑鼠座標]
    E --> F[印出座標]

這個圖表顯示了 Pygame 事件的處理流程。當 QUIT 事件觸發時,程式會離開。當 MOUSEMOTION 事件觸發時,程式會取得滑鼠的絕對座標並印出。

使用實時時鐘模組

問題描述

您想要讓您的樹莓派記住時間,即使它沒有網路連線。

解決方案

使用實時時鐘(RTC)模組。 一個非常常見的RTC晶片是DS1307,它具有I2C介面,您可以購買它作為一個包含晶片本身、用於維持準確時間的石英晶體和3V鋰電池的電池座的模組。 要製作這個配方,您需要以下材料:

  • 一個DS1307或相容的RTC模組(見“模組”)
  • 母對母跳線(見“原型設計裝置和套件”)

警告

您使用的RTC模組必須是3.3V相容的,這意味著它的I2C介面應該沒有拉高電阻,或者應該拉高到3.3V而不是5V。 當使用Adafruit模型時,只需在焊接模組時不包括兩個電阻即可。如果您有一個已經組裝好的模組,請小心地移除任何拉高電阻。

組裝RTC模組

如果RTC模組是套件形式,請記得省略拉高電阻,然後將模組連線到樹莓派,如圖12-18所示。

圖12-18. 連線RTC模組

DS1307是一個I2C模組,因此您的樹莓派必須設定為與I2C協定一起工作(見配方9.3)。您可以使用I2C工具(配方9.4)檢查裝置是否可見:

$ sudo i2cdetect -y 1

內容解密:

上述命令使用i2cdetect工具檢查I2C匯流排上是否有可用的裝置。 -y選項用於停用互動式提示,1引數指定了I2C匯流排號碼。在本例中,我們檢查的是I2C匯流排1。

圖表翻譯:

  flowchart TD
    A[啟動i2cdetect] --> B[指定I2C匯流排號碼]
    B --> C[檢查裝置可用性]
    C --> D[輸出裝置列表]

圖表翻譯:

上述Mermaid圖表展示了使用i2cdetect工具檢查I2C裝置的流程。首先啟動i2cdetect工具,然後指定I2C匯流排號碼,接著檢查裝置可用性,最後輸出裝置列表。

使用RTC模組設定時間

RTC(實時時鐘)模組是一種可以保持時間的硬體元件,即使在系統關閉或斷電的情況下。要使用RTC模組,首先需要確保它已經正確地連線到I2C匯流排上。在這個例子中,RTC模組的I2C地址是0x68。

步驟1:確認RTC模組連線

如果您沒有看到RTC模組的I2C地址,請檢查連線是否正確,包括拉高電阻是否已經安裝。如果您使用的是原始的Raspberry Pi model B revision 1板,則需要在命令中使用不同的I2C通道。

步驟2:載入RTC模組

使用以下命令載入RTC模組:

$ sudo modprobe rtc-ds1307

然後,切換到超級使用者模式:

$ sudo bash

在超級使用者模式下,註冊RTC模組:

# echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

離開超級使用者模式:

# exit

步驟3:讀取RTC時間

現在,您可以使用以下命令讀取RTC模組的時間:

$ sudo hwclock -r

這將顯示RTC模組的當前時間。如果時間不正確,您需要設定它。

步驟4:設定RTC時間

首先,確保您的Raspberry Pi系統時間是正確的。如果您的Pi連線到網際網路,時間應該會自動同步。如果時間不正確,您可以手動設定它:

$ date

如果時間不正確,您可以使用以下命令設定它:

$ sudo date --set="YYYY-MM-DD HH:MM:SS"

步驟5:將系統時間寫入RTC模組

一旦系統時間正確,您就可以將它寫入RTC模組:

$ sudo hwclock -w

然後,您可以再次讀取RTC模組的時間以確認它已經被設定:

$ sudo hwclock -r

步驟6:組態Linux啟動時從RTC模組讀取時間

最後,您需要組態Linux系統在啟動時從RTC模組讀取時間。編輯 /etc/modules 檔案並在末尾新增 rtc-ds1307

$ sudo nano /etc/modules

新增 rtc-ds1307 到檔案末尾,然後儲存並離開。

完成這些步驟後,您的Raspberry Pi就會在啟動時從RTC模組讀取時間,確保系統時間始終保持準確。

在樹梅派上設定實體時鐘(RTC)

簡介

在本文中,我們將探討如何在樹梅派上設定實體時鐘(RTC),以便在斷電後仍能保持時間的準確性。

步驟1:安裝必要的模組

首先,編輯 /etc/modules 檔案,以新增必要的模組:

sudo nano /etc/modules

在檔案中新增以下兩行:

i2c-dev
rtc-ds1307

這些模組分別用於啟用 I2C 通訊和 RTC 支援。

步驟2:設定系統啟動時執行命令

接下來,編輯 /etc/rc.local 檔案,以新增兩個命令,分別用於設定 RTC 和同步系統時間:

sudo nano /etc/rc.local

在檔案中新增以下兩行,位於 exit 0 行之前:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sudo hwclock -s

第一行命令用於初始化 RTC,第二行命令用於同步系統時間。

步驟3:重新啟動系統

重新啟動樹梅派,以確保變更生效:

sudo reboot

討論

RTC 不是樹梅派的必需元件,因為連線到網際網路的樹梅派會自動連線到網路時間伺服器並設定自己的時鐘。然而,如果您不總是使用樹梅派連線到網路,則硬體 RTC 是一個良好的選擇。

參考資料

AB Electronics 有一個很酷的 RTC 模組,可以直接插入 GPIO 插槽,如圖 12-19 所示。此食譜根據 Adafruit 的教程。

圖表翻譯:

  flowchart TD
    A[開始] --> B[安裝必要的模組]
    B --> C[設定系統啟動時執行命令]
    C --> D[重新啟動系統]
    D --> E[RTC 初始化]
    E --> F[同步系統時間]

此圖表展示了設定樹梅派上的 RTC 的步驟。首先,安裝必要的模組,然後設定系統啟動時執行命令,最後重新啟動系統以確保變更生效。

從系統穩定性與資料一致性的角度來看,整合硬體實時時鐘 (RTC) 模組,對於不持續連網的樹莓派系統至關重要。本文深入探討瞭如何使用 Pygame 偵測滑鼠移動、處理 Pygame 事件,以及在樹莓派上設定 RTC,涵蓋了軟體與硬體層面的整合。分析 Pygame 事件處理機制,可以發現其根據事件迴圈的設計模式,有效管理使用者互動,但需要注意事件佇列的溢位風險,尤其在高頻率事件觸發的情境下。至於 RTC 的整合,雖然步驟略顯繁瑣,涉及 I2C 通訊、模組載入、時間同步等多個環節,但能有效解決系統斷電後時間重置的問題,提升系統的可靠性。然而,RTC 模組的電池壽命以及時間漂移等因素仍需納入長期維護的考量。展望未來,隨著嵌入式系統對精確計時的依賴性日益增強,預期 RTC 模組的整合將成為標準實踐,並朝向更低功耗、更高精確度的方向發展。對於需要離線運作且重視時間精確性的樹莓派應用,玄貓建議務必整合 RTC 模組,並定期校準時間,以確保系統穩定性和資料完整性。