2301_80893287 2025-07-29 00:52 采纳率: 0%
浏览 15

墨水屏无法复原,同时显示乱码

墨水屏无法复原,同时显示乱码
各位佬帮帮忙吧qwq
以下是我的esp32插线,驱动板,墨水屏

img

img

img

img


下面是全白的代码,但是没什么作用

from machine import Pin, SPI
import time

class EPD:
    def __init__(self, spi, cs, dc, rst, busy, cs2):
        self.spi = spi
        self.cs = cs
        self.dc = dc
        self.rst = rst
        self.busy = busy
        self.cs2 = cs2
        
        self.width = 296
        self.height = 128
        
        self.cs.init(self.cs.OUT, value=1)
        self.dc.init(self.dc.OUT, value=0)
        self.rst.init(self.rst.OUT, value=0)
        self.busy.init(self.busy.IN)
        self.cs2.init(self.cs2.OUT, value=1)
        
        self.init()

    def write_cmd(self, cmd):
        self.dc(0)
        self.cs(0)
        self.spi.write(bytearray([cmd]))
        self.cs(1)

    def write_data(self, data):
        self.dc(1)
        self.cs(0)
        self.spi.write(data)
        self.cs(1)

    def wait_until_idle(self):
        while self.busy() == 1:
            time.sleep_ms(10)

    def init(self):
        self.reset()
        
        self.write_cmd(0x12)  # SWRESET
        self.wait_until_idle()
        
        # 设置面板配置
        self.write_cmd(0x01)  # DRIVER_OUTPUT_CONTROL
        self.write_data(bytearray([(self.height - 1) & 0xFF]))
        self.write_data(bytearray([((self.height - 1) >> 8) & 0xFF]))
        self.write_data(bytearray([0x00]))  # GD = 0; SM = 0; TB = 0
        
        self.write_cmd(0x11)  # DATA_ENTRY_MODE
        self.write_data(bytearray([0x03]))  # X increment; Y increment
        
        # 设置RAM地址
        self.write_cmd(0x44)  # SET_RAM_X_ADDRESS_START_END_POSITION
        self.write_data(bytearray([0x00]))
        self.write_data(bytearray([(self.width // 8) - 1]))
        
        self.write_cmd(0x45)  # SET_RAM_Y_ADDRESS_START_END_POSITION
        self.write_data(bytearray([0x00, 0x00]))
        self.write_data(bytearray([(self.height - 1) & 0xFF]))
        self.write_data(bytearray([((self.height - 1) >> 8) & 0xFF]))
        
        # 设置RAM指针
        self.write_cmd(0x4E)  # SET_RAM_X_ADDRESS_COUNTER
        self.write_data(bytearray([0x00]))
        
        self.write_cmd(0x4F)  # SET_RAM_Y_ADDRESS_COUNTER
        self.write_data(bytearray([0x00, 0x00]))
        
        # 设置波形
        self.write_cmd(0x32)
        self.write_data(bytearray([
            0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00,
            0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00,
            0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00,
            0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
        ]))
        
        # 设置边框波形控制
        self.write_cmd(0x3C)  # BORDER_WAVEFORM_CONTROL
        self.write_data(bytearray([0x05]))
        
        # 设置显示更新控制
        self.write_cmd(0x22)  # DISPLAY_UPDATE_CONTROL_2
        self.write_data(bytearray([0xC7]))
        self.write_cmd(0x20)  # MASTER_ACTIVATION
        
        self.wait_until_idle()

    def reset(self):
        self.rst(1)
        time.sleep_ms(20)
        self.rst(0)
        time.sleep_ms(2)
        self.rst(1)
        time.sleep_ms(20)

    def display_white(self):
        # 创建全白缓冲区 (所有位设置为1)
        white_buffer = bytearray([0xFF] * (self.width * self.height // 8))
        
        self.write_cmd(0x24)  # WRITE_RAM
        self.write_data(white_buffer)
        
        # 触发显示更新
        self.write_cmd(0x22)  # DISPLAY_UPDATE_CONTROL_2
        self.write_data(bytearray([0xC7]))
        self.write_cmd(0x20)  # MASTER_ACTIVATION
        
        self.wait_until_idle()

    def sleep(self):
        self.write_cmd(0x10)  # DEEP_SLEEP_MODE
        self.write_data(bytearray([0x01]))
        time.sleep_ms(100)

# 主程序
def main():
    # 初始化SPI
    spi = SPI(2, baudrate=20000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23))
    
    # 初始化墨水屏
    epd = EPD(spi, cs=Pin(5), dc=Pin(4), rst=Pin(16), busy=Pin(17), cs2=Pin(22))
    
    # 显示全白
    epd.display_white()
    
    # 进入睡眠模式
    epd.sleep()
    print("Screen is now white and in sleep mode")

if __name__ == "__main__":
    main()

后面是我主要程序的代码
主要想做一个显示天气的墨水屏
对了,其实代码都是ai写的
完全不会啊qwq
有一个背景,但显示错误
wifi_ssid和wifi_password打的*,各位记得改一改
用的weather_api
weather_api_key就放在上面了
先是驱动epaper29l.py

from machine import Pin, SPI
import time

class EPD:
    def __init__(self, spi, cs, dc, rst, busy, cs2):
        self.spi = spi
        self.cs = cs
        self.dc = dc
        self.rst = rst
        self.busy = busy
        self.cs2 = cs2
        
        self.width = 296
        self.height = 128
        
        self.cs.init(self.cs.OUT, value=1)
        self.dc.init(self.dc.OUT, value=0)
        self.rst.init(self.rst.OUT, value=0)
        self.busy.init(self.busy.IN)
        self.cs2.init(self.cs2.OUT, value=1)
        
        self.init()

    def write_cmd(self, cmd):
        self.dc(0)
        self.cs(0)
        self.spi.write(bytearray([cmd]))
        self.cs(1)

    def write_data(self, data):
        self.dc(1)
        self.cs(0)
        self.spi.write(data)
        self.cs(1)

    def wait_until_idle(self):
        while self.busy() == 1:
            time.sleep_ms(10)

    def init(self):
        self.reset()
        
        self.write_cmd(0x12)  # SWRESET
        self.wait_until_idle()
        
        # 设置面板配置
        self.write_cmd(0x01)  # DRIVER_OUTPUT_CONTROL
        self.write_data(bytearray([(self.height - 1) & 0xFF]))
        self.write_data(bytearray([((self.height - 1) >> 8) & 0xFF]))
        self.write_data(bytearray([0x00]))  # GD = 0; SM = 0; TB = 0
        
        self.write_cmd(0x11)  # DATA_ENTRY_MODE
        self.write_data(bytearray([0x03]))  # X increment; Y increment
        
        # 设置RAM地址
        self.write_cmd(0x44)  # SET_RAM_X_ADDRESS_START_END_POSITION
        self.write_data(bytearray([0x00]))
        self.write_data(bytearray([(self.width // 8) - 1]))
        
        self.write_cmd(0x45)  # SET_RAM_Y_ADDRESS_START_END_POSITION
        self.write_data(bytearray([0x00, 0x00]))
        self.write_data(bytearray([(self.height - 1) & 0xFF]))
        self.write_data(bytearray([((self.height - 1) >> 8) & 0xFF]))
        
        # 设置RAM指针
        self.write_cmd(0x4E)  # SET_RAM_X_ADDRESS_COUNTER
        self.write_data(bytearray([0x00]))
        
        self.write_cmd(0x4F)  # SET_RAM_Y_ADDRESS_COUNTER
        self.write_data(bytearray([0x00, 0x00]))
        
        # 设置波形
        self.write_cmd(0x32)
        self.write_data(bytearray([
            0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00,
            0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00,
            0x80, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00,
            0x10, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
        ]))
        
        # 设置边框波形控制
        self.write_cmd(0x3C)  # BORDER_WAVEFORM_CONTROL
        self.write_data(bytearray([0x05]))
        
        # 设置显示更新控制
        self.write_cmd(0x22)  # DISPLAY_UPDATE_CONTROL_2
        self.write_data(bytearray([0xC7]))
        self.write_cmd(0x20)  # MASTER_ACTIVATION
        
        self.wait_until_idle()

    def reset(self):
        self.rst(1)
        time.sleep_ms(20)
        self.rst(0)
        time.sleep_ms(2)
        self.rst(1)
        time.sleep_ms(20)

    def display(self, image_buffer):
        self.write_cmd(0x24)  # WRITE_RAM
        self.write_data(image_buffer)
        
        # 触发显示更新
        self.write_cmd(0x22)  # DISPLAY_UPDATE_CONTROL_2
        self.write_data(bytearray([0xC7]))
        self.write_cmd(0x20)  # MASTER_ACTIVATION
        
        self.wait_until_idle()

    def sleep(self):
        self.write_cmd(0x10)  # DEEP_SLEEP_MODE
        self.write_data(bytearray([0x01]))
        
        time.sleep_ms(100)

这是程序main.py

import machine
import network
import time
import urequests
import ujson
import ntptime
from machine import Pin, SPI
import epaper29l
import framebuf
from background import background
# 配置信息
CONFIG = {
    'wifi_ssid': '*',
    'wifi_password': '*',
    'weather_api_key': 'b939d90d48cc471d83590958251607',
    'city': 'Shanghai',
    'timezone': 8  # 上海时区 UTC+8
}

# 初始化墨水屏
spi = SPI(2, baudrate=9600, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23))
epd = epaper29l.EPD(spi, cs=Pin(5), dc=Pin(4), rst=Pin(16), busy=Pin(17), cs2=Pin(22))

def connect_wifi():
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print('Connecting to WiFi...')
        sta_if.active(True)
        sta_if.connect(CONFIG['wifi_ssid'], CONFIG['wifi_password'])
        while not sta_if.isconnected():
            time.sleep(0.5)
    print('Network config:', sta_if.ifconfig())

def sync_time():
    try:
        ntptime.settime()
        print("Time synchronized successfully")
    except Exception as e:
        print("Error syncing time:", e)

def get_weather():
    url = f"http://api.weatherapi.com/v1/current.json?key={CONFIG['weather_api_key']}&q={CONFIG['city']}"
    try:
        response = urequests.get(url)
        data = ujson.loads(response.text)
        response.close()
        
        weather_data = {
            'temp': data['current']['temp_c'],
            'condition': data['current']['condition']['text'],
            'humidity': data['current']['humidity'],
            'wind_kph': data['current']['wind_kph'],
            'icon': data['current']['condition']['code']
        }
        return weather_data
    except Exception as e:
        print("Error getting weather:", e)
        return None

def get_time_string():
    # 获取当前时间并调整为本地时区
    year, month, day, hour, minute, second, weekday, _ = time.localtime(time.time() + CONFIG['timezone'] * 3600)
    
    # 星期转换
    weekdays = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
    weekday_str = weekdays[weekday]
    
    # 日期字符串
    date_str = f"{year}{month:02d}{day:02d}{weekday_str}"
    
    # 时间字符串
    time_str = f"{hour:02d}:{minute:02d}:{second:02d}"
    
    return date_str, time_str

def draw_weather_info(weather_data):
    # 创建帧缓冲区
    buf = bytearray(4736)  # 296*128/8 = 4736
    fb = framebuf.FrameBuffer(buf, 296, 128, framebuf.MONO_HLSB)
    
    # 绘制背景
    fb.blit(framebuf.FrameBuffer(background, 296, 128, framebuf.MONO_HLSB), 0, 0)
    
    # 获取时间和日期
    date_str, time_str = get_time_string()
    
    # 在右侧绘制信息 (从x=150开始)
    fb.text(date_str, 150, 10, 0)
    fb.text(time_str, 150, 30, 0)
    
    if weather_data:
        # 天气信息
        weather_str = f"天气: {weather_data['condition']}"
        temp_str = f"温度: {weather_data['temp']}°C"
        humidity_str = f"湿度: {weather_data['humidity']}%"
        wind_str = f"风速: {weather_data['wind_kph']} km/h"
        
        fb.text(weather_str, 150, 50, 0)
        fb.text(temp_str, 150, 70, 0)
        fb.text(humidity_str, 150, 90, 0)
        fb.text(wind_str, 150, 110, 0)
    
    # 显示到墨水屏
    epd.init()
    epd.display(buf)
    epd.sleep()
    print(humidity_str)

def main():
    # 连接WiFi
    connect_wifi()
    
    # 同步时间
    sync_time()
    
    # 获取天气数据
    weather_data = get_weather()
    
    # 绘制并显示信息
    draw_weather_info(weather_data)
    
    # 进入深度睡眠 (1小时)
#    print("Going to sleep for 1 hour...")
#    machine.deepsleep(3600 * 1000)

if __name__ == "__main__":
    main()

然后是背景
应该长这样(296x128)由于长度限制,程序无法打出来
我画的卡比还可以吧

img

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-07-29 00:53
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    你的墨水屏显示全白后无法复原,同时出现乱码的问题,可能是由于以下几个原因导致的:


    1. 墨水屏未正确初始化或配置

    重点: 你可能没有正确设置墨水屏的寄存器参数,尤其是与刷新模式、颜色控制相关的命令。

    解决方案:

    • 检查你使用的墨水屏型号(例如:Waveshare 2.9" E-Paper Module),并确认驱动代码是否匹配该型号。
    • 确保 init() 函数中所有的寄存器设置都符合该型号的要求。

    建议:参考官方提供的驱动库(如 Waveshare 提供的 Python 库)来确认寄存器值。


    2. 显示更新命令不正确

    重点: 你使用了 display_white() 方法,但没有正确触发更新。有些墨水屏需要特定的“刷新”命令才能生效。

    解决方案:

    • display_white() 中,确保你调用了正确的更新命令。
    • 添加对 write_cmd(0x22)write_cmd(0x20) 的调用。

    修改后的代码示例:

    def display_white(self):
        # 创建全白缓冲区 (所有位设置为1)
        white_buffer = bytearray([0xFF] * (self.width * self.height // 8))
        
        self.write_cmd(0x24)  # WRITE_RAM
        self.write_data(white_buffer)
        
        # 触发显示更新
        self.write_cmd(0x22)  # DISPLAY_UPDATE_CONTROL_2
        self.write_data(bytearray([0xC7]))
        self.write_cmd(0x20)  # MASTER_ACTIVATION
        
        self.wait_until_idle()
    

    3. 墨水屏未正确复位或进入睡眠模式

    重点: 如果墨水屏在睡眠前没有正确退出,可能会导致显示异常。

    解决方案:

    • sleep() 方法中添加复位操作。
    • 或者在每次显示前重新初始化墨水屏。

    修改后的 sleep() 方法:

    def sleep(self):
        # 先执行复位
        self.reset()
        self.write_cmd(0x10)  # DEEP_SLEEP_MODE
        self.write_data(bytearray([0x01]))
        time.sleep_ms(100)
    

    4. SPI通信问题

    重点: SPI通信速度过高可能导致数据丢失,特别是对于某些墨水屏模块。

    解决方案:

    • 降低 SPI 的波特率,例如从 20000000 改为 1000000

    修改后的 SPI 初始化:

    spi = SPI(2, baudrate=1000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23))
    

    5. 显示内容未正确写入 RAM

    重点: 如果你只是写了 0xFF,而墨水屏是黑白双色的,这表示“白色”,但可能因为波形设置不对,导致无法正常显示。

    解决方案:

    • 确认你的墨水屏支持哪种颜色模式(比如:仅支持黑白,或者有灰度)。
    • 如果是黑白屏,确保你只使用 0x000xFF 表示黑和白。

    6. 墨水屏硬件连接问题

    重点: 如果硬件连接不稳定,也可能导致乱码或无法复原。

    解决方案:

    • 检查以下引脚是否连接正确:
      • CS(片选)
      • DC(数据/命令选择)
      • RST(复位)
      • BUSY(忙信号)
      • CS2(部分型号有多个 CS 引脚)

    7. 使用第三方库或已有的驱动

    重点: 你提到代码是 AI 写的,可能缺乏对具体墨水屏型号的支持。

    解决方案:


    8. 复原墨水屏的方法

    重点: 如果屏幕显示乱码,可以尝试强制清屏。

    解决方案:

    • display_white() 中加入 reset(),确保每次显示前重置屏幕。

    修改后的 display_white() 方法:

    def display_white(self):
        self.reset()  # 强制复位
        # 创建全白缓冲区
        white_buffer = bytearray([0xFF] * (self.width * self.height // 8))
        
        self.write_cmd(0x24)  # WRITE_RAM
        self.write_data(white_buffer)
        
        # 触发显示更新
        self.write_cmd(0x22)  # DISPLAY_UPDATE_CONTROL_2
        self.write_data(bytearray([0xC7]))
        self.write_cmd(0x20)  # MASTER_ACTIVATION
        
        self.wait_until_idle()
    

    总结:

    | 问题 | 解决方案 | |------|----------| | 初始化不正确 | 检查寄存器设置,参考官方文档 | | 更新命令错误 | 确保调用 0x220x20 | | SPI速度过高 | 降低 SPI 波特率 | | 硬件连接问题 | 检查各引脚连接 | | 显示内容错误 | 确保只使用 0x000xFF | | 复原失败 | 强制调用 reset() |


    如果你能提供具体的墨水屏型号(如:Waveshare 2.9" E-Paper Module),我可以为你提供更精确的代码和配置建议。希望这些信息对你有帮助!如果还有问题,欢迎继续提问 😊

    评论

报告相同问题?

问题事件

  • 修改了问题 7月29日
  • 创建了问题 7月29日