#include
选择使用的屏幕型号,这里使用的是SSD1306驱动的128 x 64:U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /*clock=*/SCL, /*data=*/SDA, /*reset=*/U8X8_PIN_NONE);
类的一些含义:
部分 | 含义 |
一 | 固定U8G2 |
二 | 驱动芯片名字 |
三 | 显示大小 |
四 | OLED名字,一般就是NONAME |
五 | 1/2/F分别是一页、二页、全部完成的显示缓存,占用芯片内存依次增加 |
六 | 通信类型 SW:软件模拟 HW:硬件模拟 |
形参的含义:
形参 | 含义 |
U8G2_R0/1/2/3/MIRROR | 不旋转、顺90、顺180、顺270、镜像 |
clock | SPI:时钟 I2C:SCL |
data | I2C SDA |
reset | 屏幕的重置引脚,没有就U8X8_PIN_NONE |
cs | 片选 |
dc | 命令脚 |
SSD1306使用spi的SW,一次刷新要500ms,硬件22ms
类的选择参考:https://github.com/olikraus/u8g2/wiki/u8g2setupcpp/
以上配置就把屏幕信息选择好了,就可以使用函数了。这里有个注意的地方,上面代码中间的u8g2是一个对象。
u8g2.enableUTF8Print(); // enable UTF8 support for the Arduino print() function
// enableUTF8Print()好像初始化默认开启,以防万一加了也没啥事,用来支持中文的。
u8g2.setContrast(200); // 设置亮度(0-255),似乎用不了,不用也行。
u8g2.begin(); // 初始化的设置
u8g2.setFont(u8g2_font_wqy15_t_gb2312b);
选择字体,u8g2_font_wqy15_t_gb2312b就是汉字。字号从12-16,把前面15改掉来选择。
英文的一般用:u8g2_font_unifont_t_symbols和u8g2_font_ncenB12_tr
中文字体16号就占用了320K空间。
查询字库参考:Wiki - Gitee.com
网站使用讲解:
Pixel表示像素,意思就是你字体的大小。
新版加入了文泉驿字库,有以下几个:
u8g2_font_wqy16_t_chinese1
u8g2_font_wqy16_t_chinese2
u8g2_font_wqy16_t_chinese3
u8g2_font_wqy16_t_gb2312
u8g2_font_wqy16_t_gb2312a
u8g2_font_wqy16_t_gb2312b
说明:chinese1/2/3是小字符集,不常用。gb2312是完整的,有七千多字符;gb2312a没有全角标点符号,4041字符;b比a多了一些额外符号,4531字符。
u8g2命名规则:
含义 | |
t | 透明字体 |
h | 字体等高 |
m | 字体等高等宽 |
8 | 固定 8 X 8 像素 |
含义 | |
f | 完整ASCII,256个字符 |
r | ASCII的32-127 |
u | ASCII32-95 |
n | 只有数字和额外的glyphs |
... | 其他的没啥好说 |
注意点:u8g2的文本显示在光标的右上角。
home(0); // 光标返回原点
setCursor(x,y) // 光标坐标
clear(); // 清屏和缓冲,光标回原点
clearBuffer(); // 清缓冲
sendBuffer(); // 显示缓冲区
u8g2.drawStr(x,y,“文本”); // 编码不大于256的文本,y轴向上绘制
u8g2.drawUTF8(x,y,“文本”); // 可以中文
u8g2.drawGlyph(x,y,HEX); // 绘制特殊文本图标,比如内置的天气的图标,后面细说
u8g2.print(xxx); // 打印文本字符,可打中文、变量,须同配合setCursor和setFont
其他不打了,太多了。自行了解。
这里缓冲区的概念需要清楚:打个比方,上台表演,幕布没拉,观众看不到东西,但演员在后面准备好了,就叫放入缓冲区,一旦拉幕布,就看到了,就是显示这个命令。一旦显示,除非刷新,才能显示新放入缓冲区里的。
#include
#include
#define SDA 4 // SDA引脚,默认gpio4(D2)
#define SCL 5 // SCL引脚,默认gpio5(D1)
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /*clock=*/SCL, /*data=*/SDA, /*reset=*/U8X8_PIN_NONE); // 选择显示屏幕
void setup(){
u8g2.begin(); // 初始化
u8g2.enableUTF8Print(); // UTF8允许
u8g2.clearBuffer(); // 清除缓存,其实初始化里有清除,循环时一定要加上
u8g2.setFont(u8g2_font_wqy12_t_gb2312b); // 选择中文gb2313b
u8g2.setCursor(0,15); // 缓存区定位
u8g2.print("你好,U8g2!"); // 指定缓存区需要打印的字符串
u8g2.sendBuffer(); // 将定位信息发送到缓冲区
}
void loop(){
}
这个玩意的使用,看了半天都没搞懂,累死人,好在看出来了。
可以表示的特殊图标参考下面:
fntgrpiconic · olikraus/u8g2 Wiki · GitHub
讲解一下:
网页里这一大串玩意,主要看后面的英文。就比如我现在要用weather,找到点开来。
看第二行,那个就是放入u8g2.setFon(形参)里的,不要以为只能放文字,他这个意思就是,文字、图标各有自己的库,对应一个类,标签一样的。放进去意思可以用他里面的东西了。本文说的类是C++里的,自行了解,说白就是封装函数的库。
第三行,显然说文字大小的。
第五行,文字一般直接写就行,图标必须用代码,他这里用十六进制来编码的。0040就是第一个图标代码,你要是想用第三个月亮,就是0042,前面64表达啥意思,不知道。但只使用后面的就可以了。
所以你想用天气图标里的月亮,你应该写下面两句:
u8g2.setFont(u8g2_font_open_iconic_weather_1x_t);
u8g2.drawGlyph(0,16,0x0042);
u8g2.sendBuffer(); // 显示缓冲区内容
#include
#include
#define SDA 4 // SDA引脚,默认gpio4(D2)
#define SCL 5 // SCL引脚,默认gpio5(D1)
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /*clock=*/SCL, /*data=*/SDA, /*reset=*/U8X8_PIN_NONE); // 选择显示屏幕
void setup(){
u8g2.begin(); // 初始化
u8g2.enableUTF8Print(); // UTF8允许
u8g2.clearBuffer(); // 清除缓存,其实初始化里有清除,循环时一定要加上
u8g2.setFont(u8g2_font_open_iconic_weather_4x_t); // 选择内置Weather图标
u8g2.drawGlyph(0,31,0x0045); // 选择0x45图标,定位在(0,31)右上方
u8g2.sendBuffer(); // 将定位信息发送到缓冲区
}
void loop(){
}
drawXBM(x,y,w,h,const uint8_t *bitmap);
drawXBMP(x,y,w,h,const uint8_t *bitmap); // 该函数支持PROGMEM,也是他们的区别
// PROGMEM是将它修饰的变量放到Flash中,而不是放到RAM
坐标(x,y),图片宽w和高h,uint8_t *bitmap放入你要显示图片的数组名。
表示图片的数组可以用PCtoLCD2002生成。该软件的使用不做讲解,自行了解。需要注意的是图片的像素大小必须小于你屏幕能显示的大小,图片格式选择BMP,且是单色位图。
还可以使用这个工具:奈何col的工具集,生成的数组要是显示有问题你就切换大小端。
另一个工具:Easy U8g2 font generate tools: 这是一个易于操作的U8g2字体生成工具,使用者只需要输入需要转换的文本,选择字体文件以及设置字体大小,该工具会自动对文本进行去重、生成map字体映射文件、生成bdf字库并最终导出C语言字库代码
使用这个工具的时候,有一个要你给他字符风格的,就是“输入ttf格式字体路径”。你可以在你电脑C盘windows下找到Fonts,里面全是各种风格。你用楷体就把他复制下来放桌面,改个名字。然后命名行输入:Desktop:\STKAITI.TTF。Desktop是存放在桌面的意思,你要是放D盘就改成D,其实也就是放入存放路径。数组的保存内径工具生成后下面会告诉你。然后你把找到该文件,打开来,内容全部复制放入u8g2/scr/clib/u8g2_fonts.c文件里,找个空地方复制就行。然后找到u8g2.h,在最后面写自己字体的声明,照着上面的模板修改。完了之后使用的话,要用u8g2.setFont();括号里放入你字体的名字。你可能问都自带中文字库了,为啥我还要用这些工具,因为字最大也就16像素。
u8g2.drawPixel(x,y); // 绘制像素点
u8g2.drawHLine(x,y,w); // 绘制水平线,w表示长度
u8g2.drawVLine(x,y,h); //绘制竖直线,h表高度
u8g2.drawLine(x,y,x1,y1); // 绘制直线,(x,y)端点坐标,(x1,y1)另一端点坐标
u8g2.drawBox(x,y,w,h); // 画实心矩形
u8g2.drawFrame(x,y,w,h); // 空心矩形
u8g2.drawFrame(x,y,rad,opt); // 画空心圆。rad半径;opt选择圆形画多少
// opt的参数选择有:U8G2_DRAW_ALL (整个圆)、U8G2_DRAW_UPPER_RIGHT右上圆弧、U8G2_DRAW_UPPER_LEFT左上圆弧、U8G2_DRAW_LOWER_RIGHT右下圆弧、U8G2_DRAW_LOWER_LEFT左下圆弧
u8g2.drawDisc(x,y,rad,opt); // 画实心圆
u8g2.drawEillipse(x,y,rx,ry,opt); // 画空心椭圆,rx:椭圆中心在x轴方向到椭圆的距离;ry同理
u8g2.drawFilledEillipse(x,y,rx,ry,opt); // opt参数和之前的一样
u8g2.drawRBox(x,y,w,h,r); // 画圆角实心方形,r为圆角半径
u8g2.drawRFrame(x,y,w,h,r); // 画圆角空心方形
u8g2.drawTriangle(x0,y0,x1,y1,x2,y2) //画实心三角形,三个顶点坐标