这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 有奖活动 » 基于WT9932C61-TINY的环境构建及OLED屏驱动测试

共4条 1/1 1 跳转至页

基于WT9932C61-TINY的环境构建及OLED屏驱动测试 20

菜鸟
2026-06-16 12:53:54     打赏

前端时间得到一款小板子WT9932C61-TINY,引脚不多起初没太拿他当回事儿,后来随着不断的使用和了解,才发现它还是非常不错的。

不同于其它的ESP系列产品,目前该开发板多是采用VS Code + ESP-IDF的开发模式。

其开发环境搭建过程如下:

1)在网站:https://dl.espressif.cn/dl/eim/,下载eim-gui-windows-x64.exe。

image.png

2)运行eim-gui-windows-x64.exe,然后点击“开始安装”。

image.png

图1 开始安装

3)选取自定义安装”及目标芯片,见图2所示。

image.png

图2 选取目标芯片

4)选取安装路径,见图3所示。

image.png

图3 选取路径

5)进行安装,安装速度较慢,需耐心等待。

image.png

图4 安装过程中

在完成安装后,其界面如图5所示。

image.png

图5 完成安装 

6)保存配置,见图6所示。

image.png

图6 保存配置 

最后,选取“退出安装程序”即可。

7)安装VS Code,并在其中搜索“ espidf”予以安装,见图7和图8所示。

image.png

图7 搜索 “espidf”

image.png

图8 进行安装

在完成安装后,如图9所示。

image.png


图9 完成安装 

8)打开程序i2c_u8g2,其程序内容为:

static uint8_t u8x8_byte_i2c_cb(u8x8_t *u8x8, uint8_t msg,
                                uint8_t arg_int, void *arg_ptr)
{
    static uint8_t buffer[132];    static uint8_t buf_idx;
    switch (msg) {
    case U8X8_MSG_BYTE_INIT:
        i2c_device_config_t dev_config = {
            .dev_addr_length = I2C_ADDR_BIT_LEN_7,
            .device_address = I2C_DISPLAY_ADDRESS,
            .scl_speed_hz = I2C_FREQ_HZ,
            .scl_wait_us = 0, 
            .flags.disable_ack_check = false,
        };
        esp_err_t ret = i2c_master_bus_add_device(i2c_bus_handle, &dev_config, &display_dev_handle);
        if (ret != ESP_OK) {
            ESP_LOGE(TAG, "I2C master driver initialized failed");
            return 0;
        }
        ESP_LOGI(TAG, "I2C master driver initialized successfully");
        break;
    case U8X8_MSG_BYTE_START_TRANSFER:
        buf_idx = 0;
        break;
    case U8X8_MSG_BYTE_SET_DC:
        break;
    case U8X8_MSG_BYTE_SEND:
        for (size_t i = 0; i < arg_int; ++i) {
            buffer[buf_idx++] = *((uint8_t*)arg_ptr + i);
        }
        break;
    case U8X8_MSG_BYTE_END_TRANSFER:
        if (buf_idx > 0 && display_dev_handle != NULL) {
            esp_err_t ret = i2c_master_transmit(display_dev_handle, buffer, buf_idx, I2C_TIMEOUT_MS);
            if (ret != ESP_OK) {
                ESP_LOGE(TAG, "I2C master transmission failed");
                return 0;
            }
            ESP_LOGD(TAG, "Sent %d bytes to 0x%02X: control_byte=0x%02X",
                     buf_idx, I2C_DISPLAY_ADDRESS, buffer[0]);
        }
        break;
    default:
        return 0;
    }
    return 1;
}
 
static uint8_t u8x8_gpio_delay_cb(u8x8_t *u8x8, uint8_t msg,
                                  uint8_t arg_int, void *arg_ptr)
{
    switch (msg) {
    case U8X8_MSG_GPIO_AND_DELAY_INIT:
        ESP_LOGI(TAG, "GPIO and delay initialization completed");
        break;
    case U8X8_MSG_DELAY_MILLI:
        vTaskDelay(pdMS_TO_TICKS(arg_int));
        break;
    case U8X8_MSG_DELAY_10MICRO:
        esp_rom_delay_us(arg_int * 10);
        break;
    case U8X8_MSG_DELAY_100NANO:
        __asm__ __volatile__("nop");
        break;
    case U8X8_MSG_DELAY_I2C:
        esp_rom_delay_us(5 / arg_int);
        break;
    case U8X8_MSG_GPIO_RESET:
        break;
    default:
        return 0;    }
    return 1;
}
 
static void show_demo_cycle(u8g2_t* u8g2, int demo_cycle)
{
    u8g2_ClearBuffer(u8g2);
    u8g2_SetFont(u8g2, u8g2_font_ncenB08_tr);
    u8g2_DrawStr(u8g2, 25, 25, "Demo Cycle");
    u8g2_SetFont(u8g2, u8g2_font_ncenB14_tr);
    char cycle_str[16];
    snprintf(cycle_str, sizeof(cycle_str), "%d", demo_cycle);
    u8g2_DrawStr(u8g2, 55, 45, cycle_str);
    u8g2_SendBuffer(u8g2);
    vTaskDelay(pdMS_TO_TICKS(2000));
}
 
void app_main(void)
{
    u8g2_t u8g2;
    ESP_LOGI(TAG, "Starting U8G2 display demo program (menuconfig based configuration)");
    ESP_LOGI(TAG, "I2C Configuration: SDA=GPIO%d, SCL=GPIO%d, Freq=%dHz, Timeout=%dms",
             I2C_MASTER_SDA_IO, I2C_MASTER_SCL_IO, I2C_FREQ_HZ, I2C_TIMEOUT_MS);
    ESP_LOGI(TAG, "Display Configuration: Address=0x%02X",
             I2C_DISPLAY_ADDRESS);
    i2c_master_bus_config_t bus_config = {
        .i2c_port = I2C_MASTER_NUM,
        .sda_io_num = I2C_MASTER_SDA_IO,
        .scl_io_num = I2C_MASTER_SCL_IO,
        .clk_source = I2C_CLK_SRC_DEFAULT,
        .glitch_ignore_cnt = 7,
        .intr_priority = 0,
        .trans_queue_depth = 0,  
        .flags.enable_internal_pullup = true,
    };
    ESP_ERROR_CHECK(i2c_new_master_bus(&bus_config, &i2c_bus_handle));
 
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(
        &u8g2, U8G2_R0,
        u8x8_byte_i2c_cb, 
        u8x8_gpio_delay_cb
    );
    ESP_LOGI(TAG, "Initializing display...");
    u8g2_InitDisplay(&u8g2);
    ESP_LOGI(TAG, "Setting power mode...");
    u8g2_SetPowerSave(&u8g2, 0);  
    ESP_LOGI(TAG, "Display initialization completed");
    int demo_cycle = 0;
    while (1) {
        ESP_LOGI(TAG, "Demo cycle: %d", ++demo_cycle);
        demo_text_display(&u8g2);
        demo_shapes(&u8g2);
        demo_pixels(&u8g2);
        demo_progress_bar(&u8g2);
        demo_animation(&u8g2);
        demo_bitmap(&u8g2);
        show_demo_cycle(&u8g2, demo_cycle);
    }
}

9)进行编译,其结果如图10所示。

image.png

图10 编译结果 

10)下载测试,其结果见图11所示,说明下载成功。

image.png

图11 完成下载 

11)确认连接关系

程序已完成下载,单如何连接OLED屏呢?

使用配置编辑功能,查看配置情况,见图12所示。

image.png

图12 连接关系 

12)测试效果

在完成连接后,其测试效果见图13至图17所示。

image.png

图13显示字体

image.png

图14显示图形

image.png

图15显示图像

image.png

图16显示进程条

image.png

图17动画效果

有此类需求的方便啦,可以轻松地直达目标!

演示视频:



专家
2026-06-22 07:49:18     打赏
2楼

“8)打开程序i2c_u8g2,其程序内容为:”这一步比较突兀,是某个例程的一部分?


高工
2026-06-23 10:09:22     打赏
3楼

这个u8g2 的图形库的资源占用情况 看上去还是很小的。


高工
2026-06-25 15:54:07     打赏
4楼

U8G2 直接使用组件管理器一搞就行。我记得我之前好像做过U8G2的显示。还是蛮方便的


共4条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]