使用BlueFi的LCD显示器

BlueFi配置有一个240x240点阵的1.3英寸彩色LCD显示器,这个小显示屏的点阵密度几乎接近视网膜屏,即使采用很小的字体的情况下仍保持 字符和图案的清晰度。BlueFi处于Bootloader模式时,显示屏自动关闭。进入Python模式时,执行code.py或main.py程序时,BlueFi的 LCD显示器由用户程序掌控,停止Python代码执行或进入REPL模式,这个显示屏与串口控制台几乎完全同步。

BlueFi的LCD显示器主要有以下几种用法:


1. 作为用户程序的一种输出设备

这个模式下,只要code.py或main.py程序启动时,屏幕会显示一行提示:“code.py output:”(或 “main.py output:”),提醒我们 屏幕的内容都是由code.py或main.py执行结果。譬如,我们编写一个最简单的程序:

1
2
 print("hello world")
 print("i'am BlueFi")

将这个输出两行文本到控制台的脚本程序保存到/CIRCUITPY/code.py文件,如果BlueFi已经与宿主计算机上MU编辑器链接好,点击“串口”按钮, 你在串口控制台的窗口中将会看到以下提示信息:

Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.

code.py output:

hello world

I’m BlueFi

Press any key to enter the REPL. Use CTRL-D to reload.

“Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.”这一行信息提示我们,BlueFi开始自动 加载用户程序(code.py),禁用REPL; “code.py output:”这一行信息表示,开始执行code.py程序,启动code.py程序时,BlueFi的Python解释器自动给出的提示信息; “hello world”和“I’m BlueFi”是我们编写的code.py程序中的两个语句所输出的结果; “Press any key to enter the REPL. Use CTRL-D to reload.”这一行信息表示,code.py程序已经执行完毕,按任意键进入REPL模式, 按“Ctrl+D”键重新执行code.py程序。

你在BlueFi的LCD屏幕上也能看到这些信息,而且完全相同。通过这个示例我们看到,BlueFi的LCD显示器相当于一个小型控制台,用户程序“print(“xxx”)” 的输出都被作为一整行显示出来,如果文本内容超过一行,并自动换行继续显示。当开始启动用户程序或执行完毕后,系统的提示信息也被显示在LCD上。

我们再来看另外一个示例,Python脚本程序如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
 # 从adafruit_turtle中导入turtle画笔模块和颜色模块
 from adafruit_turtle import Color, turtle
 # 从hiibot_bluefi的screen子模块中导入Screen模块
 from hiibot_bluefi.screen import Screen
 # 实例化Screen模块类为screen
 screen = Screen()
 colors = [Color.ORANGE, Color.PURPLE]
 # 实例化turtle画笔为turtle, 并使用screen作为显示器
 turtle = turtle(screen)
 # 落笔
 turtle.pendown()
 # 循环200次
 for x in range(200):
     turtle.pencolor(colors[x % 2])
     turtle.forward(x)
     turtle.left(91)

 while True:
     pass

看起来这个示例程序蛮长,其实并不复杂,尤其你如果使用过Scratch的画笔模块、Python的turtle模块,这里所用的turtle模块用法几乎与他们完全相同。 当然这个时候我们并不关心程序的具体细节。将程序代码复制到MU编辑器中,并保存到/CIRCUITPY/code.py文件中,等待几秒看BlueFi的LCD屏幕输出就可以。

在这个示例中,我们看不到系统的提示信息,只是看到code.py程序的执行结果:在LCD屏幕上绘制了一个彩色图案。这是因为本示例的第6行程序将BlueFi的 LCD显示器当作turtle画笔的输出设备使用,画笔程序绘制的几何图案被显示在LCD屏幕上,但系统提示等文本信息就不会显示在这里。

如果你将程序的最后两行(第18行和第19行)删除了,包保存到/CIRCUITPY/code.py文件,再观察执行结果的屏幕显示是什么内容?你认为这是什么原因?


2. 输出脚本程序的错误信息

脚本程序的执行过程是“逐行执行并输出结果”的串行模式。如果我们编写的一个10行的脚本程序,前5行程序没有任何错误,第6行程序有一个拼写错误。执行 这个脚本程序的效果是,执行到第6行包含拼写错误的语句时,脚本解释器无法执行,于是直接终止程序执行,并输出错误信息的提示,无论第7~10行程序是否 正确都不会被执行。

以下面程序为例,复制下面代码到MU编辑器中,并保存到/CIRCUITPY/code.py文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
 from adafruit_turtle import Color, turtle
 from hiibot_bluefi.screen import Screen
 screen = Screen()
 colors = [Color.ORANGE, Color.PURPLE]
 turtle = turtle(screen)
 turtle.pen()
 for x in range(200):
     turtle.pencolor(colors[x % 2])
     turtle.forward(x)
     turtle.left(91)

第6行程序的正确拼写为“turtle.pendown()”,但是上面程序中被我们错误拼写为“turtle.pen()”。BlueFi在执行这个包含错误拼写的程序时,会出现以下 提示:

Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.

code.py output:

Traceback (most recent call last):

File “code.py”, line 6, in <module>

AttributeError: ‘turtle’ object has no attribute ‘pen’

Press any key to enter the REPL. Use CTRL-D to reload.

显然,第4和第5行提示信息中已经明确地告诉我们错误的语句是第几行,错误的原因是turtle对象没有pen这个属性。

BlueFi的LCD显示器虽然很小,但是作用很大!尤其执行Python脚本程序的过程中,动态地加载和执行一些存在错误的模块,终止脚本程序的执行,并提示 发声错误的位置和错误原因,很容易帮助我们排查错误。如果没有这样的显示和提示机制,程序被终止后编程者就很难定位问题。任何时候,只要用代码编写 程序,各种各样的错误是难免的,如果能快速地定位问题,编写代码、调试程序的效率将大大地提升。