esp32s3-i2c (OLED在线组件获取)
·
新建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);
}
}
更多推荐
所有评论(0)