基于arduino的oled显示屏的使用
摘要
OLED属于一种电流型的有机发光器件,是通过载流子的注入和复合而致发光的现象,发光强度与注入的电流成正比。OLED在电场的作用下,阳极产生的空穴和阴极产生的电子就会发生移动,分别向空穴传输层和电子传输层注入,迁移到发光层。当二者在发光层相遇时,产生能量激子,从而激发发光分子最终产生可见光。
oled显示屏模块是每个Maker都会用到的显示器件,然而OLED本身它是使用在我们生活中很多地方的。我们这里所说的就是OLED显示屏模块,它有双色和单色的,有128X64的,有128X32等不同规格。我们这里讲的是基于arduino的OLED库的基本的调用。
1.依赖的库
Adafruit_GFX.h
Adafruit_SSD1306.h
如果使用的OLED模块是128X64像素,需要修改Adafruit_SSD1306.h头文件。具体操作:找到Adafruit_SSD1306.h文件并打开!
PS:头文件不能直接使用arduino ide打开,需要使用文本编辑器打开,文本编辑器牵扯到文本编码,推荐使用editplus 或者Notepad进行修改。如果使用的是Visual studio,打开头文件就不需要找路径,选中直接右键选择打开头文件就好了。
取消注释: #define SSD1306_128_64
注释掉行:#define SSD1306_128_32
2.库函数简介
Adafruit_SSD1306.h是基于Adafruit_GFX.h开发的库,扩展重写了一些方法,在使用中,我们主要使用部分函数来实现基础的使用,其中有两个库的函数方法,主要介绍的函数如下:
display();//显示缓冲区图片
clearDisplay();//清理缓冲区`
drawPixel(X_POS, Y_POS, WHITE); // 画点
drawLine(X_POS, Y_POS,128, 64, WHITE);//画线
drawRect(X_POS, Y_POS, width, height , WHITE); // 画一个矩形
fillRect(X_POS, Y_POS, width, height, WHITE); // 画一个填充矩形
drawCircle(X_POS, Y_POS, 10, WHITE); // 画一个居中半径为10的圆
fillCircle(X_POS, Y_POS, 10, WHITE);// 画一个居中半径为10的填充圆
fillRoundRect(X_POS, Y_POS, width, height, 14, WHITE);// 画一个带半径14圆角的填充矩形
startscrollright(0x00, 0x0f);//屏幕旋转
stopscroll();//屏幕旋转停止
setTextSize(1);//设定字体大小
setTextColor(WHITE);//设定字体颜色
setCursor(0, 0);//设定起始点
write(i);//字符显示,asii对应的字符
println("Hello, world!"); // 文本显示
drawBitmap(0, 0, logo_glcd_bmp_expendables[], HEIGHT, WIDTH, WHITE); // 显示一张图片
invertDisplay(true); // 图形取反
invertDisplay(false);// 取消图形取反
3.硬件介绍
OLED模块是通过i2c与Arduino进行通讯的
//Arduino UNO--OLED
//VCC --3.3v 接3.3v电源
//GND--GND接地(GND)
//SCL--A5时钟线
//SDA--A4数据线
4.显示的基本操作
step i.显示内容更新到缓冲区
step ii.调用display()方法显示
step iii.清理缓存(在不清理缓冲区的情况下写入,如果不是写整个屏幕,写的位置与原有缓冲区数据与运算,会出现图像叠加,除非你特此设计)
5.示例
i.制作一个进度条
void Draw_Init_Interface(void) {
for (size_t i = 0; i < 46; i = i + 5)
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(25, 20);
display.println("Initialize...");
display.drawRect(38, 38, 51, 6, WHITE);//以(38,38)为起点绘制一个长度51宽度为6的矩形
display.drawLine(40, 40, 40 + i, 40, WHITE);//循环绘制线条达到显示进度的效果
display.drawLine(40, 41, 40 + i, 41, WHITE);
display.display();
//delay(10);
display.clearDisplay();
}`
display.display();
}
ii.显示文字
//显示字符,转换为ASCII
display.setCursor(0,0);
display.setTextSize(1);
display.setTextColor(WHITE);
for (uint8_t i=0; i < 168; i++) {
if (i == '\n') continue;
display.write(i);
if ((i > 0) && (i % 21 == 0))
display.println();
}
display.display();
// 显示字符串
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Hello, world!");
display.setTextSize(2);
display.println("Hello, world!");
display.display();`
delay(2000);`
iii.显示图片(中文)
// 显示一张图片
display.clearDisplay();
display.drawBitmap(0, 0, logo_glcd_bmp_expendables, LOGO_GLCD_HEIGHT, LOGO_GLCD_WIDTH, WHITE);
display.display();
delay(2000);
display.clearDisplay();
6.取模工具的使用
i.图片取模
ii.字符取模
图片和字符的取模请大家自行百度,这里免费为大家提供2款取模工具,需要的关注公众号“痴人听梦”
后台回复“取模工具”获取下载地址。
7.预设画面
实例创建后,调用begin方法启动器件,在begin方法中默认会写入splash图像,作为启动画面。
此方法的具体代码:
if(HEIGHT > 32) {
drawBitmap((WIDTH - splash1_width) / 2, (HEIGHT - splash1_height) / 2,
splash1_data, splash1_width, splash1_height, 1);
} else {
drawBitmap((WIDTH - splash2_width) / 2, (HEIGHT - splash2_height) / 2,
splash2_data, splash2_width, splash2_height, 1);
}
在使用Adafruit_SSD1306库进行OLED使用的时候,可以自己设计好自己的预设画面,更新到splash.h头文件中,替换掉其中的splash1_data[],就可以将自己的预设画面作为启动画面了。需要注意的就是图画的长宽。库预设的是82X64的,如果你自己设计的是128X64的,也要记得改splash1_width和splash1_height这两个宏定义。
完整示例代码如下:
// Visual Micro is in vMicro>General>Tutorial Mode
//
/*
Name: OlED_Display_Demo.ino
Created: 2020/3/14 星期六 18:46:31
Author: DESKTOP-4JO134Q\Administrator
*/
// Define User Types below here or use a .h file
//
#include <splash.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET -1
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO_GLCD_HEIGHT 128 //宏定义,定义图像的长,可根据自己的需要设置
#define LOGO_GLCD_WIDTH 64 //宏定义,定义图像的宽
static const unsigned char PROGMEM logo_glcd_bmp_expendables[] =
{
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,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,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x80,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x60,0x00,0x30,0x00,0x80,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0xFF,0xBF,0xFC,0xDF,0xFF,0xFF,0xFF,0xFF,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x00,0xFF,0xFF,0x3F,0xFC,0xCF,0xFF,0xFF,0xFF,0xFF,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x01,0xFF,0xFF,0x3F,0xFC,0xEF,0xFF,0xFF,0xFF,0xFF,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x03,0xFF,0xFF,0xBF,0xFC,0xF7,0xFF,0xFF,0xFF,0xFF,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x23,0xFF,0xFF,0xBF,0xFC,0xF7,0xFF,0xFF,0xFF,0xFF,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x60,0x00,0x1F,0x80,0x7C,0xF8,0x01,0xF8,0x07,0xE0,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x7F,0xFF,0xFF,0xFE,0x7C,0xFF,0xFD,0xF8,0x07,0xE0,0xF9,0xF0,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFE,0x7C,0xFF,0xFD,0xF8,0x17,0xE0,0xF9,0xF0,0x00,0x00,
0x00,0x01,0xFF,0xFF,0xFF,0xFE,0x7C,0xFF,0xFD,0xF8,0x37,0xE0,0xF9,0xF0,0x00,0x00,
0x00,0x01,0xFF,0xFF,0xFF,0xFE,0x7C,0xFF,0xFD,0xFF,0xF7,0xE0,0xF9,0xF0,0x00,0x00,
0x00,0x03,0xFF,0xFF,0xFF,0xFE,0x7C,0xFF,0xFD,0xFF,0xF7,0xE0,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x00,0x7C,0x1F,0x3E,0x7C,0x00,0xFD,0xFF,0xF7,0xE0,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x00,0x7F,0xFF,0xBE,0x7C,0x00,0xFD,0xFF,0xF7,0xE0,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x00,0x7F,0xFF,0xBE,0x7C,0xFF,0xFD,0xFF,0xF7,0xE8,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x00,0x7F,0xFF,0xBE,0x7C,0xFF,0xFD,0xF8,0x07,0xEB,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x00,0x7F,0xFF,0xBE,0x7C,0xFF,0xFD,0xF8,0x07,0xEF,0xF9,0xF0,0x00,0x00,
0x00,0x00,0x00,0x7F,0xFF,0xBE,0x7C,0xFF,0xFD,0xF8,0x07,0xEF,0xF1,0xF0,0x00,0x00,
0x00,0x00,0x00,0x7C,0x1F,0xBE,0x7C,0xFF,0xFD,0xF8,0x07,0xEF,0xE3,0xF8,0x00,0x00,
0x00,0x00,0x00,0x7F,0xFF,0xBE,0x7C,0x00,0xFD,0xFE,0x07,0xEF,0xCF,0xFC,0x00,0x00,
0x00,0x00,0x00,0x7F,0xFF,0xBF,0x7C,0x00,0xFC,0xFF,0x07,0xEF,0x1F,0xFF,0x00,0x00,
0x00,0x00,0x00,0x7F,0xFF,0x3F,0xFC,0x01,0xF8,0x7F,0xC7,0xEE,0x3F,0xFF,0x80,0x00,
0x00,0x00,0x00,0x7F,0xFF,0xBF,0xFC,0x03,0xF8,0x3F,0xE7,0xEC,0xFF,0xBF,0xE2,0x00,
0x00,0x00,0x02,0x7F,0xFF,0x9F,0xF8,0x03,0xF0,0x0F,0xF7,0xE1,0xFE,0x1F,0xF2,0x00,
0x00,0x00,0x06,0x7C,0x1F,0x8F,0xF8,0x07,0xE0,0x07,0xF7,0xE7,0xFC,0x07,0xFA,0x00,
0x00,0x00,0x06,0x7E,0x1F,0x87,0xF8,0x0F,0xC0,0x01,0xF7,0xEF,0xF8,0x03,0xFE,0x00,
0x00,0x00,0x0F,0xFF,0xFF,0x87,0xFC,0x0F,0xC0,0x00,0xF3,0xEF,0xE0,0x00,0xFE,0x00,
0x00,0x00,0x1F,0xFF,0xFF,0x8F,0xFE,0x1F,0x80,0x00,0x33,0xEF,0xC0,0x00,0x7E,0x00,
0x00,0x00,0x1F,0xFF,0xFF,0x8F,0xFC,0xBF,0x80,0x00,0x13,0xEF,0x80,0x00,0x34,0x00,
0x00,0x00,0x3F,0xFF,0xFF,0x9F,0xBC,0xFF,0x00,0x00,0x03,0xEE,0x00,0x00,0x0C,0x00,
0x00,0x00,0x20,0xFF,0xFF,0xBF,0x9C,0xFE,0x00,0x00,0x03,0xEC,0x00,0x00,0x04,0x00,
0x00,0x00,0x00,0x00,0x1F,0x3F,0x0C,0xFE,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0xFE,0x00,0xFC,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0xFE,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0xFC,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0xF8,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0xF0,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0xC2,0xED,0x7C,0xF6,0x6B,0x18,0xF9,0x07,0xDE,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0xC3,0x07,0x66,0x83,0x69,0x9C,0xCD,0x04,0x32,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0x83,0x63,0x66,0xA1,0x68,0x94,0xC9,0x05,0xB8,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0x02,0xE6,0x7C,0xB7,0xE8,0xB6,0xD9,0x05,0x9E,0x00,0x00,
0x00,0x00,0x00,0x00,0x1F,0x03,0x07,0x61,0x86,0xA8,0xBE,0x4D,0x0C,0x23,0x00,0x00,
0x00,0x00,0x00,0x00,0x1E,0x03,0x65,0x61,0xA6,0x49,0xA2,0xC9,0x25,0xB2,0x00,0x00,
0x00,0x00,0x00,0x00,0x1C,0x00,0x6D,0x20,0x36,0x6B,0x23,0x79,0x61,0xD4,0x00,0x00,
0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x00,0x03,0x02,0x12,0x24,0x0A,0x05,0x10,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,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,0xA0,0x41,0x20,0x48,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
};//敢死队图片
static const unsigned char PROGMEM char_128_64_glcd_bmp_ZH_xin[] =
{
0x00, 0x00, 0x0C, 0x60, 0x0C, 0x30, 0x18, 0x7F, 0x1F, 0xC0, 0x38, 0x38, 0x79, 0xE0, 0xD8, 0x38,
0x19, 0xE0, 0x18, 0x38, 0x19, 0xF8, 0x19, 0x98, 0x19, 0xF8, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, //"信", 0
};
static const unsigned char PROGMEM char_128_64_glcd_bmp_ZH_xi[] =
{
0x01, 0x80, 0x03, 0x00, 0x07, 0xE0, 0x0C, 0x60, 0x0F, 0xE0, 0x0C, 0x60, 0x0F, 0xE0, 0x0C, 0x60,
0x0F, 0xE0, 0x00, 0x0E, 0x3D, 0x83, 0x3C, 0xF0, 0x66, 0x18, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, //"息", 1
};
static const unsigned char PROGMEM char_128_64_glcd_bmp_ZH_xian[] =
{
0x00, 0x00, 0x01, 0xF0, 0x1F, 0x30, 0x19, 0xF0, 0x0F, 0x30, 0x0D, 0xE0, 0x0F, 0x00, 0x06, 0xD8,
0x06, 0xD8, 0x36, 0xF0, 0x1E, 0xE0, 0x06, 0xC0, 0x07, 0xFE, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, //"显", 2
};
static const unsigned char PROGMEM char_128_64_glcd_bmp_ZH_shi[] =
{
0x00, 0x00, 0x00, 0x70, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x7F, 0x80, 0x01, 0x80,
0x19, 0xB0, 0x19, 0x9C, 0x39, 0x8C, 0x31, 0x80, 0x03, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, //"示", 3
};
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void Draw_Init_Interface(void) {
for (size_t i = 0; i < 46; i = i + 5)
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(25, 20);
display.println("Initialize...");
display.drawRect(38, 38, 51, 6, WHITE);
display.drawLine(40, 40, 40 + i, 40, WHITE);
display.drawLine(40, 41, 40 + i, 41, WHITE);
display.display();
//delay(10);
display.clearDisplay();
}
display.display();
}
// The setup() function runs once each time the micro-controller starts
void setup()
{
// 初始化串口
Serial.begin(115200);
//启动OLED
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
display.display(); // 屏幕显示(显示内容为预设画面)
delay(2000);
display.clearDisplay(); //清理屏幕和缓存区(I2C只清理缓存区)
Draw_Init_Interface();
display.clearDisplay(); //清理屏幕和缓存区(I2C只清理缓存区)
Serial.println("Display Initialize Finish");
// 画点
display.drawPixel(64, 32, WHITE);
display.display();
delay(2000);
display.clearDisplay();
//画线
display.drawLine(0, 0, 128, 64, WHITE);
display.display();
delay(2000);
display.clearDisplay();
// 画一个矩形
display.drawRect(0, 0, display.width(), display.height() , WHITE);
display.display();
delay(2000);
display.clearDisplay();
// 画一个填充矩形
display.fillRect(0, 0, display.width(), display.height(), WHITE);
display.display();
delay(2000);
display.clearDisplay();
// 画一个居中半径为10的圆
display.drawCircle(display.width() / 2, display.height() / 2, 10, WHITE);
display.display();
delay(2000);
display.clearDisplay();
// 画一个居中半径为10的填充圆
display.fillCircle(display.width() / 2, display.height() / 2, 10, WHITE);
display.display();
delay(2000);
display.clearDisplay();
// 画一个带半径14圆角的填充矩形
display.fillRoundRect(0, 0, display.width(), display.height(), display.height() / 4, WHITE);
display.display();
delay(2000);
display.clearDisplay();
//字符显示
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
for (uint8_t i = 0; i < 168; i++) {
if (i == '\n') continue;
display.write(i);
if ((i > 0) && (i % 21 == 0))
display.println();
}
display.display();
delay(2000);
display.clearDisplay();
//屏幕旋转
display.startscrollright(0x00, 0x0f);
delay(2000);
//屏幕旋转停止
display.stopscroll();
display.clearDisplay();
// 文本显示
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Hello, world!");
display.setTextColor(BLACK, WHITE); // 'inverted' text
display.println(3.141592);
display.setTextSize(2);
display.setTextColor(WHITE);
display.print("0x"); display.println(0xDEADBEEF, HEX);
display.display();
// 显示一张图片
display.clearDisplay();
display.drawBitmap(0, 0, logo_glcd_bmp_expendables, LOGO_GLCD_HEIGHT, LOGO_GLCD_WIDTH, WHITE);
display.display();
delay(2000);
display.clearDisplay();
// 图形取反
display.invertDisplay(true);
delay(2000);
display.invertDisplay(false);
delay(2000);
//显示汉字
display.clearDisplay();
display.drawBitmap(0, 0, char_128_64_glcd_bmp_ZH_xin, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH, WHITE);
display.drawBitmap(16, 0, char_128_64_glcd_bmp_ZH_xi, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH, WHITE);
display.drawBitmap(32, 0, char_128_64_glcd_bmp_ZH_xian, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH, WHITE);
display.drawBitmap(48, 0, char_128_64_glcd_bmp_ZH_shi, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH, WHITE);
display.display();
delay(2000);
display.clearDisplay();
}
// Add the main program code into the continuous loop() function
void loop()
{
}