新建bsp组件文件

bsp_i2c.c

#include "bsp_i2c.h"

i2c_master_bus_handle_t i2c0_bus_handle = NULL;

/**
 * @brief  初始化 I2C 主机总线
 *         配置 I2C0 端口的引脚、时钟源等参数,并安装 I2C 主机总线驱动
 */
void bsp_i2c_init()
{
    i2c_master_bus_config_t i2c0_bus_config = {
        .clk_source = I2C_CLK_SRC_DEFAULT,   // 使用默认时钟源
        .i2c_port = I2C_NUM_0,                // 选择 I2C 端口 0
        .scl_io_num = GPIO_NUM_42,            // SCL(时钟线)连接到 GPIO42
        .sda_io_num = GPIO_NUM_41,            // SDA(数据线)连接到 GPIO41
        .glitch_ignore_cnt = 7,                // 毛刺忽略计数,数值越大抗干扰能力越强
        .flags ={
            .enable_internal_pullup = true,    // 使能内部上拉电阻
        }
    };  

    // 创建并安装 I2C 主机总线驱动,返回总线句柄
    i2c_new_master_bus(&i2c0_bus_config, &i2c0_bus_handle);
}

bsp_i2c.h

#ifndef __BSP_I2C_H__
#define __BSP_I2C_H__
#include "driver/i2c_master.h"

void bsp_i2c_init(void);

#endif

主要记住修改CMakeLists文件!

1.添加C文件

2.esp_driver_i2c

I2C初始化

i2c_master_bus_config_t

i2c_new_master_bus

具体代码在上述bsp组件文件中提到

添加OLED组件

Ctrl+Shift+p

搜索SSD1306

install完成会在文件夹生成新的组件文件

了解OLED组件

src 驱动源文件

include 对应的头文件

example 使用例子

运用OLED组件

创建线程

task_oled.c 

#include "task_oled.h"

static TaskHandle_t oled_task_handle = NULL;
ssd1306_handle_t oled_handle = NULL;

/**
 * @brief  初始化 SSD1306 OLED 显示屏
 *         配置屏幕分辨率、I2C 接口参数,并创建 SSD1306 驱动句柄
 */
void oled_init(void)
{
       ssd1306_config_t oled_cfg = {
        .width  = 128,                  // 屏幕宽度(像素)
        .height = 64,                   // 屏幕高度(像素)
        .fb     = NULL,                 // 帧缓冲区由驱动内部分配
        .fb_len = 0,                    // 帧缓冲区长度(0 表示自动计算)
        .iface.i2c =
            {
                .port     = I2C_NUM_0,   // 使用 I2C 端口 0
                .addr     = 0x3C,        // SSD1306 典型 I2C 从机地址
                .rst_gpio = GPIO_NUM_NC, // 无复位引脚
            },
    };

    // 创建 I2C 接口的 SSD1306 驱动
    ESP_ERROR_CHECK(ssd1306_new_i2c(&oled_cfg, &oled_handle));
    // 清屏
    ESP_ERROR_CHECK(ssd1306_clear(oled_handle));
}

/**
 * @brief  OLED 显示屏测试绘制
 *         演示像素、矩形、圆形、直线、文字等绘图函数的使用
 */
void oled_test_display(void)
{
       // 在屏幕四个角绘制像素点
    ESP_ERROR_CHECK(ssd1306_draw_pixel(oled_handle, 0, 0, true));
    ESP_ERROR_CHECK(ssd1306_draw_pixel(oled_handle, 127, 0, true));
    ESP_ERROR_CHECK(ssd1306_draw_pixel(oled_handle, 0, 63, true));
    ESP_ERROR_CHECK(ssd1306_draw_pixel(oled_handle, 127, 63, true));

    // 绘制矩形(空心 & 实心)
    ESP_ERROR_CHECK(ssd1306_draw_rect(oled_handle, 2, 2, 40, 20, false));
    ESP_ERROR_CHECK(ssd1306_draw_rect(oled_handle, 2, 24, 32, 16, true));

    // 绘制圆形(实心 & 空心)
    ESP_ERROR_CHECK(ssd1306_draw_circle(oled_handle, 32, 52, 8, true));
    ESP_ERROR_CHECK(ssd1306_draw_circle(oled_handle, 100, 52, 4, false));

    // 绘制直线
    ESP_ERROR_CHECK(ssd1306_draw_line(oled_handle, 2, 2, 40, 20, true));
    ESP_ERROR_CHECK(ssd1306_draw_line(oled_handle, 32, 52, 100, 52, true));

    // 绘制文字
    ESP_ERROR_CHECK(ssd1306_draw_text(oled_handle, 48, 2, "OK!", true));
    ESP_ERROR_CHECK(
        ssd1306_draw_text_scaled(oled_handle, 48, 10, "Hello\nWorld!", true, 2));

    // 将缓冲区内容刷新到屏幕
    ESP_ERROR_CHECK(ssd1306_display(oled_handle));
        
}

/**
 * @brief  OLED 任务主函数
 *         初始化 OLED 并执行一次测试绘制,随后进入空闲等待
 */
void oled_task(void *pvParameters)
{
    oled_init();
    oled_test_display();
    while(1)
    {
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

/**
 * @brief  创建 OLED 任务
 *         @return  成功返回 pdPASS,失败返回 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY
 */
BaseType_t oled_task_create(void)
{
    return xTaskCreate(oled_task, "oled_task",2048*2, NULL, 10, &oled_task_handle);
}

task_oled.h

#ifndef __TASK_OLED_H__
#define __TASK_OLED_H__

#include "bsp_i2c.h"
#include "ssd1306.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

BaseType_t oled_task_create(void);
void oled_init(void);
void oled_task(void *pvParameters);
void oled_test_display(void);
#endif

main函数

初始化i2c、创建oled线程

void app_main(void)
{
  
    bsp_i2c_init();
    oled_task_create();
    while(1)
    {     
        vTaskDelay(10 / portTICK_PERIOD_MS);
    }
}

更多推荐