某宝上买了个I2C接口的OLED单色小显示屏,128*64分辨率。光看到卖家说给例程,就没注意到卖家说排插柱要自己焊。好吧反正就四个,用周五下午偷懒等下班的时间动手搞定。
I2C接口的就是方便,VCC和GND分别接Arduino的5V和地,SCL和SDA也直接插在了Arduino的SCL和SDA引脚插座上(AREF边上的那两个)。
商家给的例程用的库就是U8glib,用起来还是很方便的。需要注意的是u8g的定义,如果编译不通过有可能是例程中所有u8g定义都被注释了。例程提供了上百种定义,纵有一款适合你。我最后是尝试了U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI 这一条才编译通过并能正常运行。
导入库之后看看U8glib的Hello world例程基本上连猜带蒙也能看懂个七八成。打印英文文字的套路基本上就是:
u8g.setFont(u8g_font_unifont);
u8g.drawStr( 0, 22, "Hello World!");
或者
u8g.setFont(u8g_font_baby);
u8g.setPrintPos(15,70);
u8g.print("Hello World!");
关于U8glib字体的更多信息,请参考 https://github.com/olikraus/u8glib/wiki/fontgroup。
也可以访问 https://github.com/olikraus/u8glib/wiki 获取关于U8glib的更多参考。
汉字还没研究,先研究了下怎么显示图案。
比方说,我要显示这个图案:
(120*64,BMP格式)
卖家给的例程包里有一个“128x64取字软件”的文件夹,给了一个PCtoLCD的工具。用它打开BMP,选项里设置取模方式为“逐行式”,取模走向逆向,自定义C51格式,行前缀留空,行后缀改成一个半角的逗号,然后确定。这时候软件会给出一个预览图,按“生成字模”按钮,自动产生了一串代码,形如:
......
0x00,0xF8,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC8,0x01,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,
......
要的就是这个。
Arduino中的套路是:
#include "U8glib.h"
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI
然后填充这段代码,除了字模内容什么都不要改:
static unsigned char bitmap[] U8G_PROGMEM = {
......
0x00,0xF8,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC8,0x01,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,
......
}
这样就可以调用drawXBMP了:
void draw(void) {
u8g.drawXBMP(0, 0, 120, 64, bitmap);
}
setup不用动,用示例中自带的就好,
loop里:
void loop(void) {
// picture loop
u8g.firstPage();
do {
draw();
} while ( u8g.nextPage() );
// rebuild the picture after some delay
delay(500);
}
打完收工,编译上传看效果。
效果图:
嗯,最近也迷上乐高了,这个坑也不小啊。。。