美文网首页arduino书与创造我爱编程
ElecFun--Arduino--OLED12864和U8gl

ElecFun--Arduino--OLED12864和U8gl

作者: wayen_gogogo | 来源:发表于2015-12-13 10:01 被阅读4012次

    简介

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

    相关文章

      网友评论

      • Luat物联网通信模块:可以关注下Luat开源项目,基于Air200 GPRS模块(价格才12块多),基于Lua开发应用软件,超级容易上手。

      本文标题:ElecFun--Arduino--OLED12864和U8gl

      本文链接:https://www.haomeiwen.com/subject/xvzyhttx.html