【ESP32 IDF】ESP32移植u8g2库,实现oled界面显示

ESP32移植u8g2库,实现oled界面显示

  • 1. 简单描述
  • 2. 环境准备
        • 1. 硬件准备
        • 2. 软件准备
  • 3. IIC屏幕 【基于 ssd1362 + 256*64 】
  • 4. SPI屏幕 【基于 ssd1306 + 128*32】

1. 简单描述

  1. 开发方式为 IDF5.0
  2. 参考连接为
    iic基于esp-idf移植使用u8g2
    spi基于esp-idf移植使用u8g2

2. 环境准备

1. 硬件准备
  1. 首先屏幕有两种通信方式:spi,iic
  2. 然后得知道你手上屏幕的型号和分辨率:
  • ssd1362 iic 淘宝连接
    在这里插入图片描述

  • ssd1306 spi 淘宝连接

2. 软件准备
  1. 使用git下载好u8g2 下载连接

3. IIC屏幕 【基于 ssd1362 + 256*64 】

  • 在idf里面新建 components 取名为 【u8g2】
  • 将下载的u8g2文件下csrc文件按照文件类型排序,将h文件放在include,c文件直接放u8g2目录下。
u8g2├─include│      mui.h│      mui_u8g2.h│      u8g2.h│      u8x8.h└─根目录mui.cmui_u8g2.cu8g2_bitmap.cu8g2_box.cu8g2_buffer.cu8g2_button.cu8g2_circle.cu8g2_cleardisplay.cu8g2_d_memory.cu8g2_d_setup.cu8g2_font.cu8g2_fonts.cu8g2_hvline.cu8g2_input_value.cu8g2_intersection.cu8g2_kerning.cu8g2_line.cu8g2_ll_hvline.cu8g2_message.cu8g2_polygon.cu8g2_selection_list.cu8g2_setup.cu8log.cu8log_u8g2.cu8log_u8x8.cu8x8_8x8.cu8x8_byte.cu8x8_cad.cu8x8_capture.c[这中间有很多文件不需要拷贝]u8x8_debounce.cu8x8_display.cu8x8_fonts.cu8x8_gpio.cu8x8_input_value.cu8x8_message.cu8x8_selection_list.cu8x8_setup.cu8x8_string.cu8x8_u16toa.cu8x8_u8toa.c
  • 在下载的u8g2文件下csrc找到对应芯片的.c文件,比如我这就找到ssd1362,并放在我们的代码u8g2下

u8x8_d_ssd1362.c

  • 修改 CMakeLists.txt ,注意最后是一个自己芯片.c文件
idf_component_register(SRCS "mui.c""mui_u8g2.c""u8g2_bitmap.c""u8g2_box.c""u8g2_buffer.c""u8g2_button.c""u8g2.c""u8g2_circle.c""u8g2_cleardisplay.c""u8g2_d_memory.c""u8g2_d_setup.c""u8g2_font.c""u8g2_fonts.c""u8g2_hvline.c""u8g2_input_value.c""u8g2_intersection.c""u8g2_kerning.c""u8g2_line.c""u8g2_ll_hvline.c""u8g2_message.c""u8g2_polygon.c""u8g2_selection_list.c""u8g2_setup.c""u8log.c""u8log_u8g2.c""u8log_u8x8.c""u8x8_8x8.c""u8x8_byte.c""u8x8_cad.c""u8x8_capture.c""u8x8_debounce.c""u8x8_display.c""u8x8_fonts.c""u8x8_gpio.c""u8x8_input_value.c""u8x8_message.c""u8x8_selection_list.c""u8x8_setup.c""u8x8_string.c""u8x8_u16toa.c""u8x8_u8toa.c""u8x8_d_ssd1362.c"INCLUDE_DIRS "include"REQUIRES driverREQUIRES freertos)
  • 在u8g2_d_setup.c文件找到对应函数,注释掉所有函数只留这个,别忘了不注释
    #include "u8g2.h"
    在这里插入图片描述

  • 再通过上面函数中的函数 u8g2_m_32_8_f(&tile_buf_height); 跳转到u8g2_d_memory.c文件注释其他函数

在这里插入图片描述

  • 将u8g2/u8g2.c文件内容替换如下
#include <stdio.h>
#include "driver/spi_master.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "unistd.h"
#include "string.h"
#include "stdlib.h"
#include "esp_log.h"
#include "driver/i2c.h"
#include "u8g2.h"
#include "u8x8.h"#define I2C_SCL_IO GPIO_NUM_17
#define I2C_SDA_IO GPIO_NUM_9
#define ACK_CHECK_EN 0x1
#define WRITE_BIT I2C_MASTER_WRITE static const char *TAG = "u8g2";
static __inline void delay_clock(int ts)
{uint32_t start, curr;__asm__ __volatile__("rsr %0, ccount" : "=r"(start));do__asm__ __volatile__("rsr %0, ccount" : "=r"(curr));while (curr - start <= ts);
}
#define delay_us(val) delay_clock(240 * val)
#define delay_100ns(val) delay_clock(24 * val)i2c_config_t i2c_config = {.mode = I2C_MODE_MASTER,			 // 主机模式.sda_io_num = I2C_SDA_IO,			 // sda i引脚编号.scl_io_num = I2C_SCL_IO,			 // scl 引脚编号.sda_pullup_en = GPIO_PULLUP_ENABLE, // 上拉使能.scl_pullup_en = GPIO_PULLUP_ENABLE, // 上拉使能.master.clk_speed = 900000			 // 100k
};static void _oled_i2c_init(void)
{ESP_LOGE(TAG, "u8g2 init start");i2c_param_config(I2C_NUM_1, &i2c_config);i2c_driver_install(I2C_NUM_1, I2C_MODE_MASTER, 0, 0, 0);ESP_LOGE(TAG, "u8g2 init end");
}void esp32_i2c_write(uint8_t addr, uint32_t idx, uint8_t *data)
{i2c_cmd_handle_t handler = i2c_cmd_link_create();i2c_master_start(handler);i2c_master_write_byte(handler, addr | WRITE_BIT, ACK_CHECK_EN);i2c_master_write(handler, data, idx, 2);i2c_master_stop(handler);i2c_master_cmd_begin(I2C_NUM_1, handler, 100 / portTICK_PERIOD_MS);i2c_cmd_link_delete(handler);
}// u8g2用到的系统资源
uint8_t u8x8_gpio_and_delay(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{switch (msg){case U8X8_MSG_GPIO_AND_DELAY_INIT:_oled_i2c_init(); // 调用iic初始化break;case U8X8_MSG_DELAY_MILLI:vTaskDelay(arg_int);break;default:return 0;}return 1;
}
// u8g2用到的显示屏控制接口
uint8_t u8x8_byte_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{static uint8_t buffer[32]; /* u8g2/u8x8 will never send more than 32 bytes between START_TRANSFER and END_TRANSFER */static uint8_t buf_idx;uint8_t *data;switch (msg){case U8X8_MSG_BYTE_SEND:data = (uint8_t *)arg_ptr;while (arg_int > 0){buffer[buf_idx++] = *data;data++;arg_int--;}break;case U8X8_MSG_BYTE_INIT:/* add your custom code to init i2c subsystem */break;case U8X8_MSG_BYTE_SET_DC:/* ignored for i2c */break;case U8X8_MSG_BYTE_START_TRANSFER:buf_idx = 0;break;case U8X8_MSG_BYTE_END_TRANSFER:esp32_i2c_write(u8x8_GetI2CAddress(u8x8), buf_idx, buffer);break;default:return 0;}return 1;
}void u8g2Init(u8g2_t *u8g2)
{u8g2_Setup_ssd1362_i2c_256x64_f(u8g2, U8G2_R2, u8x8_byte_i2c, u8x8_gpio_and_delay); // 初始化 u8g2 结构体u8g2_InitDisplay(u8g2);																// 根据所选的芯片进行初始化工作,初始化完成后,显示器处于关闭状态u8g2_SetPowerSave(u8g2, 0);															// 打开显示器u8g2_ClearBuffer(u8g2);u8g2_SendBuffer(u8g2); // 清屏ESP_LOGI(TAG, "u8g2 init done");
}
  • 在u8g2.h文件最近添加声明
void u8g2Init(u8g2_t *u8g2);
  • main.c代码改为如下
#include "u8g2.h"
#include "u8x8.h"static u8g2_t u8g2;void oled_init()
{u8g2Init(&u8g2);
}void showmain()
{u8g2_ClearBuffer(&u8g2);u8g2_SendBuffer(&u8g2);                        // 清屏u8g2_SetFont(&u8g2, u8g2_font_spleen32x64_me); // 设置英文字体u8g2_DrawStr(&u8g2, 64, 64, "1000");u8g2_DrawStr(&u8g2, 192, 64, "KG");u8g2_SendBuffer(&u8g2);
}void showmain2()
{u8g2_ClearBuffer(&u8g2);u8g2_SendBuffer(&u8g2);                         // 清屏u8g2_SetFont(&u8g2, u8g2_font_wqy16_t_gb2312b); //u8g2_DrawUTF8(&u8g2, 32, 32, "总重量");u8g2_SendBuffer(&u8g2);
}void app_main(void)
{oled_init(); // INITshowmain();showmain2();while (1){vTaskDelay(1000 / portTICK_PERIOD_MS);}
}

4. SPI屏幕 【基于 ssd1306 + 128*32】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/207481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索创意无限的Photoshop CC 2020Mac/Win版

作为一款功能强大的图像处理软件&#xff0c;Photoshop CC 2020&#xff08;简称PS 2020&#xff09;在全球范围内备受设计师、摄影师和艺术家的喜爱和推崇。它不仅为用户提供了丰富多样的工具和功能&#xff0c;还不断推出新的创意特效和改进的功能&#xff0c;让用户的创意无…

【数据结构和算法】拥有最多糖果的孩子

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 三、代码 四、复杂度分析 前言 这是力扣的1431题&#xff0c;难度为简单&#xff0c;解题方案有很多种&…

C# Solidworks二次开发:选择管理器相关的API介绍

今天在讲述主要内容之前&#xff0c;先说一个不太相关的问题。 我之前在其他文章中看到有一些朋友在问为什么获取到的点位数据需要乘以1000进行单位转换&#xff0c;其实原因是这样的&#xff0c;在所有使用的API中如果没有特殊说明&#xff0c;所有的长度单位都是米&#xff…

苹果Vision Pro即将量产

据界面新闻消息&#xff0c;苹果公司将在今年12月正式量产第一代MR&#xff08;混合现实&#xff09;产品Vision Pro。苹果公司对Vision Pro寄予了厚望&#xff0c;预计首批备货40万台左右&#xff0c;2024年的销量目标是100万台&#xff0c;第三年达到1000万台。 苹果的供应…

springboot + thymeleaf + layui 初尝试

一、背景 公司运营的同事有个任务&#xff0c;提供一个数据文件给我&#xff0c;然后从数据库中找出对应的加密串再导出来给他。这个活不算是很难&#xff0c;但时不时就会有需求。 同事给我的文件有时是给excel表格&#xff0c;每一行有4列&#xff0c;逗号隔开&#xff0c;…

编译和使用WPS-ghrsst-to-intermediate生成SST

一、下载 V1.0 https://github.com/bbrashers/WPS-ghrsst-to-intermediate/tree/masterV1.5&#xff08;使用过程报错&#xff0c;原因不详&#xff0c;能正常使用的麻烦告知一下方法&#xff09; https://github.com/dmitryale/WPS-ghrsst-to-intermediate二、修改makefile…

【CVE 复现】CVE-2022-0185 fsconfig之整数溢出

影响版本&#xff1a;Linux-v5.1~v5.16.2 测试版本&#xff1a;Linux-5.11.22&#xff0c;由于懒得搞环境&#xff0c;所以直接用的 bsauce 大佬提供的 测试环境 看看 patch&#xff1a; diff --git a/fs/fs_context.c b/fs/fs_context.c index b7e43a780a625b..24ce12f0db32…

ResNeXt(2017)

文章目录 Abstract1. Introductionformer workour work 2. Related Work多分支卷积网络分组卷积压缩卷积网络Ensembling 3. Method3.1. Template3.2. Revisiting Simple Neurons3.3. Aggregated Transformations3.4. Model Capacity 4. Experiment 原文地址 源代码 Abstract 我…

【python】vscode中选择虚拟环境venv

vscode 怎么指定 python venv&#xff1f; 在VSCode中选择Python解释器&#xff1a; 打开命令面板&#xff1a;按下 CtrlShiftP&#xff08;Windows/Linux&#xff09;或 CmdShiftP&#xff08;Mac&#xff09;。在命令面板中&#xff0c;键入 “Python: Select Interpreter”…

14.Java程序设计-基于Springboot的高校社团管理系统设计与实现

摘要 随着高校社团活动的不断丰富和社团数量的逐渐增加&#xff0c;高校社团管理面临着日益复杂的挑战。为了提高社团管理的效率和透明度&#xff0c;本研究基于Spring Boot框架设计并实现了一套高校社团管理系统。该系统旨在整合社团创建、成员管理、活动发布等多个功能&…

水位线和窗口

水位线特点 插入到数据流中的一个标记&#xff0c;可以认为是一个特殊的数据主要内容是一个时间戳水位线是基于数据的时间戳生成的&#xff0c;即事件时间水位线必须单调递增水位线可以通过设置延迟&#xff0c;来保证正确处理乱序数据一个水位线&#xff0c;表示事件时间已经…

[FPGA 学习记录] 数码管动态显示

数码管动态显示 文章目录 1 理论学习1.1 数码管动态扫描显示原理 2 实战演练2.1 实验目标2.2 程序设计2.2.1 框图绘制2.2.2 数据生成模块 data_gen2.2.2.1 波形绘制2.2.2.2 代码编写2.2.2.3 代码编译2.2.2.4 逻辑仿真2.2.2.4.1 仿真代码编写2.2.2.4.2 仿真代码编译2.2.2.4.3 波…

如何解决el-table中动态添加固定列时出现的行错位

问题描述 在使用el-table组件时&#xff0c;我们有时需要根据用户的操作动态地添加或删除一些固定列&#xff0c;例如操作列或选择列。但是&#xff0c;当我们使用v-if指令来控制固定列的显示或隐藏时&#xff0c;可能会出现表格的行错位的问题&#xff0c;即固定列和非固定列…

el-tree数据量过大,造成浏览器卡死、崩溃

el-tree数据量过大&#xff0c;造成浏览器卡死、崩溃 场景&#xff1a;树形结构展示&#xff0c;数据超级多&#xff0c;超过万条&#xff0c;每次打开都会崩溃 我这里采用的是引入新的插件虚拟树&#xff0c;它是参照element-plus 中TreeV2改造vue2.x版本虚拟化树形控件&…

2024年强烈推荐mac 读写NTFS工具Tuxera NTFS for Mac2023中文破解版

大家好啊&#xff5e;今天要给大家推荐的是 Tuxera NTFS for Mac2023中文破解版&#xff01; 小可爱们肯定知道&#xff0c;Mac系统一直以来都有一个小小的痛点&#xff0c;就是无法直接读写NTFS格式的移动硬盘和U盘。但是&#xff0c;有了Tuxera NTFS for Mac2023&#xff0c;…

正则表达式:字符串处理的瑞士军刀

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

记一次xss通杀挖掘历程

前言 前端时间&#xff0c;要开放一个端口&#xff0c;让我进行一次安全检测&#xff0c;发现的一个漏洞。 经过 访问之后发现是类似一个目录索引的端口。(这里上厚码了哈) 错误案例测试 乱输内容asdasffda之后看了一眼Burp的抓包&#xff0c;抓到的内容是可以发现这是一个…

MuJoCo机器人动力学仿真平台安装与教程

MuJoCo是一个机器人动力学仿真平台&#xff0c;它包括一系列的物理引擎、可视化工具和机器人模拟器等工具&#xff0c;用于研究和模拟机器人的运动和动力学特性。以下是MuJoCo的安装教程&#xff1a; 下载和安装MuJoCo Pro。可以从MuJoCo的官方网站上下载最新版本的安装包。根…

【Python机器学习系列】一文彻底搞懂机器学习中表格数据的输入形式(理论+源码)

一、问题 机器学习或者深度学习在处理表格数据&#xff08;Tabular data&#xff09;、图像数据&#xff08;Image data&#xff09;、文本数据&#xff08;Text data&#xff09;、时间序列数据&#xff08;Time series data&#xff09;上得到了广泛的应用。 其中&#xff0c…

微信小程序 - 创建 ZIP 压缩包

微信小程序 - 创建 ZIP 压缩包 场景分享代码片段导入 JSZip创建ZIP文件追加写入文件测试方法参考资料 场景 微信小程序只提供了解压ZIP的API&#xff0c;并没有提供创建ZIP的方法。 当我们想把自己处理好的保存&#xff0c;打包ZIP保存下来时就需要自己实现了。 分享代码片段…