ESP8266--Arduino开发(驱动OLED显示文字和图片)

news2024/11/26 10:24:51

文章目录

  • 一、0.96 IIC OLED介绍
  • 二、安装库文件
    • 2.1、库屏幕控制相关API
    • 2.2、库绘制相关API
    • 2.3、文本相关API
    • 2.4、图像相关API
  • 三、显示字母
  • 四、显示汉字
  • 五、显示图片

一、0.96 IIC OLED介绍

OLED是一种利用多层有机薄膜结构产生电致发光的器件,它很容易制作,而且只需要低的驱动电压,这些主要的特征使得OLED在满足平面显示器的应用上显得非常突出。OLED显示屏比LCD更轻薄、亮度高、功耗低、响应快、清晰度高、柔性好、发光效率高,能满足消费者对显示技术的新需求。

我们最常用的OLED 0.96 IIC 128×64模块,如下所示:
在这里插入图片描述
在这里插入图片描述
其中:

  • 0.96:指的是屏幕的显示尺寸0.96inch;
  • 128×64:指的是屏幕的分辨率为128×64;
  • IIC:指的是该模块使用IIC协议进行通讯;

双色OLED
除了单色OLED,还有双色OLED,例如:黄蓝屏,即屏上1/4部分为黄色,屏下3/4为蓝色;而且是固定区域显示固定颜色,颜色和显示区域均不能修改。


显示原理

  • OLED的显存分布情况,可以理解为:水平方向分布了128个像素点,垂直方向分布了64个像素点;
  • 而驱动芯片在点亮像素点的时候,是以8个像素点为单位的;
  • 官方的例程推荐的是垂直扫描的方式,也就是先画垂直方向的8个像素点;
  • 所以我们在画点的时候Y的取值为0-7,X的取值为0-127;
//存放格式如下.
//[0]0 1 2 3 ... 127    
//[1]0 1 2 3 ... 127    
//[2]0 1 2 3 ... 127    
//[3]0 1 2 3 ... 127    
//[4]0 1 2 3 ... 127    
//[5]0 1 2 3 ... 127    
//[6]0 1 2 3 ... 127    
//[7]0 1 2 3 ... 127 

二、安装库文件

我们需要使用esp8266-oled-ssd1306库来实现控制OLED,Arduino安装操作如下所示:

在这里插入图片描述
在这里插入图片描述


2.1、库屏幕控制相关API

1、引入库(我的是IIC接口)

#include "SSD1306Wire.h"

2、实例化一个SSD1306Wire对象

SSD1306Wire display(0x3c, 4, 5);

3、初始化屏幕

display.init();

4、清除

display.clear();

5、清除某个点

void OLEDDisplay::clearPixel(int16_t x, int16_t y)

display.clearPixel(0,0);

6、显示buf区的内容

void SSD1306Wire::display()

display.display();

7、把显示屏关掉

display.displayOff();

8、把显示屏打开

display.displayOn();

9、深度睡眠后恢复

display.allocateBuffer();

10、关闭OLED,清除对象和缓存

void OLEDDisplay::end()

display.end();

11、屏幕垂直翻转

display.flipScreenVertically();

12、屏幕镜像显示

display.mirrorScreen();

13、反色显示

display.invertDisplay();

14、回归正常显示

display.normalDisplay();

15、重新初始化

display.resetDisplay();

16、重置显示方向

display.resetOrientation();

17、设置显示亮度

void OLEDDisplay::setBrightness(uint8_t)

display.setContrast(255);

18、设置对比度

void OLEDDisplay::setContrast(uint8_t contrast, uint8_t precharge = (uint8_t)'�', uint8_t comdetect = (uint8_t)'@')

例如: 极低的亮度和对比度:对比度= 10,预充电precharge= 5,comdetect = 0
正常亮度和对比度:对比度= 100


2.2、库绘制相关API

1、设置一个点

void OLEDDisplay::setPixel(int16_t x, int16_t y)

2、画空心圆

void OLEDDisplay::drawCircle(int16_t x, int16_t y, int16_t radius)

display.drawCircle(64,32,20);

3、画实心圆

void OLEDDisplay::fillCircle(int16_t x, int16_t y, int16_t radius)

4、画1/4圆弧

void OLEDDisplay::drawCircleQuads(int16_t x0, int16_t y0, int16_t radius, uint8_t quads)

display.drawCircleQuads(32,32,20,1);

其中: quads是角度

quads左上右上左下右下
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

5、画水平线

void OLEDDisplay::drawHorizontalLine(int16_t x, int16_t y, int16_t length)

6、画垂直线

void OLEDDisplay::drawVerticalLine(int16_t x, int16_t y, int16_t length)

7、画线

void OLEDDisplay::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1)

8、画空心矩形

void OLEDDisplay::drawRect(int16_t x, int16_t y, int16_t width, int16_t height)

9、画实心矩形

void OLEDDisplay::fillRect(int16_t x, int16_t y, int16_t width, int16_t height)

10、画进度条

void OLEDDisplay::drawProgressBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress)

2.3、文本相关API

1、设置字体

void OLEDDisplay::setFont(const uint8_t *fontData)
内建字体字高字宽包含字符
ArialMT_Plain_101310224个字符
ArialMT_Plain_161916224个字符
ArialMT_Plain_242824224个字符

2、设置文本对齐方法

void OLEDDisplay::setTextAlignment(OLEDDISPLAY_TEXT_ALIGNMENT textAlignment)
对齐方法描述
TEXT_ALIGN_LEFT左对齐
TEXT_ALIGN_RIGHT右对齐
TEXT_ALIGN_CENTER居中对齐
TEXT_ALIGN_CENTER_BOTH上下左右对齐

3、绘制字符串

void OLEDDisplay::drawString(int16_t x, int16_t y, String text)

display.clear();
display.setFont(ArialMT_Plain_16);
display.drawString(0,0,"hello");
display.display();

4、绘制字符串(带最大宽度)

display.drawStringMaxWidth(int16_t x, int16_t y, String text)

到达最大宽度回换行显示


2.4、图像相关API

1、显示16*16的图标

void OLEDDisplay::drawIco16x16(int16_t x, int16_t y, const char *ico, bool inverse = false)

新建16x16的图像
在这里插入图片描述
绘制图像
在这里插入图片描述
字模设置输出格式
在这里插入图片描述
生成字模
在这里插入图片描述

#include "SSD1306Wire.h"
 
SSD1306Wire display(0x3c, 21, 22);
 
const char image[] = {
    0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0C,0x78,0x0E,0x48,0x0A,0x00,0x00,0x00,0x00,
	0x80,0x00,0x88,0x08,0x18,0x08,0x10,0x0C,0x30,0x06,0xC0,0x03,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
};
 
void setup()
{
  Serial.begin(115200);
  display.init();
  display.flipScreenVertically();
  display.clear();
  display.drawIco16x16(0, 0, image, 0);
  display.display();
}
 
void loop()
{
}

在这里插入图片描述


2、显示XBM图像

void OLEDDisplay::drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *xbm)

xbm图像可使用在线转换器:https://convertio.co/zh/


3、显示BMP位图图像

void OLEDDisplay::drawFastImage(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *image)

三、显示字母

/*
 * ESP8266-NodeMCU通过驱动oled显示文文字和图片
 * 需要使用Arduino-OLED第三方库:https://github.com/ThingPulse/esp8266-oled-ssd1306/tree/4.2.0
 */

/* 使用0.96寸的OLED屏幕需要使用包含这个头文件 */
#include "SSD1306Wire.h"

/* 设置oled屏幕的相关信息 */
const int I2C_ADDR = 0x3c;              // oled屏幕的I2c地址
#define SDA_PIN 4                       // SDA引脚,默认gpio4(D2)
#define SCL_PIN 5                       // SCL引脚,默认gpio5(D1)

/* 新建一个oled屏幕对象,需要输入IIC地址,SDA和SCL引脚号 */
SSD1306Wire oled(I2C_ADDR, SDA_PIN, SCL_PIN);

void setup() {
  /* 1. 初始化串口通讯波特率为115200*/
  Serial.begin(115200);

  /* 2. oled屏幕初始化 */
  oled.init();
  oled.flipScreenVertically();        // 设置屏幕翻转
  oled.setContrast(255);              // 设置屏幕亮度
  drawRect();                         // 测试屏幕显示
  oled.clear(); oled.display();       // 清除屏幕
}

void loop() {
  oled.setFont(ArialMT_Plain_24);     // 设置字体
  oled.drawString(0, 0, "HelloWorld!");     // 将要显示的文字写入缓存
  oled.display();                     // 将缓存里的文字在屏幕上显示
}

void drawRect(void) {
  for (int16_t i=0; i<oled.getHeight()/2; i+=2) {
    oled.drawRect(i, i, oled.getWidth()-2*i, oled.getHeight()-2*i);
    oled.display();
    delay(50);
  }
}

在这里插入图片描述


四、显示汉字

显示汉字要先进行取模了,我们选择列行式的取模方式,如下图所示:

取模软件分享:
链接:https://pan.baidu.com/s/12x-e09uORupj07MNS00C5A
提取码:fkp4

点击【模式】–>【字符模式】–>【选项】,或者齿轮,如下设置
在这里插入图片描述

点击确定后,就可以输入文字了

在这里插入图片描述

点击生成字模,可以看到生成了如下:

(0)(1)(2)(3)
{
{0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0xE0,0xFF,0x07,0x1C,0x00,0x00,0x06,0x00,0x01,0x00,0xC1,0x00,0x80,0x30,0x00,0x70,0x0C,0x00,0x3E,0x04,0x02,0x24,0x00,0x06,0xA0,0xFF,0x07,0xA0,0x00,0x00,0x20,0x00,0x00,0x20,0x04,0x00,0xA0,0x18,0x00,0x60,0x70,0x00,0x00,0xC0,0x00,0x00,0x00,0x00},/*"你",0*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x10,0x02,0x20,0x2F,0x01,0xFC,0xA0,0x00,0x26,0x40,0x00,0x20,0x7C,0x00,0xE0,0xC7,0x00,0x20,0x82,0x01,0x00,0x02,0x00,0x04,0x02,0x00,0x04,0x02,0x02,0x04,0x02,0x06,0xC4,0xFF,0x03,0x64,0x02,0x00,0x18,0x02,0x00,0x0C,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00},/*"好",1*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0xF8,0xFF,0x07,0x80,0x00,0x02,0x80,0x00,0x02,0x80,0x00,0x02,0xFE,0xFF,0x02,0xFC,0x7F,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0xFE,0x7F,0x02,0x80,0x00,0x02,0x80,0x00,0x02,0xC0,0x00,0x03,0x80,0x00,0x02,0x00,0x00,0x00},/*"世",2*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x10,0x04,0xFE,0x11,0x02,0x92,0x08,0x02,0x92,0x88,0x01,0x92,0xFC,0x00,0x12,0x1B,0x00,0x12,0x01,0x00,0xFC,0x00,0x00,0x12,0x01,0x00,0x92,0xFA,0x07,0x92,0x0C,0x00,0x92,0x0C,0x00,0xFE,0x08,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"界",3*/
}

然后我们将生成的字模复制到代码中的数组中:

static const uint8_t text[][60] = {
{0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0xE0,0xFF,0x07,0x1C,0x00,0x00,0x06,0x00,0x01,0x00,0xC1,0x00,0x80,0x30,0x00,0x70,0x0C,0x00,0x3E,0x04,0x02,0x24,0x00,0x06,0xA0,0xFF,0x07,0xA0,0x00,0x00,0x20,0x00,0x00,0x20,0x04,0x00,0xA0,0x18,0x00,0x60,0x70,0x00,0x00,0xC0,0x00,0x00,0x00,0x00},/*"你",0*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x10,0x02,0x20,0x2F,0x01,0xFC,0xA0,0x00,0x26,0x40,0x00,0x20,0x7C,0x00,0xE0,0xC7,0x00,0x20,0x82,0x01,0x00,0x02,0x00,0x04,0x02,0x00,0x04,0x02,0x02,0x04,0x02,0x06,0xC4,0xFF,0x03,0x64,0x02,0x00,0x18,0x02,0x00,0x0C,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00},/*"好",1*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0xF8,0xFF,0x07,0x80,0x00,0x02,0x80,0x00,0x02,0x80,0x00,0x02,0xFE,0xFF,0x02,0xFC,0x7F,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0xFE,0x7F,0x02,0x80,0x00,0x02,0x80,0x00,0x02,0xC0,0x00,0x03,0x80,0x00,0x02,0x00,0x00,0x00},/*"世",2*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x10,0x04,0xFE,0x11,0x02,0x92,0x08,0x02,0x92,0x88,0x01,0x92,0xFC,0x00,0x12,0x1B,0x00,0x12,0x01,0x00,0xFC,0x00,0x00,0x12,0x01,0x00,0x92,0xFA,0x07,0x92,0x0C,0x00,0x92,0x0C,0x00,0xFE,0x08,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"界",3*/
};
/*
 * ESP8266-NodeMCU通过驱动oled显示文文字和图片
 * 需要使用Arduino-OLED第三方库:https://github.com/ThingPulse/esp8266-oled-ssd1306/tree/4.2.0
 */

/* 使用0.96寸的OLED屏幕需要使用包含这个头文件 */
#include "SSD1306Wire.h"

/* 设置oled屏幕的相关信息 */
const int I2C_ADDR = 0x3c;              // oled屏幕的I2c地址
#define SDA_PIN 4                       // SDA引脚,默认gpio4(D2)
#define SCL_PIN 5                       // SCL引脚,默认gpio5(D1)

/* 新建一个oled屏幕对象,需要输入IIC地址,SDA和SCL引脚号 */
SSD1306Wire oled(I2C_ADDR, SDA_PIN, SCL_PIN);

static const uint8_t text[][60] = {
{0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0xE0,0xFF,0x07,0x1C,0x00,0x00,0x06,0x00,0x01,0x00,0xC1,0x00,0x80,0x30,0x00,0x70,0x0C,0x00,0x3E,0x04,0x02,0x24,0x00,0x06,0xA0,0xFF,0x07,0xA0,0x00,0x00,0x20,0x00,0x00,0x20,0x04,0x00,0xA0,0x18,0x00,0x60,0x70,0x00,0x00,0xC0,0x00,0x00,0x00,0x00},/*"你",0*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x10,0x02,0x20,0x2F,0x01,0xFC,0xA0,0x00,0x26,0x40,0x00,0x20,0x7C,0x00,0xE0,0xC7,0x00,0x20,0x82,0x01,0x00,0x02,0x00,0x04,0x02,0x00,0x04,0x02,0x02,0x04,0x02,0x06,0xC4,0xFF,0x03,0x64,0x02,0x00,0x18,0x02,0x00,0x0C,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00},/*"好",1*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0xF8,0xFF,0x07,0x80,0x00,0x02,0x80,0x00,0x02,0x80,0x00,0x02,0xFE,0xFF,0x02,0xFC,0x7F,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0xFE,0x7F,0x02,0x80,0x00,0x02,0x80,0x00,0x02,0xC0,0x00,0x03,0x80,0x00,0x02,0x00,0x00,0x00},/*"世",2*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x10,0x04,0xFE,0x11,0x02,0x92,0x08,0x02,0x92,0x88,0x01,0x92,0xFC,0x00,0x12,0x1B,0x00,0x12,0x01,0x00,0xFC,0x00,0x00,0x12,0x01,0x00,0x92,0xFA,0x07,0x92,0x0C,0x00,0x92,0x0C,0x00,0xFE,0x08,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"界",3*/
};

void setup() {
  /* 1. 初始化串口通讯波特率为115200*/
  Serial.begin(115200);

  /* 2. oled屏幕初始化 */
  oled.init();
  oled.flipScreenVertically();        // 设置屏幕翻转
  oled.setContrast(255);              // 设置屏幕亮度
  drawRect();                         // 测试屏幕显示
  oled.clear(); oled.display();       // 清除屏幕
}

void loop() {
  oled.setFont(ArialMT_Plain_24);     // 设置字体
  
  /*显示汉字*/
  oled.drawFastImage(4+20*0, 22, 20, 20, text[0]);	//字宽和字高都是20
  oled.drawFastImage(4+20*1, 22, 20, 20, text[1]);
  oled.drawFastImage(4+20*2, 22, 20, 20, text[2]);
  oled.drawFastImage(4+20*3, 22, 20, 20, text[3]);
}

void drawRect(void) {
  for (int16_t i=0; i<oled.getHeight()/2; i+=2) {
    oled.drawRect(i, i, oled.getWidth()-2*i, oled.getHeight()-2*i);
    oled.display();
    delay(50);
  }
}

在这里插入图片描述


五、显示图片

在这里插入图片描述

参考上面:【2.4、图像相关API】

/*
 * ESP8266-NodeMCU通过驱动oled显示文文字和图片
 * 需要使用Arduino-OLED第三方库:https://github.com/ThingPulse/esp8266-oled-ssd1306/tree/4.2.0
 */

/* 使用0.96寸的OLED屏幕需要使用包含这个头文件 */
#include "SSD1306Wire.h"

/* 设置oled屏幕的相关信息 */
const int I2C_ADDR = 0x3c;              // oled屏幕的I2c地址
#define SDA_PIN 0                       // SDA引脚,默认gpio4(D2)
#define SCL_PIN 2                       // SCL引脚,默认gpio5(D1)

/* 新建一个oled屏幕对象,需要输入IIC地址,SDA和SCL引脚号 */
SSD1306Wire oled(I2C_ADDR, SDA_PIN, SCL_PIN);

static const uint8_t text[][60] = {
{0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0xE0,0xFF,0x07,0x1C,0x00,0x00,0x06,0x00,0x01,0x00,0xC1,0x00,0x80,0x30,0x00,0x70,0x0C,0x00,0x3E,0x04,0x02,0x24,0x00,0x06,0xA0,0xFF,0x07,0xA0,0x00,0x00,0x20,0x00,0x00,0x20,0x04,0x00,0xA0,0x18,0x00,0x60,0x70,0x00,0x00,0xC0,0x00,0x00,0x00,0x00},/*"你",0*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x10,0x02,0x20,0x2F,0x01,0xFC,0xA0,0x00,0x26,0x40,0x00,0x20,0x7C,0x00,0xE0,0xC7,0x00,0x20,0x82,0x01,0x00,0x02,0x00,0x04,0x02,0x00,0x04,0x02,0x02,0x04,0x02,0x06,0xC4,0xFF,0x03,0x64,0x02,0x00,0x18,0x02,0x00,0x0C,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x00,0x00},/*"好",1*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0xF8,0xFF,0x07,0x80,0x00,0x02,0x80,0x00,0x02,0x80,0x00,0x02,0xFE,0xFF,0x02,0xFC,0x7F,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0x80,0x20,0x02,0xFE,0x7F,0x02,0x80,0x00,0x02,0x80,0x00,0x02,0xC0,0x00,0x03,0x80,0x00,0x02,0x00,0x00,0x00},/*"世",2*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x10,0x04,0xFE,0x11,0x02,0x92,0x08,0x02,0x92,0x88,0x01,0x92,0xFC,0x00,0x12,0x1B,0x00,0x12,0x01,0x00,0xFC,0x00,0x00,0x12,0x01,0x00,0x92,0xFA,0x07,0x92,0x0C,0x00,0x92,0x0C,0x00,0xFE,0x08,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"界",3*/
};

const uint8_t image[] PROGMEM = { //因为图片很大,所以我们需要通过PROGMEM关键字声明将其存放到程序存储空间
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xC3,0x7F,0x00,0x00,
0x00,0x00,0x80,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x10,0xE0,0xFF,0xFF,0x7F,0x08,0x00,0x00,0xF0,0xFF,0xFF,0xFF,0x3F,0x3C,0x00,
0x00,0xE0,0xFF,0xFF,0xFF,0x3F,0x7C,0x00,0x00,0xC0,0xFF,0x8F,0xFF,0x3F,0xFC,0x00,0x00,0x80,0xFF,0xE3,0xFF,0x3F,0xFE,0x01,
0x00,0x00,0xFE,0xFC,0xFF,0x3F,0xFE,0x03,0x00,0x80,0x7F,0xFE,0xFF,0x00,0xFF,0x07,0x06,0xF0,0x9F,0xFF,0x0F,0x00,0xFF,0x0F,
0xFC,0xFF,0xCF,0xFF,0x07,0x00,0xFC,0x0F,0xF0,0xFF,0xE3,0xFF,0x01,0x00,0xF8,0x1F,0xC0,0xFF,0xF0,0xFF,0x00,0x00,0xE0,0x3F,
0x00,0x0E,0xF8,0x7F,0x00,0x0F,0xE0,0x3F,0x00,0x00,0xFE,0x7F,0xC0,0x7F,0xC0,0x3F,0x00,0x00,0xFF,0x3F,0xE0,0xFF,0x80,0x7F,
0x00,0xC0,0x7F,0x1F,0xF0,0xFF,0x81,0x7F,0x00,0xF0,0x1F,0x1F,0xF8,0xFF,0x83,0x7F,0xF0,0xFF,0x8F,0x0F,0xF8,0xFF,0x83,0x7F,
0xE0,0xFF,0x83,0x07,0xF8,0xFF,0x83,0x7F,0x80,0xFF,0x80,0x03,0xFC,0xFF,0x03,0xFF,0x00,0x00,0x80,0x01,0xFC,0xFF,0x03,0xFF,
0x00,0x00,0xC0,0x00,0xF8,0xFF,0x03,0xFF,0x00,0x00,0x20,0x10,0xF8,0xFF,0x83,0xFF,0x00,0x00,0x00,0x10,0xF8,0xFF,0x83,0x7F,
0x00,0x00,0x00,0x38,0xF0,0xFF,0x81,0x7F,0x00,0x00,0x00,0x3C,0xF0,0xFF,0x80,0x7F,0x00,0x00,0x00,0x3E,0xE0,0x7F,0xC0,0x7F,
0x00,0x00,0x00,0x7F,0x80,0x3F,0xE0,0x3F,0x00,0x00,0x80,0xFF,0x00,0x00,0xE0,0x3F,0x00,0x00,0x80,0xFF,0x01,0x00,0xE0,0x3F,
0x00,0x00,0x00,0xFF,0x03,0x00,0x88,0x1F,0x00,0x00,0x00,0xFE,0x03,0x00,0x1E,0x0F,0x00,0x00,0x00,0xFE,0x19,0x80,0x3F,0x0E,
0x00,0x00,0x00,0xFC,0x78,0xF0,0x7F,0x04,0x00,0x00,0x00,0x78,0xFC,0xFF,0xFF,0x00,0x00,0x00,0x00,0x38,0xFE,0xFF,0xFF,0x01,
0x00,0x00,0x00,0x30,0xFE,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x1F,0x00,
0x00,0x00,0x00,0x00,0xFE,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"Sixlab_Logo.bmp",0*/
};


void setup() {
  /* 1. 初始化串口通讯波特率为115200*/
  Serial.begin(115200);

  /* 2. oled屏幕初始化 */
  oled.init();
  oled.flipScreenVertically();        // 设置屏幕翻转
  oled.setContrast(255);              // 设置屏幕亮度
  drawRect();                         // 测试屏幕显示
  oled.clear(); oled.display();       // 清除屏幕

  oled.drawFastImage(0, 0, 64, 64, image);
  oled.display();
}

void loop() {
  
}

void drawRect(void) {
  for (int16_t i=0; i<oled.getHeight()/2; i+=2) {
    oled.drawRect(i, i, oled.getWidth()-2*i, oled.getHeight()-2*i);
    oled.display();
    delay(50);
  }
}

在这里插入图片描述

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

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

相关文章

SPARKSQL3.0-Catalog源码剖析

SPARKSQL3.0-Catalog源码剖析 一、前言 阅读本节需要先掌握Analyzer阶段的相关知识 在Spark SQL 系统中&#xff0c;Catalog 主要用于各种函数资源信息和元数据信息 &#xff08;数据库、数据表数据视图、数据分区等&#xff09;的统一管理。 初次看这种解释还是比较模糊&a…

5周年,时过境迁,千变万化

2022年11月22日 小雪 长沙 阴小雨 下午 吃饭 遇雨 跑 不知不觉开始博客5年啦&#xff0c;注册账号有6年了。 ~~~那就浅写一首不像诗的诗聊表纪念吧~~~ 其实偶尔还是会迷茫&#xff0c; 但不必过分紧张&#xff0c; 每个时代都有每个时代化的特色的机遇与挑战&#xff0c; …

服务案例|AI算法在Oracle指标异常检查、故障预测之牛刀小试

LinkSLA与南京大学合作&#xff0c;将AI算法引入运维平台&#xff0c;将趋势性、周期性强的指标数据通过机器学习&#xff0c;实现异常检测、故障预测等功能。 下面分享一个通过AI算法&#xff0c;对Oracle数据库故障预测的案例。 在3月16日&#xff0c;MOC工程师接到某公司的…

中学数学教学参考杂志社中学数学教学参考编辑部2022年第27期目录

谈学论教 “平行四边形”章首课的教学思考 李斌; 1-3 高中数学课程中的函数教学 孔鑫辉; 3-4《中学数学教学参考》投稿&#xff1a;cn7kantougao163.com 对方程起始课教学的探究 梅琴; 5-7 注重师生互动,激活数学课堂 董启福; 8-9 例析高中数学体验教学法的…

RPC框架(一)——简易RPC

RPC介绍 RPC&#xff0c;Remote Procedure Call 即远程过程调用&#xff0c;远程过程调用其实对标的是本地过程调用 一个RPC框架要进行使用应该要具有如下的组件&#xff08;功能&#xff09; 从整体层次来看&#xff0c;一个RPC协议的框架应该具有三个层面&#xff1a; 服…

RSE2021/云检测:基于小波变换和连续多尺度空间注意的上下块深度网络云检测

RSE2021/云检测Deep network based on up and down blocks using wavelet transform and successive multi-scale spatial attention for cloud detection基于小波变换和连续多尺度空间注意的上下块深度网络云检测0.摘要1.概述2.方法3.背景4.实验数据5.我们的方法5.1.UD-NET5.1…

frp内网穿透

文章目录原理如果没有配置ssh&#xff0c;需要先配置ssh免密登录到pc内网穿透流程frp自启动frps自启动frpc自启动原理 1、在公网中转服务器上面搭建FRP服务器。同时&#xff0c;在内网服务器上面安装FRP客户端。 2、按照UP的FRP客户端配置文件进行说明。7000端口是FRP服务端开放…

tk跨境电商好做吗?有什么技巧吗?

最近tiktok大热&#xff0c;不少小伙伴都在蠢蠢欲动了&#xff0c;但他们都在担心tk跨境电商到底好不好做&#xff1f;有什么技巧没有&#xff1f;因为怕耗时耗力最后一场空。这里我们大家就来简单聊聊吧&#xff01; tk跨境电商好做吗&#xff1f; 其实个人认为tk跨境电商现阶…

fork函数相关资源复制问题验证

前言 fork是什么&#xff1f;克隆当前的进程&#xff0c;然后创建一个子进程。本文分几个验证实例代码&#xff0c;主要是为解决验证一些小问题。 一 fork与文件描述符 fork之前打开一个文件的测试。 问题&#xff1a;fork之后&#xff0c;父进程关闭文件&#xff0c;子进程是…

14天学习训练营导师课程-Pygame学习笔记-Part1(环境准备)

14天学习训练营导师课程&#xff1a; 李宁《Python Pygame游戏开发入门与实战》 李宁《计算机视觉OpenCV Python项目实战》1 李宁《计算机视觉OpenCV Python项目实战》2 李宁《计算机视觉OpenCV Python项目实战》3 学习知识点 学习先从环境安装和配置开始&#xff1a; 环境安装…

微积分在金融投资的应用

目 录 摘 要 I ABSTRACT II 1绪论 1 1.1选题背景及意义 1 1.2国内外研究现状 1 1.3微积分发展概述 2 1.3.1微积分学的创立 2 1.3.2微积分诞生的重要意义 3 1.3.3微积分理论内容介绍 3 1.3研究主要内容 4 2微积分在金融投资中的应用 5 2.1导数在金融投资中的应用 5 2.1.1导数在金…

Springboot疫苗接种管理系统-JAVA.JSP【数据库设计、源码、开题报告】

摘 要 预防预接种工作实行网络信息化管理&#xff0c;是我国免疫规划工作发展的需要。接种信息实行网络信息化不仅是预防接种工作步入了一个新的台阶&#xff0c;更重要的是解决了多年疫苗接种过程种&#xff0c;免疫接种剂次不清&#xff0c;难以全程有效接种的问题&#xff…

SpringBoot + openFeign实现远程接口调用

SpringBoot服务之间通过openFeign实现远程接口调用 现在的微服务项目不少都使用的是springbootspring cloud构建的项目&#xff0c;微服务之间的调用都离不开feign来进行远程调用。那么我们一个服务需要调用第三方的服务的时候&#xff0c;我们常常可能使用httpclient或者rest…

正大国际期货:2022正大期货在国际市场热度不减的几点原因

2022年国际期货是金融行业重点关注的对象&#xff0c;从今年市场数据中可以看出&#xff0c;正大国际期货之所以还能一如既往领跑&#xff0c;每年交易量都在递增&#xff0c;和正大后台的实力雄厚&#xff0c;坚守合作互赢的理念重大相关&#xff0c;接下来重点说说正大国际越…

【ML-SVM案例学习】svm实现手写数字识别

文章目录前言一、源码分步解析1.引入库2. 设置属性防止中文乱码3.加载数字图片数据4.获取样本数量&#xff0c;并将图片数据格式化5.模型构建6.测试数据部分实际值和预测值获取7.进行图片展示8.把预测错的值的 x值 y值 和y的预测值取出9.通过enumerate&#xff0c;分别拿出x值 …

Java的三大特性之继承

封装详见&#xff1a;Java的三大特性之封装 多态详见&#xff1a;Java的三大特性之多态 1.认识继承 继承的本质是对某一批类的抽象&#xff0c;从而实现对显示世界更好的建模。 extends “扩展” 子类是父类的扩展&#xff0c;子类继承了父类&#xff0c;就会有父类的全部方法…

强推这款键盘利器(Keychron),这次我彻底入坑了

嗨喽&#xff0c;大家好。还记得我今年五月份的时候&#xff0c;发布了一篇关于自己使用键盘的文章——>程序猿必备键盘推荐&#xff08;Keychron&#xff09;&#xff0c;实用炫酷两不误&#xff0c;这篇文章发布后引起了强烈的反响。身边的同学、朋友&#xff0c;包括一些…

Ubuntu20.4系统隐藏顶栏

注&#xff1a;Ubuntu20.4以上版本安装gnome-tweak-tool可以实现隐藏顶栏了&#xff0c;但20.4还需要安装一下扩展模块&#xff0c;教程如下&#xff1a; 在Ubuntu中有两个扩展工具都支持隐藏顶栏。 1、安装autohidetopbar。 sudo apt install gnome-shell-extension-autohid…

【web】JavaScript——Web APIs笔记小结 dom 样式属性(自定义属性+节点操作部分)

期中考完回来更新了 感觉进度真的好慢T^T&#xff0c;已经摸了快一个月的鱼了qwq&#xff01;&#xff01;&#xff01; 来源&#xff1a;JavaScript基础语法-dom-bom-js-es6新语法-jQuery-数据可视化echarts 目录 ⑦H5自定义属性 V.节点操作 ①节点层级 ※※父级节点 ※…

react事件系统(新老版本)

带着问题阅读探索 React 为什么有自己的事件系统&#xff1f;什么是事件合成 &#xff1f;如何实现的批量更新&#xff1f;事件系统如何模拟冒泡和捕获阶段&#xff1f;如何通过 dom 元素找到与之匹配的fiber&#xff1f;为什么不能用 return false 来阻止事件的默认行为&…