OLED+U∞G2,原来单片机的屏幕也可以如此炫
据说2016年是OLED元年,两年过去了,超薄电视、显示器越来越受欢迎,不过LCD也还健在,当然也不必再去挖掘那些喜欢玩VFD的极客们对VFD的钟爱之情了!
OLED显示屏是利用有机电致发光二极管制成的显示屏。由于同时具备自发光有机电激发光二极管,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
不过在嵌入式开发中,给MCU等设备连接一个小型的OLED,来显示一些简单的信息如IP地址、温湿度等等,也是应有之义。市面上各种OLED从接口、尺寸等来区分,确实种类繁多,刚好最近入手来自Seeed Studio的小OLED一枚,来好好体验一把,真正的近距离!
这款OLED模块使用标准的GROVE接口,以I2C的方式与MCU通信。GROVE OLED DISPLAY 1.12英寸模块实际上有两款型号,一款使用的是SSD1327,另一款使用的是SH1107G,这一款模块使用的是SH1107G。可惜的是,SH1107G这一款相比SSD1327来说,少了一些有兴趣的特性,例如不支持灰度显示,也不支持连续水平滚动。
据官方的文档,V1.0应该使用的是SSD1327主控,可惜实验时发现却是使用的是SH1107G的主控,不解!再有就是官方文档中也没有SH1107版的详细文档。
关于OLED和LCD的比较,也小小的学习一下。
OLED的许多优势,因为自发光,所以省电。OLED的色彩很漂亮、色域很广,所以一直很喜欢晒他那NTSC 100%的颜值,不过今天的主角是黑白的,所以不晒也罢。另外其它的一些特性如高对比度,广视角等特性,在黑白世界里也不怎么突出,所以听过了就听过了,一切都是浮云!
模块使用I2C接口来通信,I2C结构简单,只要两根线,通信速度也勉强应付,所以很多对速度要求不高的设备都喜欢用I2C接口,至于对速度有要求的伙伴,可能更喜欢SPI。
接下来开始体验显示模块,需要两方面的准备工作:准备与之通信的MCU;选择一套合适的GUI库。综合考虑下来,选择Arduino做为硬件,选择U8G2做为GUI库似乎是个挺不错的主意。Arduino资料丰富,简单易上手,而U8G2也有配套的Arduino支持库。
如果手头有GROVE Arduino扩展板,连接起来很方便,没有的话也不影响,使用杜邦线也可以很快连接好设备,如图
官方为之提供了配套的Arduino库,下载并安装好后,可以在Examples目录下找到对应的示例程序。OLED的分辨率为128X128,用来显示一些简单的文字或LOGO还是比较宽裕的。
打开OLEDDrawBitmap这个程序,编译并将代码上传到Arduino开发板,看到的显示效果如下
镜头下的LOGO图像略显生硬,实际上显示效果还是不错的。
GROVE OLED DISPLAY提供的演示代码还包括数字,英文字符的显示等,没有提供中文处理,不过使用简单的画点代码,结合点阵字库可以轻松实现中文的显示,这里不赘述,因为接下来我们要使用更强大的U8G2库来显示更复杂的内容,当然也包括中文的显示。
U8g2是非常一个非常强大的库,是U8GLIB的升级版本,其主工功能包括:大量驱动芯片及不同分辨率的支持,这就让用户几乎不必关心底层驱动的部分,只需要写自己的程序就可以了,要知道底层驱动的调试比较费时间的;不同连接方式支持,可以支持硬件SPI、软件SPI及8位并行控制方式等;支持Arduino、AVR及ARM等不同芯片,CPU升级时,移植代价比较小;大量字体显示支持,包括CJK等文字的支持,同时也提供了实用工具来帮助用户建立自己的字库文件。
这是中英文字符的显示方式,代码简单到不可思议,如下
显示中文的奥秘隐藏在setFont函数调用中,使用中文字库可以轻松显示中文内容。然而问题来了,中文字库这么庞大,以Arduino的存储空间来说,实在是太小了。好在U8G2提供了实用工具来帮助用户建立自己的中文字库,可以参考U8G2的帮助文档来实现。
这是U8G2的LOGO显示效果,这不是现成的图像,而是使用U8G2的绘图函数一笔一笔画出来的!
越是使用U8G2,越是觉得顺手!而这一切都是开源的,老衲也在想,是不是也整个啥蓝芯啥的,打上自主研发的标签,先实现一个小目标,赚它一个亿?(梦醒!)
还在点灯?
现在只需要点几下鼠标,写几行代码,炫人的画面就跃然屏上,老衲已按捺不住,偷偷的从MOUSER上订了一个GROVE OLED DISPLAY,还有Arduino,要正版的!