Python 嵌入式系統編程的八個基礎知識點
嵌入式系統編程是將軟件嵌入到硬件中,使其能夠執行特定任務的過程。Python 作為一種高級語言,因其簡潔易懂的特點,在嵌入式系統開發中越來越受歡迎。本文將介紹 Python 嵌入式系統編程的八個基礎知識點,幫助你快速上手。

1. 安裝和配置開發環境
在開始嵌入式系統編程之前,你需要安裝和配置好開發環境。常見的嵌入式開發板有 Raspberry Pi、Arduino 和 ESP32 等。以 Raspberry Pi 為例,你可以使用以下步驟安裝 Python:
# 更新包列表
sudo apt-get update
# 安裝 Python 3 和 pip
sudo apt-get install python3 python3-pip2. GPIO 控制
GPIO(General Purpose Input/Output)是嵌入式系統中常用的接口,用于控制外部設備。Raspberry Pi 提供了 RPi.GPIO 庫來控制 GPIO 引腳。
import RPi.GPIO as GPIO
import time
# 設置 GPIO 模式為 BCM
GPIO.setmode(GPIO.BCM)
# 設置 GPIO 18 為輸出模式
GPIO.setup(18, GPIO.OUT)
try:
while True:
# 設置 GPIO 18 為高電平
GPIO.output(18, GPIO.HIGH)
time.sleep(1) # 延時 1 秒
# 設置 GPIO 18 為低電平
GPIO.output(18, GPIO.LOW)
time.sleep(1) # 延時 1 秒
finally:
# 清理 GPIO 設置
GPIO.cleanup()這段代碼會控制 GPIO 18 引腳,使其每隔一秒切換一次電平狀態。
3. 傳感器數據讀取
嵌入式系統經常需要讀取傳感器數據。以 DHT11 溫濕度傳感器為例,可以使用 Adafruit_DHT 庫來讀取數據。
import Adafruit_DHT
import time
# 設置傳感器類型和引腳
sensor = Adafruit_DHT.DHT11
pin = 4
while True:
# 讀取溫濕度數據
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
print(f"溫度: {temperature:.1f}°C, 濕度: {humidity:.1f}%")
else:
print("讀取失敗,重試中...")
time.sleep(2) # 每 2 秒讀取一次這段代碼會每隔兩秒讀取一次溫濕度傳感器的數據并打印出來。
4. I2C 通信
I2C 是一種常用的串行通信協議,用于連接多個設備。Raspberry Pi 支持 I2C 通信,可以使用 smbus 庫來實現。
import smbus
import time
# 創建 I2C 總線對象
bus = smbus.SMBus(1)
# 設備地址
address = 0x68
# 寫入寄存器
def write_byte(addr, value):
bus.write_byte_data(address, addr, value)
# 讀取寄存器
def read_byte(addr):
return bus.read_byte_data(address, addr)
# 配置設備
write_byte(0x00, 0x00)
while True:
# 讀取數據
data = read_byte(0x01)
print(f"讀取到的數據: {data}")
time.sleep(1)這段代碼展示了如何通過 I2C 通信讀取和寫入數據。
5. SPI 通信
SPI 是另一種常用的串行通信協議,速度比 I2C 更快。Raspberry Pi 支持 SPI 通信,可以使用 spidev 庫來實現。
import spidev
import time
# 創建 SPI 對象
spi = spidev.SpiDev()
spi.open(0, 0) # 打開 SPI 設備
# 設置 SPI 速度
spi.max_speed_hz = 1000000
# 發送數據
def send_data(data):
spi.xfer([data])
# 接收數據
def receive_data():
return spi.xfer([0x00])[0]
while True:
# 發送數據
send_data(0x01)
# 接收數據
data = receive_data()
print(f"接收到的數據: {data}")
time.sleep(1)這段代碼展示了如何通過 SPI 通信發送和接收數據。
6. 中斷處理
中斷處理是嵌入式系統中常用的技術,用于響應外部事件。Raspberry Pi 可以使用 RPi.GPIO 庫來處理中斷。
import RPi.GPIO as GPIO
import time
# 設置 GPIO 模式為 BCM
GPIO.setmode(GPIO.BCM)
# 設置 GPIO 17 為輸入模式,并啟用內部上拉電阻
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# 定義中斷處理函數
def button_pressed(channel):
print("按鈕被按下")
# 設置中斷
GPIO.add_event_detect(17, GPIO.FALLING, callback=button_pressed, bouncetime=200)
try:
while True:
time.sleep(1)
finally:
# 清理 GPIO 設置
GPIO.cleanup()這段代碼會在按鈕被按下時觸發中斷,并調用 button_pressed 函數。
7. 多線程編程
在嵌入式系統中,多線程編程可以提高系統的響應性和效率。Python 的 threading 模塊提供了多線程支持。
import threading
import time
# 定義一個線程類
class MyThread(threading.Thread):
def run(self):
for _ in range(5):
print(f"{self.name} 運行中")
time.sleep(1)
# 創建兩個線程
thread1 = MyThread(name="線程1")
thread2 = MyThread(name="線程2")
# 啟動線程
thread1.start()
thread2.start()
# 等待線程結束
thread1.join()
thread2.join()
print("所有線程已結束")這段代碼創建了兩個線程,并在主線程中等待它們結束。
8. 網絡通信
嵌入式系統經常需要與外部設備或服務器進行網絡通信。Python 的 socket 模塊提供了網絡通信的支持。
import socket
# 創建一個 TCP/IP 套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定地址和端口
server_address = ('localhost', 10000)
sock.bind(server_address)
# 監聽連接
sock.listen(1)
while True:
# 等待連接
connection, client_address = sock.accept()
try:
print(f"連接來自: {client_address}")
# 接收數據
data = connection.recv(1024)
print(f"收到數據: {data.decode()}")
# 發送響應
response = "Hello, Client!"
connection.sendall(response.encode())
finally:
# 關閉連接
connection.close()這段代碼創建了一個簡單的 TCP 服務器,接收客戶端的連接并發送響應。
實戰案例:智能家居控制系統
假設我們要開發一個智能家居控制系統,該系統可以控制燈光和讀取溫濕度數據。我們可以使用 Raspberry Pi 作為主控設備,DHT11 傳感器讀取溫濕度,GPIO 控制燈光。
import RPi.GPIO as GPIO
import Adafruit_DHT
import time
# 設置 GPIO 模式為 BCM
GPIO.setmode(GPIO.BCM)
# 設置 GPIO 18 為輸出模式
GPIO.setup(18, GPIO.OUT)
# 設置傳感器類型和引腳
sensor = Adafruit_DHT.DHT11
pin = 4
def control_light(state):
"""控制燈光"""
GPIO.output(18, state)
if state == GPIO.HIGH:
print("燈已打開")
else:
print("燈已關閉")
def read_sensor():
"""讀取溫濕度數據"""
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
print(f"溫度: {temperature:.1f}°C, 濕度: {humidity:.1f}%")
else:
print("讀取失敗,重試中...")
try:
while True:
# 讀取溫濕度數據
read_sensor()
# 根據溫度控制燈光
if temperature > 25:
control_light(GPIO.HIGH)
else:
control_light(GPIO.LOW)
time.sleep(5) # 每 5 秒讀取一次
finally:
# 清理 GPIO 設置
GPIO.cleanup()這個案例展示了如何綜合使用 GPIO 控制和傳感器讀取,實現一個簡單的智能家居控制系統。
總結
本文介紹了 Python 嵌入式系統編程的 8 個基礎知識點,包括開發環境的安裝和配置、GPIO 控制、傳感器數據讀取、I2C 和 SPI 通信、中斷處理、多線程編程以及網絡通信。通過這些知識點,你可以構建出各種實用的嵌入式系統項目。






























