ElecFun--Arduino--OLED12864和U8glib库

简介

这边文章将会演示的是使用一个U8glibOLED图形库,如果你刚刚接触,可以点击这个链接,了解更多U8glib库(可能被墙,所以你的会翻墙)这里面是英文资料,所以,你得准备好一个电子词典,在阅读的时候,随时查询(U8glib是一个图形库来的,支持很多种类的OLED)来点亮OLED12864液晶显示器,这是一个非常好用的图形库,能够让我们非常快捷开发Arduino的OLED驱动程序。而且最大的好处是开源。

我用到的是一个朋友做好的OLED手表来演示这个程序,关于这个我将要作为演示的硬件的更多资料,你可以访问他的网页

下面的图片是我从Github里面找到的。

当然我们的U8glib可是很强大的,支持的好几款不同的芯片,这里我们只用到基于AVR芯片的Arduino系统。


文章适合对象

本文适合的对象是对Arduino编程有一定了解的人,比如知道Arduino的库使用,同时对Arduino编程语言有一定了解的人。当然如果你对Arduino有非常大的热情的话,也可以先了解一下这些内容,再继续往下面看。不然可能会给你带来一定的难度。

需要的硬件:

1. 同时你需要手头上有一块Arduino 主控板,建议购买Arduino UNO 或者是 Arduino pro mini 因为这个对于新手来说比较容易入门。

2. 当然你还需要有一块12864OLED液晶显示器,如果有其他尺寸的OLED显示屏也是没关系的,因为U8glib库,支持非常多的类型,你只要在U8glib提供的例程序就能知道,这是有多么强悍的一个库了。

支持的类型有:SSD1325, ST7565, ST7920, UC1608, UC1610, UC1701, PCD8544, PCF8812, KS0108, LC7981, SBN1661, SSD1306, SH1106, T6963, LD7032 等等

你可以在这里查到所有完整支持的设备类型:

支持的设备类型

现在很多OLED模块都是宽电压输入的,支持3.3到5.5V输入,但是无论如何你都得仔细查看一下你的OLED究竟支持多少伏输入,在使用一个新元器件之前,查看他的数据手册或者电气资料对一个工程师来说,是一个非常好的习惯。

3. 必要的杜邦线,一根micro USB线,给主控板通电,还有给Arduino主控板下载程序使用。

下面就是我使用的硬件背面图,里面已经集成了Arduino Nano主控板和OLED12864,所以这里没有演示怎么接线,但是是遵从I2C接线的。


一般步骤

当然这篇文章,主要是应用U8glib的库,我们只需要知道怎么调用,就能够做很多事情了。

首先我们需要打开一个ArduinoIDE(ArduinoIDE就是一个集成开发环境,包括代码的编写,编译,上传,串口调试等等内容)

我们在编译环境里面最先要做的事情,就是先保存好这份代码文件,我一般都存在自己私人的文件夹。当然保存的路径尽量不要带中文,不然后IDE会识别不出来的。导致很多不必要的事情。

比如你可以保存在一个叫做E盘下面Arduino_code_Documents下的ElecFun_Arduino_U8glib_Oled12864这里面,当然这个路径是我演示的,

E:\Arduino_code_Documents\ElecFun_Arduino_U8glib_Oled12864

如果你文件夹下面没有这个文件,完全可以自己建一个来的,都以英文命名会是一个好习惯来的。

不过我们最后存的Arduino程序的命名要跟这个文件所在的文件夹同名,因为这是ArduinoIDE要求的。我们只要遵循就行了。

前期准备--库文件下载和硬件接线

我这里假设你已经下载好了,那我们就直接进入编程这步了,如果你还没有知道需要怎么下载,怎么把库放在ArduinoIDE的文件夹下面,请点击Arduino库文件的安装学习。

还有一个很重要的一点,就是Arduino 主控板和OLED接线的,如果你没有接好线,那么你可以看一下这篇文章--OLED12864和Arduino主控板(当然你如果手头上,不是12864也没有关系,因为OLED不同尺寸的接线都遵循一定的规则)

接线都有以下几种情况

1. I2C接线 (我得就是这种情况)

Arduino GND接OLED GND

Arduino 3.3V 接 OLED VCC 我的Arduino是Nano是3.3V系列

Arduino A4 接 OLED SDA

Arduino A5 接 OLED SCL

2. SPI接线 

3. 并行接线

如果你的跟我不同,那么你就需要参考一下Arduino和OLED接线方式查看你需要的接线方式,然后在程序里面选择你需要的初始化代码。或者直接询问你的购买商,获取更详细的接线信息。如果你最后还是没能接好线,请给我留言,我帮你看看。

如果你很擅长看文档资料,或者这些对你都是简单的事情,那么你就是一个动手能力很强的人,当然如果这些对你来说有点难,没有关系,多试几遍就能发现,这些都差不多一成不变的步骤。

软件代码分析

嗯,经过一番的努力,我想你已经把需要的前期工作准备好了,那么接下来,我们就开始使用U8glib库文件来点亮一个12864的液晶显示器。

接下来我们会演示一个简单的点亮OLED屏幕的程序

首先我们需要做的,当然就是把库文件引入进来,我们手动敲一行代码进入到这里,就像上面图片显示的那样

#include "U8glib.h" //这句话是把U8glib库包含到这个程序文件里面

我们可以根据自己实际的OLED显示器,取消需要的那行代码的注释就行了。比如我的是12864OLED是SSD1306驱动的,所以我这里就删除

//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

这行代码前面的//

这行代码告诉我们几个信息,其中一个就是屏幕尺寸是12864的,驱动IC是SSD1306,这个驱动IC一般装在屏幕里面,比较难找,使用的是I2C通讯。

我们在屏幕上画图,是靠坐标定位的,所以我们需要知道我们的坐标原点在哪里(下图取自U8glib的Github里面的介绍)

从上图可以看出,我们屏幕的左上角就是就是整个屏幕的原点了,记住这点很重要,因为我们接下来在代码里,要让图形或者文字显示在哪里,所参照的坐标就是这个左上角的原点了。

接下来,我们就在void loop() 里面添加一个picture loop

不管是其他的应用也好,首先就这样做吧

void loop()

{

// picture loop 

do {

    u8g.firstPage();

} while(u8g.nextPage());

delay(1000);

}

上面的

do {

while();

这样写,是想让Arduino一直处于图形绘制状态。

我们需要显示的图形将会在函数draw()里面。所以上面是固定结构来的,也就是无论你做什么开发,就按照上面那样子来就行了。我们需要做的就是在draw()里面画出我们需要的内容就好了。

比如我想在屏幕的正中间画一个圆,那么我需要做的就是先根据OLED的尺寸,确定128*64这块屏幕的正中间坐标就行了。

坐标(128/2,64/2)=(64,32)就是这个屏幕的中点了。等下我们画圆的时候会用到这个参数,接下来我们看看U8glib给我们画圆的方法。

这里我们使用U8glib的C prototype(C语言画圆函数原型)

voidu8g_DrawCircle(u8g_t*u8g,u8g_uint_t x0,u8g_uint_t y0,u8g_uint_t rad,uint8_t opt)

描述:在坐标(x0, y0)这里画一个半径为rad的圆,圆的直径是2*rad+1,另外这个取决于参数opt,我们可以在屏幕上只画出圆的一部分,可以作为opt参数的值有以下一些:U8G_DRAW_UPPER_RIGHT(这个参数只画出圆的右上1/4部分)

U8G_DRAW_UPPER_LEFT(这个参数只画出圆的左上1/4部分)

U8G_DRAW_LOWER_LEFT(这个参数只画出圆的左下1/4部分)

U8G_DRAW_LOWER_RIGHT(这个参数只画出圆的右下1/4部分)U8G_DRAW_ALL(这个参数只画出圆全部,函数默认是画出整个圆)

另外上面的参数可以使用操作符 | 进行组合使用。 

参数:

u8g: 指向u8g的数据结构(仅支持C接口,注意这里还有一个C++画圆函数原型,那里是没有u8g函数原型的)

x0,y0是圆的坐标

rad 是圆的半径

opt 的参数就是上面提到的那些,不选表示完整画出整个圆出来。

U8G_DRAW_UPPER_RIGHT

U8G_DRAW_UPPER_LEFT

U8G_DRAW_LOWER_LEFT

U8G_DRAW_LOWER_RIGHT

U8G_DRAW_ALL

return: 这个函数没有返回值

这个函数在Picture loop 里面使用,举例:

u8g.drawCircle(20,20,14);


u8g.drawCircle(20,20,14,U8G_DRAW_UPPER_RIGHT);

得到下面的图形:


接下来我在我的函数里面在写一些代码:

void draw()

{

  u8g.drawCircle(64,32,10);

}

到此,所有的编程工作完成了,你可以在这里下载完整的代码,尽量不要拷贝我这里面的代码,毕竟拷贝的话,难免会出错,所以直接下载我的代码,然后在你的编译器里面编译就好了。


外部参考资料

U8glib wiki资料 里面能告诉你很多关于硬件接线,代码的使用等等

U8glib in Google Code 访问这个页面需要翻墙,否则无法阅读

U8glib 使用手册查询 英文 需要翻墙使用,里面能够让你了解到很多U8glib库里面的方法和函数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容