简介
这边文章将会演示的是使用一个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库里面的方法和函数
网友评论