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

共1条 1/1 1 跳转至

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

菜鸟
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动画效果

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

演示视频:



共1条 1/1 1 跳转至

回复

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