枕上 2025-07-30 18:37 采纳率: 0%
浏览 37

esp-idf ssd1309 i2c 点亮屏幕demo

芯片是esp32s2芯片,esp-idf, 需要点亮的显示屏是ssd1309 ,使用i2c协议去点亮屏幕,写一个代码demo

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-07-30 18:38
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    要使用 ESP32-S2 芯片和 ESP-IDF 框架通过 I2C 协议点亮 SSD1309 显示屏,你需要完成以下几个步骤:


    一、硬件连接

    确保 SSD1309 与 ESP32-S2 正确连接。通常 I2C 接口的引脚如下(以常见配置为例):

    | SSD1309 引脚 | ESP32-S2 引脚 | |--------------|----------------| | SCL | GPIO 22 | | SDA | GPIO 21 | | VCC | 3.3V | | GND | GND |

    注意:部分 SSD1309 模块可能需要外部电源或电平转换器,请根据模块说明调整。


    二、软件准备

    在 ESP-IDF 中,SSD1309 并不是官方支持的驱动,因此你可能需要使用第三方库或者自己实现基本的 OLED 控制逻辑。

    可选方案:

    1. 使用 esp-ssd1309 这个开源库。
    2. 自定义 I2C 操作,发送 SSD1309 的初始化指令和图像数据。

    这里我们提供一个基于 自定义 I2C 驱动最小化 Demo,帮助你快速点亮屏幕。


    三、代码实现

    1. 安装依赖

    确保你的项目中已包含 i2cgpio 组件。

    idf.py add-dependency esp-idf-i2c
    

    2. 示例代码

    #include <stdio.h>
    #include "driver/i2c.h"
    #include "driver/gpio.h"
    
    // I2C 地址(SSD1309 默认地址为 0x3C)
    #define SSD1309_I2C_ADDR 0x3C
    
    // I2C 配置
    #define I2C_MASTER_SCL_IO 22   // SCL pin
    #define I2C_MASTER_SDA_IO 21   // SDA pin
    #define I2C_MASTER_FREQ_HZ 100000
    
    // SSD1309 初始化命令
    const uint8_t ssd1309_init_commands[] = {
        0xAE, // 关闭显示
        0xD5, 0x80, // 设置时钟分频比
        0xA8, 0x1F, // 设置多路复用率
        0xD3, 0x00, // 设置显示偏移
        0x40,       // 设置起始行
        0x8D, 0x14, // DC-DC 转换器使能
        0x20, 0x00, // 设置内存模式(水平)
        0xA1,       // 设置列方向(正常)
        0xC8,       // 设置行方向(反转)
        0xDA, 0x12, // 设置 COM 引脚配置
        0x81, 0xFF, // 设置对比度
        0xD9, 0xF1, // 设置预充电周期
        0xDB, 0x40, // 设置 VCOMH 电压
        0xAF,       // 开启显示
    };
    
    // 发送 I2C 命令
    void i2c_send_cmd(uint8_t cmd) {
        i2c_cmd_handle_t cmd_obj = i2c_cmd_new();
        i2c_cmd_addr(cmd_obj, SSD1309_I2C_ADDR, I2C_CMD_WRITE);
        i2c_cmd_mem_write(cmd_obj, &cmd, 1);
        i2c_cmd_commit(cmd_obj);
    }
    
    // 发送 I2C 数据
    void i2c_send_data(uint8_t data) {
        i2c_cmd_handle_t cmd_obj = i2c_cmd_new();
        i2c_cmd_addr(cmd_obj, SSD1309_I2C_ADDR, I2C_CMD_WRITE);
        i2c_cmd_mem_write(cmd_obj, &data, 1);
        i2c_cmd_commit(cmd_obj);
    }
    
    // 初始化 SSD1309
    void ssd1309_init() {
        for (int i = 0; i < sizeof(ssd1309_init_commands); i++) {
            i2c_send_cmd(ssd1309_init_commands[i]);
        }
    }
    
    // 清屏
    void ssd1309_clear() {
        for (int page = 0; page < 8; page++) {
            i2c_send_cmd(0xB0 + page);     // 设置页地址
            i2c_send_cmd(0x00);            // 设置列低地址
            i2c_send_cmd(0x10);            // 设置列高地址
            for (int i = 0; i < 128; i++) {
                i2c_send_data(0x00);
            }
        }
    }
    
    // 主函数
    void app_main() {
        // 初始化 I2C
        i2c_config_t i2c_conf = {
            .mode = I2C_MODE_MASTER,
            .sda_io_num = I2C_MASTER_SDA_IO,
            .scl_io_num = I2C_MASTER_SCL_IO,
            .sda_pullup_en = GPIO_PULLUP_ENABLE,
            .scl_pullup_en = GPIO_PULLUP_ENABLE,
            .master.clk_speed = I2C_MASTER_FREQ_HZ
        };
        i2c_param_config(I2C_NUM_0, &i2c_conf);
        i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, NULL);
    
        // 初始化 SSD1309
        ssd1309_init();
    
        // 清屏
        ssd1309_clear();
    
        // 打印信息
        printf("SSD1309 initialized and cleared.\n");
    }
    

    四、编译与烧录

    1. 在项目目录下运行:
    idf.py build
    idf.py -p /dev/ttyUSB0 flash
    
    1. 烧录完成后,串口监视器查看输出:
    SSD1309 initialized and cleared.
    

    如果屏幕没有反应,检查以下几点:

    • I2C 地址是否正确(某些 SSD1309 模块可能使用 0x3D);
    • GPIO 引脚是否正确配置
    • 电源是否稳定
    • 是否有上拉电阻(SDA/SCL 是否接了 4.7kΩ 上拉电阻);

    五、扩展功能建议

    • 添加文字显示功能(如使用 u8g2 库);
    • 实现图形绘制(如点、线、矩形等);
    • 支持多种分辨率(如 128x64 或 128x32)。

    六、推荐库(可选)

    如果你希望更方便地操作 SSD1309,可以使用以下库:

    • u8g2: 支持 SSD1309 的图形库,兼容 ESP-IDF。
    • esp-ssd1309: 专为 ESP32 设计的 SSD1309 驱动。

    七、总结

    关键步骤总结:

    1. 硬件连接:正确连接 I2C 引脚和电源;
    2. I2C 配置:在 ESP-IDF 中初始化 I2C 接口;
    3. SSD1309 初始化:发送标准初始化指令;
    4. 清屏/显示:通过 I2C 发送数据控制显示内容;
    5. 调试:检查串口输出,确认初始化成功。

    如需进一步的功能扩展或具体图形显示示例,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 7月30日