大家好,上次讲到使用直接写入显示存储区(GRAM)的方式来绘制图形,今天讲解另一种更简单的方式绘图。
使用绘图库:
上次,我们直接将显示数据写入SSD1306的显示存储区(GRAM)中来显示图形,由于SSD1306的GRAM组织方式非常怪异,因此,编程显得非常复杂。令人庆幸的是,microPython官方的SSD1306库内部引用了一个简单的图形库,因此使我们摆脱直接操作GRAM的厄运。这个图形库名为FrameBuffer。
其官方参考文档:http://docs.micropython.org/en/latest/library/framebuf.html
此库中部分绘图函数之前已经接触过了,例如上次我们用来显示字符串的函数:
还有之前,我们清除屏幕显示,也是使用这样的库:
简单的讲一下,这个库在内部创建了一个和屏幕像素同等大小的存储区,我们显示或绘制图形分两个步骤:
1 绘制图形(如text(),fill()等),数据实际上是写入到内部的存储区中,实际的OLED屏并未发生任何改变。
2 调用show()函数,将内部存储区的内容整个替换掉OLED屏的显示。
当我们实例化了SSD1306设备后,就可以直接使用这些绘图函数了。下面列出支持的绘图函数(我们以oled为实例化后的名称):
做个测试程序如下:
显示结果:
然鹅这还不够,如果我们需要绘制其他图形怎么办?比如绘制圆形?下面,我来给大家演示一下自建绘图函数。
自建绘图函数:
比如,我们要建立一个绘制圆形的函数,这需要一些数学知识,如下图:
思路:绘制圆形时,我们需要将圆形上的每一个点的坐标计算出来,再用pixel(x, y, c)函数一个点一个点的绘制,就形成圆形。
假设绘制一半径为r的圆形,圆心坐标O(Ox, Oy),其圆弧上任意一点A坐标(Ax, Ay),则Ax,Ay的计算公式如下:
Ax = Ox + r * cos(?)
Ay = Oy + r * sin(?)
在python中,三角函数包含在math库中,那么,绘制圆形的函数如下:
首先,我们按照0 - 360度,步长为1度(range(360)),分别计算每1度的A点坐标,并绘制出来。
下面是完整的程序:
注意,调用drawCircle()只是在内存区中绘制了圆形,并没有传输到显示屏中,需调用show()函数,才真正将显示数据发送到显示屏中。
如果,我要绘制一个填充的圆形怎么做,其实很简单,上面我们计算出圆周上的A点后,绘制一条由圆心O到A点的直线,想象一下,直线OA绕圆心一圈,就形成实心圆了。定义的函数如下:
显示结果,一双眼睛:
至于其他图形绘制,比如弧形的绘制等,大家可自行定义了。
至此,绘制图形的进阶部分就全部讲完了,最后,给大家出一道有意思的作业,前面我们绘制了一双眼睛,你是否能够将它和加速度计结合起来,编一个程序,实现按照重力的方向转动眼睛。
希望诸位玩得愉快。请继续关注:创客DIY乐园(MakerDIY-Park),您的关注就是我前进的动力。