(esp-idf)一文看懂u8g2库点亮OLED

2023-11-20

github仓库地址:HawkJ02/esp32_oled (github.com)

首先丢一个u8g2库的地址:olikraus/u8g2: U8glib library for monochrome displays, version 2 (github.com)

u8g2库中常用的函数有

u8g2_InitDisplay(u8g2):调用 u8x8_InitDisplay() 函数初始化 OLED 屏幕。

u8g2_SetPowerSave(u8g2, is_enable):调用 u8x8_SetPowerSave() 函数将 OLED 屏幕设置为可用或不可用状态。

u8g2_SetFlipMode(u8g2, mode):调用 u8x8_SetFlipMode() 函数设置 OLED 屏幕的翻转模式。

u8g2_SetContrast(u8g2, value):调用 u8x8_SetContrast() 函数设置 OLED 屏幕的对比度。

u8g2_ClearDisplay(u8g2):调用 u8x8_ClearDisplay() 函数清空 OLED 屏幕的显示内容。

u8g2_GetDisplayHeight(u8g2):获取 OLED 屏幕的高度属性。

u8g2_GetDisplayWidth(u8g2):获取 OLED 屏幕的宽度属性。

u8g2_GetDrawColor(u8g2):获取 OLED 屏幕的当前绘制颜色属性。

u8g2_SetI2CAddress(u8g2, address):设置 OLED 屏幕的 I2C 地址。

u8g2_GetI2CAddress(u8g2):获取 OLED 屏幕的 I2C 地址属性。

我们首先在u8g2_hal(我们自己的驱动函数)中定义了一个I2C的结构体:

static u8g2_hal_i2c_cfg_t i2c_cfg = U8G2_HAL_I2C_CFG_DEFAULT(); // I2C 引脚配置信息

定义如下:

typedef struct
{
  gpio_num_t sda;
  gpio_num_t scl;
} u8g2_hal_i2c_cfg_t;

这个结构体包含了sda与scl接口的定义,默认是

#define U8G2_HAL_I2C_CFG_DEFAULT()         \
  {                                        \
    GPIO_NUM_UNDEFINED, GPIO_NUM_UNDEFINED \
  }

接着我们需要写一个回调函数,U8G2库使用这个回调函数将待发送的字节发送到I2C总线上,并且在接收到来自I2C总线的响应时读取字节数据。

static uint8_t u8g2_i2c_byte_cb(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
{
  ESP_LOGD(TAG, "i2c_byte_cb: Received a msg: %d, arg_int: %d, arg_ptr: %p", msg, arg_int, arg_ptr);

  switch (msg)
  {
  case U8X8_MSG_BYTE_SET_DC:
    break;

  case U8X8_MSG_BYTE_INIT:
  {
    if (i2c_cfg.sda == GPIO_NUM_UNDEFINED ||
        i2c_cfg.scl == GPIO_NUM_UNDEFINED)
    {
      /**
       * 没有提供 i2c 参数
       * 需要先调用 u8g2_hal_i2c_init(i2c_cfg) 以配置 i2c 参数
       */
      ESP_LOGE(TAG, "No i2c configuration provided.");
      break;
    }

    i2c_config_t conf = {0};
    conf.mode = I2C_MODE_MASTER;
    conf.sda_io_num = i2c_cfg.sda;
    conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
    conf.scl_io_num = i2c_cfg.scl;
    conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
    conf.master.clk_speed = I2C_FREQ_HZ;
    ESP_LOGI(TAG, "sda_io_num %d", conf.sda_io_num);
    ESP_LOGI(TAG, "scl_io_num %d", conf.scl_io_num);
    ESP_LOGI(TAG, "clk_speed %d", conf.master.clk_speed);
    ESP_ERROR_CHECK(i2c_param_config(I2C_NUM, &conf));
    ESP_LOGI(TAG, "i2c_driver_install %d", I2C_NUM);
    ESP_ERROR_CHECK(i2c_driver_install(I2C_NUM, conf.mode, 0, 0, 0));
    break;
  }

  case U8X8_MSG_BYTE_SEND:
  {
    // arg_ptr 是要发送的数据(uint8_t[])
    // arg_int 是数据的长度
    uint8_t *data_ptr = (uint8_t *)arg_ptr;
    while (arg_int > 0)
    {
      ESP_ERROR_CHECK(i2c_master_write_byte(handle_i2c, *data_ptr, 1));
      data_ptr++;
      arg_int--;
    }
    break;
  }

  case U8X8_MSG_BYTE_START_TRANSFER:
  {
    uint8_t i2c_address = u8x8_GetI2CAddress(u8x8);
    handle_i2c = i2c_cmd_link_create();
    ESP_LOGD(TAG, "Start I2C transfer to %02X.", i2c_address >> 1);
    ESP_ERROR_CHECK(i2c_master_start(handle_i2c));
    ESP_ERROR_CHECK(i2c_master_write_byte(handle_i2c, i2c_address | I2C_MASTER_WRITE, 1));
    break;
  }

  case U8X8_MSG_BYTE_END_TRANSFER:
  {
    ESP_LOGD(TAG, "End I2C transfer.");
    ESP_ERROR_CHECK(i2c_master_stop(handle_i2c));
    ESP_ERROR_CHECK(i2c_master_cmd_begin(I2C_NUM, handle_i2c, I2C_TIMEOUT_MS / portTICK_RATE_MS));
    i2c_cmd_link_delete(handle_i2c);
    break;
  }
  }
  return 0;
}

        最后我们初始化屏幕:

u8g2_t *u8g2_hal_i2c_init(u8g2_hal_i2c_cfg_t cfg)
{
  i2c_cfg = cfg;

  u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2,            //这是U8G2库的实例,用于控制显示屏。在这里,代码使用&符号获取该实例的地址,并将其传递给函数。
                                         U8G2_R0,          //这是显示屏旋转设置的参数。这里的U8G2_R0表示旋转设置为0度。
                                         u8g2_i2c_byte_cb, //回调函数
                                         u8x8_dummy_cb     //空参数
  );

  u8g2_SetI2CAddress(&u8g2, 0x78); // 设置屏幕 I2C 地址
  u8g2_InitDisplay(&u8g2);         // 发送初始化命令序列给屏幕,执行完毕后屏幕会进入睡眠模式
  u8g2_SetPowerSave(&u8g2, 0);     // 唤醒屏幕
  u8g2_ClearDisplay(&u8g2);        // 清屏

  return &u8g2;
}

        在主函数main.c中我们调用驱动函数:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"

#include "u8g2.h"
#include "u8g2_hal.h"

void app_main(void)
{
    // 根据自身情况修改 I2C 引脚
    u8g2_hal_i2c_cfg_t i2c_cfg = {
        .scl = 21,
        .sda = 20,
    };

    u8g2_t *u8g2 = u8g2_hal_i2c_init(i2c_cfg);

    // ==== 下面开始编写你的代码 ====
    u8g2_ClearBuffer(u8g2);
    u8g2_SetFont(u8g2, u8g2_font_ncenB14_tr);
    u8g2_DrawStr(u8g2, 0, 20, "Hello World!");
    u8g2_SendBuffer(u8g2);

    printf("All done!\n");
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(esp-idf)一文看懂u8g2库点亮OLED 的相关文章

  • IP网址可访问,域名网址无法访问

    可以通过修改DNS排查问题 一 修改DNS的好处 适当提高上网速度 更换DNS可以访问某些因为域名解析存在问题而不能访问的网站 可以屏蔽运营商的广告 还可以帮助您避免被钓鱼的危险 二 修改DNS带来的副作用 无法访问页面或者访问的页面不是你
  • Ubuntu 20.04 配置深度学习开发环境

    目录 写在前面 Dependency 1 安装Anaconda 1 1 下载安装包 1 2 进入安装文件夹 执行安装脚本 1 3 环境变量的配置与更新 1 4 测试安装 1 5 创建虚拟环境 2 安装英伟达驱动 法一 命令行安装 法二 GU
  • 1264 - Out of range value for column 'id' at row 1

    1 我用的是mysql 在数据插入是报错 原因是我插入的值 超过了数据库中类型和长度设置 1 1 我的插入语句 注意 id 的值 INSERT INTO test id sex name username password classes
  • Vue —— 锚点导航

    一个页面中分为多块 例如 目录一 目录二 目录三等 这就需要加上一个锚点导航的需求 提高用户的操作性 原生的写法 div class wrapper ul li a href catalogue1 目录一 a li li a href ca
  • SpringCloud概述

    SpringCloud概述 1 SpringCloud是什么 2 SpringCloud和SpringBoot关系 3 Dubbo和SpringCloud技术选型 4 SpringCloud作用 1 SpringCloud是什么 现代化的J
  • How to compile rocksdb with lz4 support

    On CentOS 6 x or 7 x you can do the following to easily install lz4 using the package manager As root sudo su is your fr

随机推荐

  • 137-----JS基础-----类的操作

    一 代码 不算难 如果后续操作到类的话 可以直接使用下面封装好的接口到自己的tool中
  • 线性回归建模及模型诊断

    目录 一 建模背景及目的及数据源说明 二 描述性分析 2 1 连续自变量与连续因变量的相关性分析 2 2 二分类变量与连续变量的相关性分析 2 3 多分类变量与连续变量的相关性分析 三 模型建立与诊断 3 1 一元线形回归及模型解读 3 2
  • 编码技巧——校验器(职责链+抽象模版)

    日常开发中可能遇到这样的业务场景 请求从入口进来 需要经过层层的校验 通过校验后才会执行业务操作 写操作 RPC 异步消息 这里前置的多层校验流程中 从类型上看 部分是基本参数校验 部分是包含业务逻辑的校验 并且部分校验是可以并行 部分是有
  • 矩阵的分解——LU分解

    LU分解 LU分解是矩阵分解的一种 将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积 有时需要再乘上一个置换矩阵 LU分解可以被视为高斯消元法的矩阵形式 在数值计算上 LU分解经常被用来解线性方程组 且在求逆矩阵和计算行列式中都是一个关
  • OSQP二次规划求解库使用说明

    OSQP二次规划求解库使用说明 贺志国 2023 5 10 1 凸二次规划的一般表达式 m i n 1 2 x
  • 微信API接口访问慢

    场景 项目需要调用微信API接口获得微信用户信息 本地开发和公司测试环境中测试十分顺利 但是在部署到现场环境中 接口调用经常会很慢 需要几分钟的时间才能返回值 现场环境的服务器因为客户原因 只能指定申请特定个别IP访问 无法开放微信接口域名
  • MySQL中常用工具

    作者 小刘在C站 个人主页 小刘主页 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 学习两年总结出的运维经验 以及思科模拟器全套网络实验教程 专栏 云计算技术 小刘私信可以随便问 只要会绝不吝啬 感谢CSDN让你我相遇 目录
  • vue3使用事件委托实现选项卡的切换

    选项卡是js写的 不是组件 ul li item li ul
  • 虚拟机不能上网,ifconfig显示只有lo

    1 开启虚拟机后无法上网 ifconfig查询发现只有本地环回网口 2 使用 ifconfig a 命令查三腊鉴看是否存在网卡 3 查询结果显示系统中存在ens33和ens37网卡 解决方法就是要启动ens33网卡 并配置其IP地址等信息
  • JavaScript面向对象:类的几种继承方式

    面向对象 类的几种继承方式 类与实例 类的声明 生成实例 类与继承 如何实现继承 继承的几种方式 前端小白记录学习笔记 不做他用 类与实例 类的声明 用构造函数模拟类 传统写法 function Person1 name this name
  • Java实现PDU编码

    代码一 package com zte test import java io UnsupportedEncodingException PDU编码实现 7bit 8bit 以及UCS2编码 代码主体是网上来源 Url我忘记了 很遗憾 自己
  • Python3 入门教程

    Python3 SMTP发送邮件 在Python3 中应用的SMTP Simple Mail Transfer Protocol 即简单邮件传输协议 它是一组用于由源地址到目的地址传送邮件的规则 由它来控制信件的中转方式 python的 s
  • 打印出数组重复的数字/数值个数

    题目 有一个长度为n的数组 里面所有元素的值都为整数 且范围为0到n 1 请列出数组中整数元素出现的次数 例 输入数组 1 6 5 3 12 2 3 2 0 1 7 4 5 打印 1 2 6 1 5 2 3 2 12 1 2 2 0 1 7
  • 学习C语言的一些比较重要的要点

    C语言笔记10 20 d 打印整型 f 打印浮点型 打小数 p 以地址的形式打印 c 打印字符型 x 打印十六进制数字 s 打印字符串 一个字节 8个比特位 字节 char 1 short 2 long 4 long long 8 floa
  • 用OpenSSL 做HMAC(C++)

    参考 http www askyb com cpp openssl hmac hasing example in cpp 名词解释 HMAC Hash based Message Authentication Code 即基于Hash的消息
  • 计算机什么是符号健,在电脑健盘上怎么打:符号

    在电脑健盘上怎么打 符号以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 在电脑健盘上怎么打 符号 Shift L键的右侧就是 就可以 按住Shift 然后再按 L
  • Ebay账号关联怎么办?如何防关联?店铺多开干货

    Ebay是明确不允许一个卖家有多个ebay账户的 做跨境电商的朋友为了 不在一颗树上吊死 大家都想多注册几个账号开几个店铺来拦截更多流量和分摊风险 但是eBay平台规定是只允许一个卖家一个账号的 一旦检测到多开账户的情况 eBay会地把你的
  • osgEarth的shadowMap看下shadowcaster

    在application中 有osgEarth lights ShadowCaster caster osgEarth findTopMostNodeOfType
  • Ubuntu18.04 下安装CUDA,cuDNN及pytorch-gpu版本过程

    第一步 安装显卡驱动 首先添加ppa源 sudo add apt repository ppa graphics drivers ppa 更新一下 sudo apt get update 安装驱动 友情提示 如果BIOS有开启Secure
  • (esp-idf)一文看懂u8g2库点亮OLED

    github仓库地址 HawkJ02 esp32 oled github com 首先丢一个u8g2库的地址 olikraus u8g2 U8glib library for monochrome displays version 2 gi