牟晓东
PinPong库是一个可用于连接硬件设备进行编程的Python库模块,在开源硬件编程中可适用于Arduino、虚谷号、micro:bit、掌控板、树莓派等常见的开发板。只须在Python编程环境中对初始化语句中的参数进行修改即可。比如在ArduinoUNO中的初始化语句是“Board("uno").begin()”,若换成掌控板则修改为“Board("handpy").begin()”。只要所使用的传感器连接正确的话,Python编程代码几乎不必做改动就能够在各种开发板之间进行“无缝”跨平台移植,实现相同的功能。下面以掌控板为例,连接上雨水传感器和火焰传感器,通过Mind+环境中的Python编程调用PinPong库来制作一个水火情警报器。
实验器材包括:掌控板和扩展板各一块,FC-37雨水传感器一个,火焰传感器一个,各种杜邦线若干。首先,将掌控板正确插入至扩展板中,注意二者的金手指面要紧密接触好;接着,将雨水传感器的VCC、GND和AO(模拟数据输出端)分别通过红色、白色和绿色杜邦线连接至扩展板的P0引脚组的+、-和P端,注意不是连接DO(数字信号输出端);类似的连接方式,再将火焰传感器的VCC、GND和DO分别通过红色、白色和黄色杜邦线连接至扩展板的P1引脚组的+、-和P端;最后,通过数据线将掌控板与电脑的USB口进行连接(如图1)。
运行Mind+,切换至“代码”、“Python模式”,再点击右上角的“库管理”项查看是否之前已经安装过PinPong库,确保“硬件控制”区域中的“pinpong”项后面按钮显示为“已安装”。
开始在左侧的代码主编辑区进行编程。
首先,进行相关库模块的导入,包括导入时间库:“importtime”、导入PinPong库中的开发板及引脚类:“frompinpong.boardimportBoard,Pin”、导入掌控板扩展设备:“frompinpong.extension.handpyimport*”。接着,初始化掌控板:“Board("handpy").begin()”,再对P0和P1两个引脚分别进行电平输入的模拟数据和数字数据的初始化设置:“P0_pin=Pin(Pin.P0,Pin.ANALOG)”、“P1_pin=Pin(Pin.P1,Pin.IN)”(如图2)。
接下来进行函数的自定义,包括控制掌控板正面三颗LED灯的亮与灭、OLED显示屏分别进行“水情预警!”和“火情预警!”文字提示共两组(四个)函数。
第一组控制LED灯的亮与灭函数分别是lights_on()和lights_off(),每个函数均是通过设置RGB值来控制三颗LED灯的发光颜色,其中的rgb[0]、rgb[1]和rgb[2]则分别对应LED灯的序号,在lights_on()函数中通过“rgb[0]=(255,0,0)”、“rgb[1]=(0,255,0)”和“rgb[2]=(0,0,255)”三行语句分别设置三颗LED灯的发光颜色为红色、绿色和蓝色(其中的数字255若改为127则表示对应颜色的发光强度降低为50%);而在lights_off()函数中,三颗LED的RGB值均设置为0,表示不发光(即熄灭状态);最后,再通过“rgb.write()”语句使其生效(如图3)。
第二组控制OLED显示屏提示“水情预警!”的water_alert()函数和“火情预警!”fire_alert()函数代码类似,以water_alert()函数为例,先通过语句“oled.DispChar('水情预警!',32,16)”来设置文字提示信息的内容显示及坐标,再通过语句“oled.show()”使OLED显示屏生效,并且添加时间等待语句“time.sleep(3)”,作用是控制文字信息的显示提示时间为3秒钟;接下来,语句“oled.fill(0)”的作用是将低电平输出至OLED屏,满屏均为黑色,最终也仍需添加语句“oled.show()”使显示生效(如图4)。
最后編写“whileTrue”循环主程序:建立变量water_value,为其赋值为“P0_pin.read_analog()”,作用是读取雨水传感器所获取的检测数据(AO模拟端);建立变量fire_value,赋值为“P1_pin.value()”,作用是读取火焰传感器所获取的检测数据(D1数字端);再通过两个print()语句将检测的数据信息在电脑屏幕上显示输出:“print("水信号的检测(模拟)数据为:",water_value)”、“print("火信号的检测(数字)数据为:",fire_value)”;建立第一个if条件分支结构,其判断为“water_value<1000”,因为通过测试发现雨水传感器的检测板在“无水”时的输出值为1040左右,而“有水”时的输出值为960左右;若该条件成立,说明检测到“有水”,则分别执行亮灯函数lights_on()、水情预警函数water_alert()和灭灯函数lights_off();第二个if条件分支结构类似,只是判断条件修改为“fire_value==0”,因为通过测试发现火焰传感器在“无火”时的输出值为1(“有火”则为0),条件成立则执行亮灯函数lights_on()、火情预警函数fire_alert()和灭灯函数lights_off();最后,为循环结构添加0.3秒钟的时间等待语句“time.sleep(0.3)”(如图5)。
将程序保存,点击右上角的“运行”进行测试:在“无水”、“无火”的正常情况下,掌控板的LED灯不发光,OLED屏也不显示任何信息,电脑程序下方的“终端”处每隔0.3秒会显示一组水与火信号的检测数据;当在雨水传感器的检测板上滴几滴水时,三颗LED灯发光,同时在显示屏上出现“水情预警!”的提示,直至将水滴擦除才会解除灯光和文字警报;当在火焰传感器附近点燃打火机时,LED灯发光,显示屏提示“火情预警!”,直至熄灭打火机才会解除警报。