ESPHome使用ESP32C3开发板来驱动st7796的3.5寸TFT屏幕,不运行及报Could not allocate buffer for display1

使用的是ESP32C3开发板经典款,也就是自带串口芯片的

用ESPHome新建立一个设备(Device),输入名字后,选跳过这一步

然后选ESP32C3,记得把下方的use recommended settings取消打勾!

具体的板型号选AirM2M CORE ESP32C3

这是配置代码,供参考,引脚接线

接线方式(供参考)

ESP32C3      <->      转接板

GPIO2                      SCK

GPIO3                      SD(MOSI)

GPIO7                      CS

GPIO6                      DC

GPIO11                    RESET

GPIO18                   LED(BL)

esphome:
  name: esp32c3-tft
  friendly_name: esp32c3-tft
  platformio_options:
    board_build.flash_mode: dio

  # 在初始化时打印内存信息
  on_boot:
    priority: -10
    then:
      - output.turn_on: screen_backlight
      - output.set_level: 
          id: screen_backlight
          level: 50%   # 初始亮度为100%,可以根据需要修改
      - lambda: |-
          ESP_LOGD("BOOT", "Free RAM: %u bytes", esp_get_free_heap_size());
          
esp32:
  board: airm2m_core_esp32c3
  framework:
    type: arduino

# Enable logging
logger:
  baud_rate: 115200  # 设置串行监控的波特率,旧版本中可能称为monitor_speed

# Enable Home Assistant API
api:
  encryption:
    key: ""
  # 没有连接HA,默认15min会重启一次,设置为0s,将不再重启
  reboot_timeout: 0s

web_server:
  port: 80
  auth:
    username: !secret web_server_user
    password: !secret web_server_password

ota:
  - platform: esphome
    password: "f41a65a7e1d0c41c07e1a21e2efd79d7"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  on_connect:
    - light.turn_on: wifi_status
    - output.turn_on: screen_backlight
    - output.set_level: 
        id: screen_backlight
        level: 50%   # 初始亮度为100%,可以根据需要修改

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32C3-Tft Fallback Hotspot"
    password: "Mw3INQwU2VG8"

captive_portal:
    
output:
  - platform: ledc    
    pin: GPIO18
    id: screen_backlight
    frequency: 200
    

light:
  # 如果需要通过服务调整背光,则可以通过服务调用来完成
  # 例如,通过homeassistant中的light实体控制,我们可以添加一个模拟灯实体来控制背光
  - platform: monochromatic
    name: "Screen Backlight"
    output: screen_backlight
    gamma_correct: 0.7 # 可选: 改善亮度线性度
    restore_mode: ALWAYS_OFF

spi:
  - id: spi_bus
    clk_pin: GPIO2
    mosi_pin: GPIO3
    miso_pin: GPIO10
    # interface  software, hardware, spi, spi2 or spi3
    interface: hardware

# display Example minimal configuration entry
display:
 - platform: ili9xxx
   model: ST7796
   id: tft_ha
   dc_pin: GPIO6
   reset_pin: GPIO11
   cs_pin: GPIO7
   color_order: BGR
   auto_clear_enabled: true
   dimensions: 
     width: 320
     height: 480
   rotation: 270
   invert_colors: false
   show_test_card: true
   data_rate: 20000000.0
   color_palette: 8BIT
    # 显示测试卡需要分配一个全屏缓冲区,320*480,16bit的显示屏,需要307K的内存,但ESP32C3默认启动后,只剩余约200K的内存了,会造成错误
   lambda: |-
     auto black = Color(0, 0, 0);
     auto red = Color(255, 0, 0);
     auto green = Color(0, 255, 0);
     auto blue = Color(0, 0, 255);
     auto white = Color(255, 255, 255);
     it.filled_circle(20, 32, 15, green);

        刚开始时,我是在fnNAS上安装的esphome,所以在上面添加的设备及配置,然后在网页上面编译并上传刷新固件后,ESP32C3启动就卡住了,未正常运行。

        最终发现是它生成的platformio.ini内有这两行

build_flags =
    -DARDUINO_USB_CDC_ON_BOOT=1
    -DARDUINO_USB_MODE=1

        当使用经典版时,这两行就会造成启动卡死,但是编译配置文件后,它会自动的添加这两行。

        所以我在电脑本地安装了esphome环境,在本地环境上编辑配置,然后它生成的源代码就在我本地了,然后每次编辑配置后,把这两行删除掉,再用vs的platformIO进行编译、上传固件,就OK了!

        还有配置内的DIO也是重要的。

platformio_options:
    board_build.flash_mode: dio

        我用的显示屏是spi接口的,分辨率是320*480,刚开始时没有设置color_palette:8BIT,运行后,其它都正常,但是屏幕未工作,全是花的,看日志,发现display init  fail,再向前查,看到 Could not allocate buffer for display

        跟踪代码后发现,这个驱动,初始化的时候,会申请一块内存缓冲区,大小为屏幕宽度*高度,如果是16bit的屏幕,要再*2,这块320*480的屏,大概需要300K的内存,然后ESP32C3的总内存才300多K,再被ESPHOME底层,WIFI,API,WEB等占用一些后,只有200K左右的内存了,所以会失败,屏幕无法工作。

        我们把色彩设置为8Bit,测试时还可以把分辨率设置小一点,比如240*320,用于验证功能是否正常

        解决内存问题后,就可以看到画面了

        总结:

                调试方便,使用经典款,但是不能直接使用ESPHOME生成固件

                内存小,不建议使用大分辨率的屏幕,上限可能就是240*320,功能极简情况下可以到320*480,8BIT

                要驱动320*480,16BIT的,建议更换ESP32S3,带PSRAM的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值