【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.c
            mui_u8g2.c
            u8g2_bitmap.c
            u8g2_box.c
            u8g2_buffer.c
            u8g2_button.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
  • 在下载的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 driver
                    REQUIRES 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(); // INIT

    showmain();
    showmain2();
    while (1)
    {
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习第15天:GBDT模型

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​​ 文章目录 GBDT模型介绍 Boosting 残差 GBDT的缺点 python代码实现 代码 模型参数解释 结语 GBDT模型介绍 GBDT&#xff08;Gradient Boos…

一度超越Sketch用户的Figma真的好用吗?

Figma 是一个可以在所有平台上使用的软件&#xff0c;和 Sketch 功能差不多&#xff0c;但不像Sketch一样只能在Mac上使用。Figma 可以在 Windows PC&#xff0c;Linux 计算机甚至 Chromebook&#xff0c;目前 iPad 也可以使用。只要你能打开网页&#xff0c;理论上你基本上可以…

【FPGA】Verilog:BCD 加法器的实现

0x00 XOR 运算在 2 的补码加减法中的应用 2 的补码加减法的特点是&#xff0c;当从某个数中减去负数时&#xff0c;将其转换为正数的加法来计算&#xff0c;并将减去正数的情况转换为负数的加法来计算&#xff0c;从而将所有减法运算转换为加法运算。在这种情况下&#xff0c;…

打工人副业变现秘籍,某多/某手变现底层引擎-StableDiffusionWebUI界面基本布局和操作

一、界面设置 文生图:根据文本提示生成图像 图生图:图像生成图像;功能很强大,自己在后续使用中探索。 后期处理:图片处理;功能很强大,自己在后续使用中探索。 PNG信息:这是一个快速获取图片生成参数的便捷功能。如果图像是在SD里生成的,您可以使用“发送到”按钮将…

大创项目推荐 交通目标检测-行人车辆检测流量计数 - 大创项目推荐

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

RocketMQ安装和使用

RocketMQ快速入门 下载RocketMQ 下载地址 环境要求 Linux64位系统 JDK1.8(64位) 安装RocketMQ 解压 unzip rocketmq-all-4.4.0-bin-release.zip启动RocketMQ 启动NameServer # 1.启动NameServer nohup sh bin/mqnamesrv & # 2.查看启动日志 tail -f ~/logs/rocke…

混合预编码(Hybrid Precoding)的全连接结构与子连接结构

A Survey on Hybrid Beamforming Techniques in 5G: Architecture and System Model Perspectives 全连接结构的混合预编码 子连接结构的混合预编码 Alternating Minimization Algorithms for HybridPrecoding in Millimeter Wave MIMO Systems

WGCLOUD v3.5.0 新增支持监测交换机的接口状态UP DOWN

WGCLOUD v3.5.0开始 可以监测交换机或SNMP设备的接口状态了&#xff0c;直接上图

奕碳科技亮相COP28:展现中国智慧,引领全球碳减排新篇章

11月30日,联合国气候变化框架公约第28次缔约方大会 (COP28) 在阿联酋迪拜开幕。COP28是全球气候治理的重要盛会&#xff0c;汇聚了世界各国领导人、企业界和科学界代表&#xff0c;共同探讨和制定应对全球气候变化的策略与行动计划。在这样的背景下&#xff0c;企业群体的积极参…

初识人工智能,一文读懂过拟合欠拟合和模型压缩的知识文集(3)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

前端自动化测试Vue中TDD和单元测试示例详解

1、简单用例入门 Vue 提供了 vue/test-utils 来帮助我们进行单元测试&#xff0c;创建 Vue 项目的时候勾选测试选项会自动帮我们安装 先来介绍两个常用的挂载方法&#xff1a; mount&#xff1a;会将组件以及组件包含的子组件都进行挂载shallowMount&#xff1a;浅挂载&…

潮落云起:中国云桌面的产业变局

云桌面&#xff0c;又被称为桌面云、桌面虚拟化技术。这项技术的起源可以追溯到20世纪70年代&#xff0c;IBM通过一台计算机来实现多用户资源的桌面共享。在数十年的发展中&#xff0c;云桌面从技术实现方式到产品形态日趋丰富。 相比于传统PC数据单独存放、系统独立运维的分散…

2023年12月8日:UI登陆界面

作业 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMovie> #include <QPushButton> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpub…

DeepIn,UOS统信专业版安装运行Java,JavaFx程序

因为要适配国产统信UOS系统&#xff0c;要求JavaFx程序能简便双击运行&#xff0c;由于网上UOS开发相关文章少&#xff0c;多数文章没用&#xff0c;因此花了不少时间&#xff0c;踩了不少坑&#xff0c;下面记录一些遇到的问题&#xff0c;我的程序环境是jdk1.8&#xff0c;为…

vue项目新增弹窗打开时:其中邮箱和密码被默认设置为当前登录的账号和密码

解决方法&#xff1a;就是在input的前后分别再添加一个input&#xff08;注意截图顺序不能错{密码放前面、邮箱放后面}&#xff09;

2024最新金三银四软件测试面试题

一直以来大大小小参与过不少面试&#xff0c;遇到过不少坑&#xff0c;但是没来的及好好总结汇总下。现在把之前遇到的问题汇总下&#xff0c;希望以后自己能加深印象。 1、appium 怎么定位toast弹框 appium1.6以后回答需要升级u2进行定位。 2、什么是事务&#xff0c;知道事…

Filed II 绘制超声 3D/2D 点扩散函数

点扩散函数可以较好地描述超声对成像目标分辨能力,利用 filed II 仿真工具实现点扩算函数 PSF 的 3D 和 2D 绘制。 定义换能器基本参数 f0=5e6; % Transducer center frequency [Hz] fs=100e6; % Sampling frequency [Hz] c=1540; % Speed of sound [m/s] width=0.15/1000

MYSQL练题笔记-高级查询和连接-这系列最后一题以及下个系列(子查询)的第一题

今天做了下面两题&#xff0c;到第三题的时候想了下但是没有太多的思路&#xff0c;然后看题解的时候实在是觉得自己不会&#xff0c;打算明天看吧。 1.按分类统计薪水相关的表和题目如下 我是想着简化问题&#xff0c;先找出薪水低于30000的员工&#xff0c;然后找这些员工的上…

Anaconda建虚拟环境并在jupyter中打开

1.假设要用yaml格式创建虚拟环境 从开始里打开anaconda powersheel 输入以下 conda env create -f environment.yaml conda activate env_name activate以下虚拟环境 修改名称 如果不用yaml也可以用 conda create --name my_first_env python3.6 这个来指定 2.(base)变(…

DHTMLX Scheduler PRO 6.0.5 Crack

功能丰富的 JavaScript调度程序 DHTMLX Scheduler 是一个 JavaScript 日程安排日历&#xff0c;具有 10 个视图和可定制的界面&#xff0c;用于开发任何类型的日程安排应用程序。 DHTMLX JS 调度程序库的主要特性 我们的 JS 调度程序最需要的功能之一是时间轴视图。借助时间轴…
最新文章