开启Arduino的Python之旅
2023-01-10牟晓东牟奕炫
牟晓东 牟奕炫
借助PinPong库,我们用Python编程能控制其“显示”输出——向我们展示各种数据信息,包括从传感器获取的数字或模拟数据、程序运行的结果数据以及根据所设定的条件进行文字提醒等等。以常见的OLED显示屏、四位数码管以及1602LCD液晶显示屏为例,在Arduino 中进行Python编程,分别进行烟雾监测数据的显示与提醒、双按钮半自动比赛计分显示和声光数据的同步显示三个创客实验项目测试。
1.OLED12864屏
用Arduino UNO一块,小型面包板一块,OLED12864显示屏一块,MQ-2烟雾传感器一个,杜邦线若干,打火机一个,实现显示烟雾传感数据及提示。
将OLED显示屏和烟雾传感器的四个引脚插入面包板;用橙色和白色杜邦线分别将Arduino 的5V 和GND与面包板的红色和蓝色侧边电源连接,再用两对橙色和白色杜邦线分别将OLED 显示屏和烟雾传感器的VCC、GND连接至面包板的侧边电源;用黄色杜邦线将烟雾传感器的AO模拟数据输出端与Arduino的A0模拟端连接;用红色和绿色杜邦线将OLED显示屏的SCL、SDA端与Arduino 的SCL、SDA引脚连接;最后,通过数据线将Arduino与电脑的USB端口连接(如图1)。
在电脑端进入Python IDE编辑界面开始编程:
导入相关的库模块:“importtime”“from pinpong.board importBoard,Pin,ADC”“from pinpong.libs.dfrobot_ssd1306 import SSD1306_I2C”; 接着, 初始化Arduino 板:“Board("uno").begin()”, 再初始化OLED 显示屏:“oled=SSD1306_I2C(width=128, height=64)”, 屏幕的像素点数为横向128、纵向64;建立变量Smoke Sensor,为其赋值为“ADC(Pin(Pin.A0))”, 作用是设置烟雾传感器通过Arduino 的A0端进行模拟输入。
在“while True”循环主体部分,先建立变量SmokeSensor_Value,赋值为“SmokeSensor.read()”, 作用是读取A0 模拟端的数据,再通过print()语句在电脑屏幕端将该数据输出:“print("Smokevalue:", SmokeSensor_Value)”;接着,通过oled.text("Smoke value:",8,8)”和“ oled.text (Smoke Sensor_Value,60,23)”语句,作用是在OLED显示屏对应的坐标位置点显示输出文字提示及变量SmokeSensor_Value 的值,后面的语句“oled.show()”作用是将显示内容生效;然后建立一个if 条件分支结构,判断条件是“SmokeSensor_Value>=100”,因为经测试后发现,正常情况下MQ-2烟雾传感器在Arduino的A0端输出数据均在100以内,当打火机燃气进入其检测范围时,该数据会增加;当该条件成立时,表示检测到有危险气体泄漏,则控制OLED显示屏先显示“Alert!!!”警示信息并持续3 秒钟,再将该警示信息“擦除”,擦除方法是用若干个空格覆盖之前的提示,注意别忘了显示生效语句;最后,为整个循环结构添加一个0.5秒的等待(如图2)。
將程序保存为“OLED 屏显示烟雾数据及警示提醒.py”,按F5 功能键运行程序进行测试:正常情况下,OLED 显示屏显示“Smoke value:” 和“37” 两行信息,并且每隔0.5 秒钟就会刷新显示一个近似范围的数据;当尝试用打火机靠近烟雾传感器并释放可燃气体时,很快就会在OLED 显示屏上出现有“Alert!!!”的警示信息,中间的数据也显示为219、182 之类的较大数据;直至移走打火机后,烟雾传感器监测到的数据又会恢复至37、35、33,OLED显示屏上的“Alert!!!” 警示信息也随之消失。同时,在整个测试过程中,电脑屏幕上也会同步显示“Smokevalue:219”等提示信息(如图3)。
2.四位数码管
用Arduino UNO 一块,小型面包板一块,四位数码管一个,绿色和白色按钮各一个,杜邦线若干,实现双按钮半自动计分器。
在上个OLED 显示屏实验的基础上,先拆除OLED显示屏、烟雾传感器和一部分杜邦线,保持Arduino 与面包板间的电源及接地连通;接着,将四位数码管插入之前OLED显示屏的位置,用橙、白杜邦线将VCC和GND端与面包板的侧边红色电源、蓝色接地相连,数码管的SCL 和SDA端分别通过红、蓝杜邦线与Arduino的SCL、SDA 引脚连接;然后,在数码管的左右两侧分别插入绿色和白色按钮,两个按钮的VCC和GND端均通过一对橙色和白色杜邦线连接至面包板的侧边红色电源、蓝色接地;绿色按钮的OUT 信号连接至Arduino 的7 号引脚,白色按钮的OUT 信号输出端连接至Arduino 的8号引脚(如图4)。
导入“time”“Board,Pin”“TM1650”库; 初始化Arduino 板, 初始化四位数码管; 建立变量CurrentScore, 赋值为“"00.00"”, 类型为字符串型数据,再将变量CurrentScore 存储的字符串显示在数码管上,长度为五位的字符串中间的小数点会对应点亮数码管中间的冒号(:); 建立变量ButtonGreen 和ButtonWhite,分别赋值为“Pin(Pin.D7,Pin.IN)”和“Pin(Pin.D8, Pin.IN)”,作用是初始化连接在7 号和8 号引脚的绿色与白色按钮,设置为信号输入端。
在“while True” 循环主体部分, 建立变量ButtonGreen_value 和ButtonWhite_value 并赋值, 作用是读取对应引脚的电平数据,按钮未按下时为0, 按下则会触发产生1;接着,建立if 条件选择结构, 当电平为1 时判断按钮被按下。条件成立则将变量CurrentScore 的值显示在数码管上。建立变量LeftTwo 和RightTwo并赋值。对应从变量CurrentScore 所存储的五位长度字符串数据的首尾两端截取前两位和后两位,注意先截取出的两位数据CurrentScore[:2] 和CurrentScore[-2:]均为字符串,需先使用int()函数转换为整数再与按钮的状态值(ButtonGreen_value 或ButtonWhite_value)进行算术加法运算,再使用str()函数将结果重新转换成字符串型数据;接下来,对于新的计算结果LeftTwo 和RightTwo 要分别进行“长度是否为1”的if 条件判断,条件成立,说明对应的比分是十以内的个位数,要在其左侧进行字符串“补0”;接着,重新构建生成变量CurrentScore的值,包括左侧两位字符(LeftTwo)、中间的小数点字符('.') 和右侧的两位字符(RightTwo):“LeftTwo + '.'+ RightTwo”; 最后, 通过语句“tm.display_string(CurrentScore)”, 将新的比分数据显示在数码管上,为整个循环添加0.2 秒等待(如图5)。
保存并运行测试:四位数码管应显示比分为00:00,按一次绿色、按两次白色按钮,比分应变为01:02,然后还需测试十位数控制显示是否正常(如图6)。
3.1602LCD
用Arduino UNO一块,小型面包板一块,1602LCD液晶显示屏一块,声音传感器和光线传感器各一支,红色LED 灯一支,杜邦线若干,实现声音与光线数据的同步顯示。
将声音传感器和光线传感器各自的VCC、GND与Arduino的5V和GND相连,将二者的AO 模拟输出引脚连接至Arduino的A0和A1模拟输入引脚;1602LCD的VCC 和GND引脚连接面包板的红色和蓝色电源,将SCL和SDA引脚与Arduino的SCL和SDA引脚相连;在Arduino 的13 号引脚处插入红色LED灯的正极(长),负极(短)插入相邻的GND引脚(如图7)。
导入库;初始化Arduino 板;设置13号引脚的红色LED灯为数字信号输出端,建立变量SoundSensor 和LightSensor并赋值, 将A0和A1模拟引脚的声音和光线传感器设置为模拟输入方式;对1602LCD液晶显示屏初始化,I2C 地址为0x27、打开显示背光,清屏。
在循环主体部分, 建立变量SoundSensor_Value并赋值, 用来读取声音传感器的模拟数据;在第一组语句中,先设置LCD的光标位置为第一行第0个字符处,显示字符串“Sound:”;再设置LCD的光标位置为(6,0),显示变量SoundSensor_Value的值;类似地,第二组语句是对光线传感器所监测的模拟数据进行读取和显示,注意LCD 光标要变为(0,1)和(6,1)对应第二行;接着,建立if 分支结构,如果声音值大于24且光线值大于100(声音传感器和光线传感器监测的数据越大,表示环境光线越暗、声音强度越大),则控制LED 灯发光并持续10 秒钟;为循环添加0.5 秒等待,最后关闭LED 灯(如图8)。
保存并运行测试:LCD液晶显示屏应显示两行实时信息, 如“Sound:24Light:84”。尝试鼓掌改变声音数值,盖住光敏电阻改变光线值,看是否达成有声音光线又暗这两个条件时,LED 灯发光并持续10秒的目标。测试任一条件不成立时LED灯熄灭。
如果只有背景光,看不到信息,可试着用螺丝刀调节显示屏背面的蓝色对比度调节旋钮。