樹(shù)莓派Pico驅(qū)動(dòng)2.66英寸電子墨水屏:SPI通信與MicroPython實(shí)戰(zhàn)
1. 項(xiàng)目概述Pico e-Paper 2.66 是什么如果你手頭有一塊樹(shù)莓派 Pico 或者類(lèi)似的 RP2040 開(kāi)發(fā)板又恰好對(duì)低功耗、類(lèi)紙顯示效果感興趣那么“Pico e-Paper 2.66”這個(gè)項(xiàng)目絕對(duì)值得你花時(shí)間折騰一下。簡(jiǎn)單來(lái)說(shuō)這就是一個(gè)驅(qū)動(dòng) 2.66 英寸電子墨水屏e-Paper的完整方案。電子墨水屏大家應(yīng)該不陌生像 Kindle、電子價(jià)簽用的就是這種技術(shù)它的最大特點(diǎn)就是只在刷新畫(huà)面時(shí)才耗電顯示內(nèi)容時(shí)完全零功耗而且視覺(jué)上非常接近真實(shí)紙張不傷眼。這個(gè)項(xiàng)目的核心就是利用 Pico 的硬件資源通過(guò) SPI 通信協(xié)議去驅(qū)動(dòng)一塊分辨率通常為 296x152 的黑白或黑/白/紅三色電子墨水屏。為什么是 SPI因?yàn)閷?duì)于微控制器來(lái)說(shuō)SPI 是驅(qū)動(dòng)這類(lèi)外設(shè)最常用、最高效的接口之一它速度快、協(xié)議相對(duì)簡(jiǎn)單而且 Pico 有多個(gè)硬件 SPI 接口用起來(lái)非常方便。網(wǎng)絡(luò)上搜索熱度這么高也恰恰說(shuō)明了大家對(duì)如何在嵌入式設(shè)備上玩轉(zhuǎn) e-Paper 有強(qiáng)烈的實(shí)踐需求從基礎(chǔ)的 SPI 通信調(diào)試到具體的驅(qū)動(dòng)編寫(xiě)、性能優(yōu)化都是大家關(guān)心的點(diǎn)。這個(gè)項(xiàng)目適合誰(shuí)呢首先是嵌入式愛(ài)好者你想給自己的物聯(lián)網(wǎng)小設(shè)備加一個(gè)超低功耗的顯示屏來(lái)顯示狀態(tài)信息。其次是創(chuàng)客和學(xué)生想做一個(gè)無(wú)需頻繁充電的天氣站、日程提醒器或者簡(jiǎn)易閱讀器。最后哪怕你只是想深入學(xué)習(xí)一下 SPI 通信協(xié)議和微控制器驅(qū)動(dòng)外設(shè)的完整流程這個(gè)項(xiàng)目也是一個(gè)絕佳的、有可視成果的練手案例。接下來(lái)我會(huì)把我從硬件連接到軟件驅(qū)動(dòng)再到實(shí)際應(yīng)用和問(wèn)題排查的全過(guò)程經(jīng)驗(yàn)毫無(wú)保留地分享給你。2. 核心硬件解析與連接方案2.1 電子墨水屏e-Paper工作原理淺析在動(dòng)手接線之前我們有必要簡(jiǎn)單了解一下電子墨水屏是怎么工作的。這能幫你理解后續(xù)驅(qū)動(dòng)代碼里那些“神秘”的指令序列。e-Paper 內(nèi)部有數(shù)百萬(wàn)個(gè)微膠囊每個(gè)膠囊里包含帶正電的白色粒子和帶負(fù)電的黑色粒子懸浮在透明液體中。通過(guò)在不同位置的上下電極施加電壓可以控制黑白粒子上下移動(dòng)從而形成圖像。關(guān)鍵點(diǎn)來(lái)了一旦粒子移動(dòng)到目標(biāo)位置即使撤掉電壓由于介電泳力和范德華力的作用它們也能保持住這就是“雙穩(wěn)態(tài)”特性也是零功耗顯示的物理基礎(chǔ)。但是刷新過(guò)程即粒子移動(dòng)本身是耗電的而且為了確保顯示效果刷新時(shí)需要一套復(fù)雜的電壓波形來(lái)驅(qū)動(dòng)這個(gè)波形序列通常由屏幕控制器比如我們常用的 SSD1680管理我們通過(guò) SPI 發(fā)送指令和數(shù)據(jù)來(lái)指揮控制器。所以我們的驅(qū)動(dòng)代碼核心任務(wù)有兩個(gè)一是通過(guò) SPI 發(fā)送正確的初始化序列和波形數(shù)據(jù)LUT到控制器二是在需要更新屏幕時(shí)發(fā)送新的圖像數(shù)據(jù)。屏幕的“慢”刷新需要幾百毫秒到幾秒和“閃”全屏刷新時(shí)會(huì)有一次黑白反相的過(guò)程是物理特性無(wú)法改變但我們可以通過(guò)優(yōu)化刷新策略如局部刷新來(lái)改善體驗(yàn)。2.2 硬件清單與接口定義要完成這個(gè)項(xiàng)目你需要準(zhǔn)備以下硬件主控板樹(shù)莓派 Pico或其他基于 RP2040 的開(kāi)發(fā)板。這是核心大腦。顯示屏2.66 英寸 e-Paper 模塊。常見(jiàn)型號(hào)如 GDEY0266T90支持黑白紅三色。務(wù)必確認(rèn)你的屏幕驅(qū)動(dòng)芯片型號(hào)最常見(jiàn)的是 SSD1680但也有其他型號(hào)驅(qū)動(dòng)代碼會(huì)有差異。連接線杜邦線母對(duì)母若干用于連接 Pico 和屏幕。電源Pico 可通過(guò) USB 供電但要注意e-Paper 在刷新瞬間需要較大的電流可能高達(dá)幾十毫安USB 供電通常足夠但為了穩(wěn)定建議使用質(zhì)量較好的 USB 電源或電池。屏幕模塊通常會(huì)引出以下幾個(gè)關(guān)鍵引腳VCC電源正極接 3.3V。絕對(duì)不要接5V大部分 e-Paper 模塊是 3.3V 邏輯電平。GND電源地與 Pico 共地。DIN (MOSI)SPI 數(shù)據(jù)輸入線主設(shè)備輸出從設(shè)備輸入。CLK (SCK)SPI 時(shí)鐘線。CS (CS)片選信號(hào)低電平有效。DC (D/C)數(shù)據(jù)/命令選擇線。用于告訴屏幕控制器接下來(lái)發(fā)送的是命令低電平還是數(shù)據(jù)高電平。這是 SPI 驅(qū)動(dòng)外設(shè)時(shí)非常關(guān)鍵的一根線。RST (RESET)復(fù)位引腳低電平復(fù)位。通常用于初始化或喚醒屏幕。BUSY忙狀態(tài)引腳。屏幕在執(zhí)行刷新等操作時(shí)此引腳會(huì)輸出高電平或低電平具體看屏幕規(guī)格告訴主控“我正在忙別打擾”。這個(gè)引腳必須接并且代碼里必須檢測(cè)它否則會(huì)導(dǎo)致發(fā)送數(shù)據(jù)時(shí)序錯(cuò)誤。2.3 Pico 與 e-Paper 的 SPI 連接實(shí)戰(zhàn)Pico 有兩個(gè)硬件 SPI 接口spi0和spi1。我們可以任選一個(gè)。這里以使用spi0為例這也是最常用的選擇。接線示意圖如下請(qǐng)根據(jù)你的屏幕實(shí)際引腳名稱(chēng)調(diào)整Pico 引腳 (GPIO)引腳功能e-Paper 模塊引腳說(shuō)明GP3 (SPI0 RX)MISO(通常不接)對(duì)于只寫(xiě)的顯示屏MISO 可以不接。GP2 (SPI0 CSn)SPI CSCS片選。GP1 (SPI0 SCK)SPI SCKCLK時(shí)鐘。GP0 (SPI0 TX)SPI MOSIDIN主設(shè)備輸出數(shù)據(jù)。GP5任意 GPIODC數(shù)據(jù)/命令選擇。GP6任意 GPIORST復(fù)位。GP7任意 GPIOBUSY忙檢測(cè)。3V3(OUT)3.3V 電源VCC電源正極。GND電源地GND電源地。注意上表中 GP5、GP6、GP7 是我隨意選擇的 GPIO你可以根據(jù)布線方便選擇其他未被占用的 GPIO。但 CS、SCK、MOSI 這三個(gè) SPI 核心引腳必須連接到 Pico 指定 SPI 接口的對(duì)應(yīng)引腳上。例如spi0的 MOSI、SCK、CS 固定是 GP0、GP1、GP2或 GP3、GP4、GP5取決于 set 函數(shù)配置。連接時(shí)的實(shí)操心得先斷電再接線這是鐵律防止誤接短路燒毀設(shè)備。GND 最先接最后斷確保共地避免因電勢(shì)差導(dǎo)致邏輯錯(cuò)誤甚至損壞。BUSY 引腳必須接我見(jiàn)過(guò)不少人因?yàn)槠聊徊伙@示而頭疼最后發(fā)現(xiàn)是忘了接或沒(méi)正確讀取 BUSY 引腳。屏幕刷新很慢不等待 BUSY 信號(hào)就發(fā)送后續(xù)指令控制器根本來(lái)不及處理。電源質(zhì)量刷新瞬間電流較大如果使用劣質(zhì) USB 線或電源可能導(dǎo)致電壓驟降引起 Pico 復(fù)位或屏幕刷新異常。如果遇到不穩(wěn)定情況這是首要排查點(diǎn)。3. 軟件驅(qū)動(dòng)開(kāi)發(fā)與核心代碼解析硬件連接妥當(dāng)后就進(jìn)入了軟件部分。我們將使用 MicroPython 進(jìn)行開(kāi)發(fā)因?yàn)樗换バ詮?qiáng)代碼易懂非常適合快速原型開(kāi)發(fā)。3.1 開(kāi)發(fā)環(huán)境搭建與 MicroPython 固件燒錄下載固件前往樹(shù)莓派基金會(huì)官網(wǎng)下載最新的 Pico MicroPython 固件.uf2文件。燒錄固件按住 Pico 板上的BOOTSEL按鈕不放然后通過(guò) USB 連接到電腦。松開(kāi)按鈕后電腦會(huì)出現(xiàn)一個(gè)名為RPI-RP2的U盤(pán)。將下載的.uf2文件拖入該U盤(pán)Pico 會(huì)自動(dòng)重啟并運(yùn)行 MicroPython。選擇開(kāi)發(fā)工具推薦使用 Thonny IDE。它輕量、免費(fèi)并且內(nèi)置了 MicroPython 支持。安裝后在 Thonny 的右下角選擇解釋器為 “MicroPython (Raspberry Pi Pico)”并選擇正確的串口。3.2 SPI 初始化與基礎(chǔ)通信函數(shù)在 MicroPython 中我們需要先初始化 SPI 和相關(guān)的 GPIO 引腳。from machine import Pin, SPI import time # 定義引腳 epd_cs Pin(2, Pin.OUT) # SPI CS epd_dc Pin(5, Pin.OUT) # Data/Command epd_rst Pin(6, Pin.OUT) # Reset epd_busy Pin(7, Pin.IN) # Busy (輸入模式) # 初始化 SPI 使用 spi0 頻率設(shè)為 1 MHz (e-Paper 通常不高) spi SPI(0, baudrate1_000_000, polarity0, phase0, bits8, firstbitSPI.MSB, sckPin(1), mosiPin(0), misoNone) # 因?yàn)槲覀儾恍枰x取miso 設(shè)為 None epd_cs.value(1) # 初始時(shí)片選置高不選中 def send_command(cmd): 發(fā)送命令 epd_dc.value(0) # DC 置低表示命令 epd_cs.value(0) # 片選置低開(kāi)始通信 spi.write(bytearray([cmd])) epd_cs.value(1) # 片選置高結(jié)束通信 def send_data(data): 發(fā)送數(shù)據(jù)可以是單個(gè)字節(jié)或字節(jié)數(shù)組 epd_dc.value(1) # DC 置高表示數(shù)據(jù) epd_cs.value(0) if isinstance(data, int): spi.write(bytearray([data])) else: spi.write(data) epd_cs.value(1) def wait_until_idle(): 等待屏幕忙信號(hào)結(jié)束 while epd_busy.value() 1: # 假設(shè) busy1 表示忙具體看屏幕手冊(cè) time.sleep_ms(10) # 或者 busy0 表示忙則判斷條件為 while epd_busy.value() 0: # 務(wù)必查閱你的屏幕數(shù)據(jù)手冊(cè)確認(rèn)代碼解析與注意事項(xiàng)polarity0, phase0這是 SPI 的模式 0是大多數(shù) SPI 設(shè)備包括 SSD1680最常用的模式。這是最容易出錯(cuò)的地方之一如果模式不對(duì)通信完全無(wú)法進(jìn)行。如果你不確定模式 0 是首選的嘗試。baudrate1_000_0001MHz 的速率對(duì)于 e-Paper 足夠了。一開(kāi)始可以設(shè)低一些比如 100kHz以確保通信穩(wěn)定后續(xù)再提高。wait_until_idle()函數(shù)至關(guān)重要。在發(fā)送任何可能觸發(fā)長(zhǎng)時(shí)間操作如刷新的命令后都必須調(diào)用此函數(shù)等待屏幕準(zhǔn)備好。3.3 e-Paper 驅(qū)動(dòng)庫(kù)核心實(shí)現(xiàn)下面我們構(gòu)建一個(gè)簡(jiǎn)化的驅(qū)動(dòng)類(lèi)包含初始化、清屏、顯示圖像和休眠等基本功能。class EPD_2in66: def __init__(self): self.width 296 self.height 152 self.reset_pin epd_rst self.dc_pin epd_dc self.busy_pin epd_busy self.cs_pin epd_cs self.spi spi self.init() def reset(self): 硬件復(fù)位 self.reset_pin.value(1) time.sleep_ms(20) self.reset_pin.value(0) time.sleep_ms(2) self.reset_pin.value(1) time.sleep_ms(20) def init(self): 初始化屏幕 self.reset() # 硬件復(fù)位 self.wait_until_idle() # 以下指令序列需要根據(jù)你的具體屏幕型號(hào)SSD1680的數(shù)據(jù)手冊(cè)來(lái)編寫(xiě) # 這里是一個(gè)示例序列可能不適用于你的屏幕請(qǐng)務(wù)必替換 send_command(0x12) # 軟件復(fù)位 self.wait_until_idle() send_command(0x01) # 驅(qū)動(dòng)器輸出控制 send_data(0x27) send_data(0x01) send_data(0x00) send_command(0x11) # 數(shù)據(jù)入口模式 send_data(0x03) # 地址自增Y方向更新 # ... 更多初始化命令如設(shè)置LUT查找表、邊框控制等 # 通常廠家會(huì)提供完整的初始化代碼片段 print(EPD init finished.) def wait_until_idle(self): 等待屏幕空閑 while self.busy_pin.value() 1: # 再次確認(rèn)你的屏幕忙信號(hào)極性 time.sleep_ms(10) time.sleep_ms(200) # 額外等待一小段時(shí)間確保穩(wěn)定 def clear(self, color0): 清屏color0白色1黑色 buf [color] * (self.width * self.height // 8) # 創(chuàng)建緩沖區(qū) self.display(buf) def display(self, image_buffer): 顯示圖像數(shù)據(jù) # 1. 發(fā)送命令準(zhǔn)備接收?qǐng)D像數(shù)據(jù) send_command(0x24) # 寫(xiě)入黑白位圖數(shù)據(jù) for i in range(0, len(image_buffer)): send_data(image_buffer[i]) # 2. 觸發(fā)顯示刷新 send_command(0x22) send_data(0xC7) # 刷新顯示 send_command(0x20) self.wait_until_idle() # 必須等待刷新完成 print(Display update complete.) def sleep(self): 進(jìn)入深度睡眠模式以省電 send_command(0x10) send_data(0x01) time.sleep_ms(100)關(guān)鍵點(diǎn)解析初始化序列這是驅(qū)動(dòng)屏幕最核心也是最“黑盒”的部分。你必須找到對(duì)應(yīng)屏幕型號(hào)如 GDEY0266T90 搭配 SSD1680的官方數(shù)據(jù)手冊(cè)或廠家提供的示例代碼。序列里的每一個(gè)命令0x12 0x01等和數(shù)據(jù)都有特定含義設(shè)置著驅(qū)動(dòng)電壓、掃描方式、LUT 等參數(shù)。切勿隨意使用其他屏幕的初始化代碼否則可能導(dǎo)致顯示異常甚至損壞屏幕。圖像緩沖區(qū)image_buffer是一個(gè)字節(jié)數(shù)組bytearray。對(duì)于單色屏幕每個(gè)比特bit代表一個(gè)像素1為黑0為白。因?yàn)槠聊粚?296 像素高 152 像素總像素為 296*15244992。每個(gè)字節(jié)有8位所以緩沖區(qū)大小是 44992 / 8 5624 字節(jié)。在clear函數(shù)中我們創(chuàng)建了一個(gè)全是 0x00白色或 0xFF黑色的緩沖區(qū)。刷新流程先發(fā)送0x24命令接著發(fā)送整個(gè)圖像緩沖區(qū)數(shù)據(jù)然后發(fā)送0x22和0xC7來(lái)觸發(fā)刷新最后發(fā)送0x20并等待BUSY信號(hào)結(jié)束。這個(gè)流程是標(biāo)準(zhǔn)操作。3.4 創(chuàng)建與轉(zhuǎn)換顯示圖像我們?nèi)绾卧陔娔X上準(zhǔn)備一張圖片并轉(zhuǎn)換成屏幕能識(shí)別的字節(jié)數(shù)組呢這里提供一個(gè)實(shí)用的方法。使用 Python PIL 庫(kù)進(jìn)行預(yù)處理在電腦上運(yùn)行from PIL import Image import numpy as np def convert_image_for_epd(image_path, output_width296, output_height152): # 1. 打開(kāi)圖片并轉(zhuǎn)換為灰度圖 img Image.open(image_path).convert(L) # 2. 調(diào)整尺寸注意保持寬高比可能需要裁剪 img img.resize((output_width, output_height), Image.Resampling.LANCZOS) # 3. 二值化閾值可根據(jù)圖片調(diào)整 threshold 128 img img.point(lambda p: 0 if p threshold else 1, mode1) # 4. 轉(zhuǎn)換為字節(jié)數(shù)組按行MSB在前 img_data np.array(img, dtypenp.uint8) # 將二維數(shù)組152行296列轉(zhuǎn)換為一維字節(jié)數(shù)組 # 每行296個(gè)像素 - 37個(gè)字節(jié) (296/837) bytes_per_row output_width // 8 buffer bytearray() for y in range(output_height): for x_byte in range(bytes_per_row): byte_val 0 for bit in range(8): pixel_x x_byte * 8 bit if pixel_x output_width and img_data[y, pixel_x]: byte_val | (0x80 bit) # 設(shè)置對(duì)應(yīng)的位為1黑色 buffer.append(byte_val) return buffer # 示例轉(zhuǎn)換一張圖片 buf convert_image_for_epd(your_logo.png) # 將 buf 保存為二進(jìn)制文件或者直接嵌入到 MicroPython 代碼中 with open(image.bin, wb) as f: f.write(buf)在 MicroPython 中加載圖像數(shù)據(jù) 你可以將生成的image.bin文件拖入到 Pico 的文件系統(tǒng)中在 Thonny 中可以看到 Pico 的文件視圖。然后在主程序中讀取并顯示。def display_from_file(filename): with open(filename, rb) as f: img_data f.read() epd EPD_2in66() epd.display(img_data) epd.sleep() # 顯示完后讓屏幕休眠4. 典型問(wèn)題排查與性能優(yōu)化技巧即使按照步驟操作你也可能會(huì)遇到一些問(wèn)題。這里我總結(jié)了一些常見(jiàn)坑點(diǎn)和解決方案。4.1 通信失敗與無(wú)顯示問(wèn)題排查表現(xiàn)象可能原因排查步驟與解決方案屏幕完全無(wú)反應(yīng)1. 電源問(wèn)題2. 接線錯(cuò)誤或虛焊3. 復(fù)位失敗1. 用萬(wàn)用表測(cè)量屏幕 VCC 和 GND 之間電壓是否為穩(wěn)定的 3.3V。2. 逐根檢查接線尤其是 GND、VCC、RST、BUSY。3. 在代碼中手動(dòng)控制 RST 引腳用示波器或邏輯分析儀觀察是否有復(fù)位脈沖。屏幕全黑或全白但 BUSY 引腳有變化1. SPI 模式或速率不對(duì)2. 初始化序列錯(cuò)誤3. DC 引腳接線或控制錯(cuò)誤1. 確認(rèn) SPI 模式為 0 (polarity0, phase0)。嘗試降低波特率到 100k。2.這是最常見(jiàn)原因嚴(yán)格核對(duì)你的屏幕型號(hào)和驅(qū)動(dòng) IC使用官方或社區(qū)驗(yàn)證過(guò)的初始化代碼。3. 用邏輯分析儀抓取 SPI 波形看發(fā)送命令DC0和數(shù)據(jù)DC1時(shí)DC 引腳電平是否正確切換。顯示亂碼、錯(cuò)位或局部異常1. 圖像數(shù)據(jù)格式錯(cuò)誤2. 緩沖區(qū)大小計(jì)算錯(cuò)誤3. LUT 設(shè)置不當(dāng)1. 確認(rèn)圖像轉(zhuǎn)換代碼的位順序MSB/LSB與屏幕要求一致。通常 MSB 對(duì)應(yīng)最左邊的像素。2. 確認(rèn)width * height / 8計(jì)算無(wú)誤且發(fā)送的數(shù)據(jù)量正好等于這個(gè)值。3. 對(duì)于三色屏黑白紅數(shù)據(jù)的發(fā)送順序和對(duì)應(yīng)的命令可能不同。仔細(xì)閱讀手冊(cè)。刷新一次后屏幕死機(jī)1. 未正確等待 BUSY 信號(hào)2. 刷新后未發(fā)送休眠指令屏幕處于高功耗狀態(tài)1.確保每次發(fā)送刷新命令0x20后都調(diào)用了wait_until_idle()。2. 顯示完成后主動(dòng)調(diào)用sleep()函數(shù)讓屏幕進(jìn)入低功耗模式。4.2 性能優(yōu)化與省電策略局部刷新如果只更新屏幕的一小部分如數(shù)字時(shí)鐘的秒位全屏刷新既慢又耗電且會(huì)全屏閃爍。部分 e-Paper 控制器支持局部刷新。你需要查閱數(shù)據(jù)手冊(cè)使用特定的命令序列設(shè)置局部刷新區(qū)域然后只發(fā)送該區(qū)域的數(shù)據(jù)。這能極大提升刷新速度和用戶(hù)體驗(yàn)。優(yōu)化圖像數(shù)據(jù)發(fā)送MicroPython 的spi.write()在發(fā)送大塊數(shù)據(jù)時(shí)效率尚可。但如果你需要極致的速度可以考慮使用memoryview來(lái)避免數(shù)據(jù)復(fù)制或者研究 Pico 的 PIO可編程 IO來(lái)模擬 SPI實(shí)現(xiàn)更底層的控制但對(duì)于 1MHz 的 e-Paper通常沒(méi)必要。深度睡眠與喚醒在電池供電的場(chǎng)景下讓 Pico 在兩次顯示更新間隔也進(jìn)入睡眠模式machine.lightsleep()或machine.deepsleep()可以大幅延長(zhǎng)續(xù)航。注意配置一個(gè)外部中斷如按鍵或 RTC 定時(shí)來(lái)喚醒 Pico然后 Pico 再去喚醒和驅(qū)動(dòng) e-Paper。幀緩沖區(qū)管理對(duì)于復(fù)雜 UI可以在 Pico 的內(nèi)存中維護(hù)一個(gè)完整的“幀緩沖區(qū)”framebuffer。所有繪圖操作畫(huà)線、寫(xiě)字、圖片都先在這個(gè)緩沖區(qū)進(jìn)行最后一次性調(diào)用display()將整個(gè)緩沖區(qū)發(fā)送到屏幕。MicroPython 有framebuf庫(kù)可以方便地實(shí)現(xiàn)這一點(diǎn)。4.3 進(jìn)階功能顯示文本與圖形直接操作字節(jié)緩沖區(qū)來(lái)畫(huà)圖非常麻煩。我們可以利用 MicroPython 自帶的framebuf模塊。import framebuf # 創(chuàng)建一個(gè)與屏幕大小匹配的幀緩沖區(qū) buf bytearray(296 * 152 // 8) # 5624 bytes fb framebuf.FrameBuffer(buf, 296, 152, framebuf.MONO_HLSB) # 注意格式MONO_HLSB 表示水平掃描字節(jié)內(nèi) LSB 在前??赡苄枰鶕?jù)屏幕調(diào)整。 # 現(xiàn)在可以在 fb 上作畫(huà)了 fb.fill(0) # 填充白色 fb.text(Hello Pico!, 10, 10, 1) # 在 (10,10) 位置用黑色(1)寫(xiě)文字 fb.hline(0, 30, 296, 1) # 畫(huà)一條黑線 fb.rect(50, 50, 100, 60, 1) # 畫(huà)一個(gè)矩形框 # 將幀緩沖區(qū)內(nèi)容發(fā)送到屏幕顯示 epd EPD_2in66() epd.display(buf) # 注意這里直接傳 buf而不是 fb 對(duì)象 epd.sleep()使用framebuf可以極大地簡(jiǎn)化圖形和文本的繪制。關(guān)鍵是理解framebuf.FrameBuffer的格式參數(shù)MONO_HLSB,MONO_HMSB等它定義了字節(jié)中比特與像素的映射關(guān)系這必須與你的 e-Paper 驅(qū)動(dòng)期望的格式匹配否則顯示會(huì)旋轉(zhuǎn)或鏡像。驅(qū)動(dòng)一塊 e-Paper 屏幕就像是在和一位慢性子的藝術(shù)家合作。你需要耐心地按照它的“工作手冊(cè)”數(shù)據(jù)手冊(cè)發(fā)出精確的指令并耐心等待它完成每一筆繪畫(huà)。整個(gè)過(guò)程融合了硬件接口知識(shí)、通信協(xié)議理解和軟件時(shí)序控制當(dāng)最終看到清晰的圖案在紙一般的屏幕上緩緩呈現(xiàn)時(shí)那種成就感是對(duì)所有調(diào)試工作最好的回報(bào)。希望這份詳細(xì)的指南能幫你繞過(guò)我踩過(guò)的那些坑順利點(diǎn)亮你的 Pico e-Paper 項(xiàng)目。如果在實(shí)踐中遇到新的問(wèn)題不妨回頭仔細(xì)看看 BUSY 引腳和初始化序列這兩個(gè)地方是絕大多數(shù)問(wèn)題的根源。

相關(guān)新聞

Godot狀態(tài)圖開(kāi)發(fā)實(shí)戰(zhàn):從概念到應(yīng)用,解決復(fù)雜狀態(tài)管理難題

Godot狀態(tài)圖開(kāi)發(fā)實(shí)戰(zhàn):從概念到應(yīng)用,解決復(fù)雜狀態(tài)管理難題

1. 項(xiàng)目概述:為什么我們需要State Charts?如果你正在用Godot做游戲,尤其是涉及到角色行為、UI流程或者任何有復(fù)雜狀態(tài)切換的邏輯,那你大概率已經(jīng)體會(huì)過(guò)傳統(tǒng)狀態(tài)機(jī)(Finite State Machine, FSM)的痛點(diǎn)了。狀態(tài)…

2026/8/2 9:35:20 閱讀更多
TPFanCtrl2 v2.3.3雙風(fēng)扇嵌入式控制器深度配置指南

TPFanCtrl2 v2.3.3雙風(fēng)扇嵌入式控制器深度配置指南

TPFanCtrl2 v2.3.3雙風(fēng)扇嵌入式控制器深度配置指南 【免費(fèi)下載鏈接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 項(xiàng)目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 TPFanCtrl2是一款基于Windows平臺(tái)的ThinkPad筆記本風(fēng)扇控制解決方案…

2026/8/2 9:35:20 閱讀更多
CM4S核心板深度解析:RK3568工業(yè)模塊與可插拔eMMC設(shè)計(jì)實(shí)戰(zhàn)

CM4S核心板深度解析:RK3568工業(yè)模塊與可插拔eMMC設(shè)計(jì)實(shí)戰(zhàn)

1. 項(xiàng)目概述:CM4S是什么,以及為什么它值得關(guān)注 最近在折騰嵌入式開(kāi)發(fā)板的朋友圈里,CM4S這個(gè)詞的熱度有點(diǎn)高。乍一看,很多人會(huì)把它和樹(shù)莓派基金會(huì)那款經(jīng)典的Compute Module 4(CM4)搞混,但實(shí)際上&…

2026/8/2 9:25:20 閱讀更多
一臺(tái)Mac也能跑Kimi K3!128GB內(nèi)存硬塞1.6TB權(quán)重

一臺(tái)Mac也能跑Kimi K3!128GB內(nèi)存硬塞1.6TB權(quán)重

Kimi K3 開(kāi)放完整權(quán)重后,不少人都躍躍欲試。2.8 萬(wàn)億參數(shù)、官方 MXFP4 權(quán)重,擁有了這些,你就可以自己搗鼓這個(gè)規(guī)模巨大的模型,可以部署到本地?,F(xiàn)實(shí)情況真有這么簡(jiǎn)單嗎?有人總結(jié),運(yùn)行 Kimi K3 其實(shí)很容易&a…

2026/8/2 10:25:21 閱讀更多
GDB高效調(diào)試:display、list、watch、x命令實(shí)戰(zhàn)指南

GDB高效調(diào)試:display、list、watch、x命令實(shí)戰(zhàn)指南

1. 從“手動(dòng)”到“自動(dòng)”:為什么我們需要更智能的調(diào)試調(diào)試,尤其是用 gdb 這種命令行工具,很多時(shí)候感覺(jué)像是在黑暗的房間里摸索。你設(shè)個(gè)斷點(diǎn),程序停下來(lái)了,然后呢?你得手動(dòng)敲print命令去看變量a的值&#xf…

2026/8/2 10:25:21 閱讀更多
OpenCV模板匹配實(shí)戰(zhàn):從原理到多目標(biāo)檢測(cè)與性能優(yōu)化

OpenCV模板匹配實(shí)戰(zhàn):從原理到多目標(biāo)檢測(cè)與性能優(yōu)化

1. 項(xiàng)目概述:從“找茬”到工業(yè)質(zhì)檢,模板匹配的實(shí)戰(zhàn)價(jià)值如果你玩過(guò)“大家來(lái)找茬”這類(lèi)游戲,或者用過(guò)手機(jī)上的“以圖搜圖”功能,那你已經(jīng)對(duì)圖像匹配有了最直觀的感受。在工業(yè)自動(dòng)化、安防監(jiān)控、甚至我們?nèi)粘5奈臋n處理中&#xff0c…

2026/8/2 10:25:21 閱讀更多
汽車(chē)金融Voice Agent:AI語(yǔ)音智能體如何重塑業(yè)務(wù)流程與用戶(hù)體驗(yàn)

汽車(chē)金融Voice Agent:AI語(yǔ)音智能體如何重塑業(yè)務(wù)流程與用戶(hù)體驗(yàn)

1. 從預(yù)言到現(xiàn)實(shí):汽車(chē)金融的“智能副駕”時(shí)代 黃仁勛關(guān)于“AI將創(chuàng)造100萬(wàn)億美元價(jià)值”的預(yù)言,聽(tīng)起來(lái)宏大而遙遠(yuǎn),但技術(shù)的落地往往是從一個(gè)個(gè)具體的場(chǎng)景開(kāi)始的。最近,易鑫集團(tuán)推出的Voice Agent(語(yǔ)音智能體)…

2026/8/2 10:25:21 閱讀更多
QQ空間歷史說(shuō)說(shuō)數(shù)據(jù)導(dǎo)出工具GetQzonehistory:技術(shù)實(shí)現(xiàn)與隱私保護(hù)完整指南

QQ空間歷史說(shuō)說(shuō)數(shù)據(jù)導(dǎo)出工具GetQzonehistory:技術(shù)實(shí)現(xiàn)與隱私保護(hù)完整指南

QQ空間歷史說(shuō)說(shuō)數(shù)據(jù)導(dǎo)出工具GetQzonehistory:技術(shù)實(shí)現(xiàn)與隱私保護(hù)完整指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在數(shù)字化記憶日益珍貴的今天,QQ空間承載…

2026/8/2 10:15:21 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類(lèi)短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書(shū),視頻號(hào)上,賺錢(qián)從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類(lèi)短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書(shū),視頻號(hào)上,賺錢(qián)從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/2 0:04:00 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專(zhuān)用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/2 2:52:49 閱讀更多