前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ESP32使用u8g2显示库(SSD1306驱动)

ESP32使用u8g2显示库(SSD1306驱动)

作者头像
云深无际
发布2021-10-20 11:08:29
6.2K0
发布2021-10-20 11:08:29
举报
文章被收录于专栏:云深之无迹

我先说自己的研究情况,第一代的库在ESP32的芯片上面编译会爆空间不够。二代没有这个毛病,所以我接下来都是使用的二代的库。

下面就是GitHub的库。

我用的主控是穷逼尊享版之ESP32

这个型号

代码语言:javascript
复制
https://github.com/olikraus/u8g2/

先说明白,嫌我话多的,自己去看官网。

这个库下载后在C盘的文档

这篇文章不想说什么原理,做个什么厉害的东西。只是想驱动这个屏幕而已。

两个难点,一是如何选择适合自己屏幕和板子的注释行:

代码语言:javascript
复制
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display

就是这个。

剩下就是ESP32 的硬件IIC的接口。

关于接口这个事情,我这里直接给出结论,如果好奇的话,可以去看源码。

代码语言:javascript
复制
https://blog.csdn.net/quangui666/article/details/81483645

也可以看这个博文,老哥好辛苦,我心疼他0.0000001s(有点憨)

就是这样了

接线情况

使用这个demo做实验

结果

接下来是文章的重点,这么多的平面型号,选哪个?

??????

如果未连接复位引脚,则使用 U8X8_PIN_NONE,就是你就接了4个脚的时候,选择这个。

因为我们的芯片是SSD1306,然后使用ESP32的硬件IIC实现:

那就是选择第二个了

代码语言:javascript
复制
代码语言:javascript
复制
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2
(U8G2_R0, 
/* clock=*/ SCL, 
/* data=*/ SDA, 
/* reset=*/ U8X8_PIN_NONE); // 没有重置显示的所有板

这个就是我们默认的IIC的接口

里面也有一个这个

这是上面R0参数的意思

引脚的参数,我们IIC就是数据和时钟

代码语言:javascript
复制
class U8G2_SSD1306_128X64_NONAME_F_SW_I2C : public U8G2 {
  public: U8G2_SSD1306_128X64_NONAME_F_SW_I2C(const u8g2_cb_t *rotation, uint8_t clock, uint8_t data, uint8_t reset = U8X8_PIN_NONE) : U8G2() {
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, rotation, u8x8_byte_arduino_sw_i2c, u8x8_gpio_and_delay_arduino);
    u8x8_SetPin_SW_I2C(getU8x8(), clock,  data,  reset);
  }
};

程序设置

程序在运行

代码语言:javascript
复制
#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/SCL, /* data=*/SDA, /* reset=*/U8X8_PIN_NONE); // All Boards without Reset of the Display

void setup(void)
{
    pinMode(9, OUTPUT);
    digitalWrite(9, 0); // default output in I2C mode for the SSD1306 test shield: set the i2c adr to 0
    u8g2.begin();
}

void drawLogo(void)
{
    u8g2.setFontMode(1); // Transparent
#ifdef MINI_LOGO

    u8g2.setFontDirection(0);
    u8g2.setFont(u8g2_font_inb16_mf);
    u8g2.drawStr(0, 22, "U");

    u8g2.setFontDirection(1);
    u8g2.setFont(u8g2_font_inb19_mn);
    u8g2.drawStr(14, 8, "8");

    u8g2.setFontDirection(0);
    u8g2.setFont(u8g2_font_inb16_mf);
    u8g2.drawStr(36, 22, "g");
    u8g2.drawStr(48, 22, "\xb2");

    u8g2.drawHLine(2, 25, 34);
    u8g2.drawHLine(3, 26, 34);
    u8g2.drawVLine(32, 22, 12);
    u8g2.drawVLine(33, 23, 12);
#else

    u8g2.setFontDirection(0);
    u8g2.setFont(u8g2_font_inb24_mf);
    u8g2.drawStr(0, 30, "U");

    u8g2.setFontDirection(1);
    u8g2.setFont(u8g2_font_inb30_mn);
    u8g2.drawStr(21, 8, "8");

    u8g2.setFontDirection(0);
    u8g2.setFont(u8g2_font_inb24_mf);
    u8g2.drawStr(51, 30, "g");
    u8g2.drawStr(67, 30, "\xb2");

    u8g2.drawHLine(2, 35, 47);
    u8g2.drawHLine(3, 36, 47);
    u8g2.drawVLine(45, 32, 12);
    u8g2.drawVLine(46, 33, 12);

#endif
}

void drawURL(void)
{
#ifndef MINI_LOGO
    u8g2.setFont(u8g2_font_4x6_tr);
    if (u8g2.getDisplayHeight() < 59)
    {
        u8g2.drawStr(89, 20, "github.com");
        u8g2.drawStr(73, 29, "/olikraus/u8g2");
    }
    else
    {
        u8g2.drawStr(1, 54, "github.com/olikraus/u8g2");
    }
#endif
}

void loop(void)
{
    u8g2.clearBuffer();
    drawLogo();
    drawURL();
    u8g2.sendBuffer();
    delay(1000);
}

占用情况

代码语言:javascript
复制
#include <MUIU8g2.h>
#include <U8g2lib.h>
#include <U8x8lib.h>


U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, SCL, SDA,U8X8_PIN_NONE);

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

最后给出一个代码的模板。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档