APP下载

开启Arduino的Python编程之旅

2022-11-25

电脑报 2022年44期
关键词:灯珠灯带杜邦

在上期的“开启Arduino的Python编程之旅——基础篇”中,我们在Arduino中通过调用PinPong库使用Python编程,分别实现了“数字输出:闪烁的LED灯”“数字输入:按钮控制LED灯亮与灭”“模拟输入:打印输出滑杆传感器的位置数据”和“模拟输出:PWM模式控制LED灯的明暗程度均匀变化”四个开源硬件编程项目案例;在本期的“常规篇”中,我们尝试在Arduino上连接温湿度传感器、光线传感器、超声波传感器和WS2812灯带等外设,同样是调用PinPong库进行Python编程,制作实现四个不同效果的经典项目案例。

首先,将DHT11温湿度传感器的VCC和GND引脚分别通过红色、黑色杜邦线连接至ArduinoUNO的3.3V和GND引脚,再将DAT引脚通过黄色杜邦线连接至Arduino的6号引脚(如图1)。

打开PythonIDE进入编辑界面开始编程,仍需要先导入库模块及相关的类:“import time”“from pinpong.board import Board,Pin,DHT11”,如果使用的是DHT22温湿度传感器,此处需更改为“from pinpong.board import Board,Pin,DHT22”;初始化ArduinoUNO:“Board(“uno”).begin()”,再建立变量dht11,赋值为“DHT11(Pin(Pin.D6))”——若为DHT22则同样作类似的修改,比如连接引脚使用7号,对应的命名均为“DHT22”,即“DHT22(Pin(Pin.D7))”;接下来,在“while True”循环结构中建立变量my_temp和my_humi,分别赋值为“dht11.temp_c()”和“dht11.humidity()”,作用是读取对应的摄氏温度值和湿度值;然后,通过“print(“现在的室温是:”,my_temp,“℃,湿度为:”,my_humi)”语句将温度值和湿度值进行打印输出;最后,添加时间等待语句“time.sleep(3)”,作用是控制每次循环读取及显示温度和湿度的持续时间为3秒(如图2)。

將程序保存为“【01】读取并显示即时室温及湿度.py”,再将Arduino通过数据线与电脑连接,运行程序进行测试。屏幕上开始出现第一条显示输出:“现在的室温是:22.1℃,湿度为:70.0”,此时尝试使用打火机模拟火源在一定范围内靠近DHT11温湿度传感器(或者用手掌握住),静置一段时间,屏幕上每隔5秒钟就会显示一行提示信息,温度值和湿度值均有不同程度的变化,比如温度值会从最初的22.1 ℃升高至26.7 ℃(如图3)。

从Arduino上拆下DHT11温湿度传感器,换用光线传感器来实现根据周围环境的光线强度来控制LED灯发光。首先将光线传感器的VCC和GND端通过红色和黑色杜邦线连接至Arduino的3.3V和GND接地端,再将模拟信号输出AO端通过黄色杜邦线连接至Arduino的A0引脚;然后,将一支红色LED灯的长、短引脚分别插入Arduino的13号及相邻的GND端(如图4)。

先导入库模块及相关的类并进行Arduino主板的初始化:“import time”“from pinpong.board import Board,Pin”“Board(“uno”).begin()”;然后建立my_LED和my_adc两个变量,分别赋值为“Pin(Pin.D13,Pin.OUT)”和“Pin(Pin.A0,Pin.ANALOG)”,作用分别是将连接在13号引脚的LED灯设置为数字输出、将连接在A0引脚的光线传感器设置为模拟输入;接下来,在“while True”循环结构中建立变量my_light,赋值为“my_adc.read_analog()”,作用是从A0引脚读取模拟数据,即光线传感器检测到的周围环境光线值;通过“print(“现在检测到的光线值是:”,my_light)”语句将光线数据在屏幕上打印输出后,再通过“if (my_light>=400)”对my_light的值进行是否“大于等于400”的判断,条件成立的话,说明周围环境的光线比较暗,则分别执行“print(“LED灯工作中…”)”和“my_LED.value(1)”,控制LED灯发光;条件不成立,则熄灭LED灯:“my_LED.value(0)”;最后,添加时间等待语句“time.sleep(0.5)”,控制每次循环读取光线传感器数据的持续时间为0.5秒钟(如图5)。

将程序保存为“【02】根据光线强度控制LED灯是否发光.py”,运行程序进行测试,屏幕上每隔0.5秒钟显示输出一个检测到的光线值:122、141、67……此时对应的是白天正常的照明情况;尝试用一只黑盒子盖住光线传感器的光敏电阻,检测到的光线数据就变成528、557、555……LED灯也开始亮起来,同时屏幕上也有“LED灯工作中…”的提示;如果再撤掉盖住光线传感器模拟黑暗环境的黑盒子,检测到的光线值就会重新恢复为较小的数值,LED灯也熄灭(如图6)。

保持LED灯插接在13号引脚不变,将光线传感器拆下,开始安装SR04超声波传感器(也可以使用精度更高的URM超声波传感器):先分别通过红色和黑色杜邦线将超声波传感器的VCC和GND端连接至Arduino的5V和GND接地端(如果接3.3V端有可能工作不正常),再通过黄色和绿色杜邦线将超声波传感器的Trig信号发射端、Echo信号接收端连接至Arduino的7号和8号引脚(如图7)。

先导入库模块及相关的类并进行Arduino主板的初始化:“import time”“from pinpong.board import Board,Pin,SR04_URM10”“Board(“uno”).begin()”;然后建立变量my_LED,仍赋值为“my_LED = Pin(Pin.D13,Pin.OUT)”;再建立TRIGER_PIN和ECHO_PIN两个变量,分别赋值为“Pin(Pin.D7)”和“Pin(Pin.D8)”,作用是设置超声波传感器的信号发射端和接收端的引脚分别为7号和8号;建立变量sonar,赋值为“SR04_URM10(TRIGER_PIN,ECHO_PIN)”,作用是初始化SR04超声波传感器(将对应的引脚编号作为参数传递进去);接下来,在“while True”循环结构中建立变量my_dis,赋值为“sonar.distance_cm()”,作用是获取超声波传感器的检测距离值(单位为厘米);再通过“print(‘距离前方障碍物的间距为:{0:.2f} cm’.format(my_dis))”语句,将数据在屏幕上打印输出;然后通过“if (my_dis<=10)”对间距值进行“是否小于等于10”的判断,条件成立的话,则先在屏幕打印输出“注意安全,间距已不足10cm!”的警告信息,再控制LED灯发光:“my_LED.value(1)”;条件不成立,则关闭LED灯:“my_LED.value(0)”;最后,仍然是为循环结构添加0.1秒钟的时间等待语句“time.sleep(0.1)”(如图8)。

將程序保存为“【03】超声波测距和LED灯光报警.py”,运行程序进行测试:超声波传感器每隔0.1秒钟就会检测获取一个与前方障碍物的间距值:35.00cm、14.00cm、11.00cm……当放置的模拟障碍物距离足够近时,屏幕输出的提示信息变为:“距离前方障碍物的间距为:9.00cm”“注意安全,间距已不足10cm!”此时的LED灯也会发光进行报警;直至移走障碍物,LED灯熄灭,又会恢复正常的监控状态(如图9)。

将超声波传感器和LED灯从Arduino上拆下,开始安装WS2812灯带:通过红色和白色杜邦线将灯带的+5V和GND端分别连接至Arduino的5V和GND接地端,再将灯带的DO端通过绿色杜邦线连接至Arduino的9号引脚(如图10)。

先导入库模块及相关的类:“import time”“from pinpong.board import Board,Pin,NeoPixel”(其中的NeoPixel类对应WS2812灯带),再从random随机库中导入随机取整函数randint:“from random import randint”;接着,进行Arduino主板的初始化:“Board(“uno”).begin()”;建立变量NEOPIXEL_PIN,赋值为“Pin(Pin.D9)”,即灯带的信号引脚是与Arduino的9号引脚相连;再建立变量PIXELS_NUM,赋值为60,对应标准WS2812灯带的60个灯珠,每个灯珠均相当于一颗RGB微型LED灯;再建立变量my_np,赋值为“NeoPixel(NEOPIXEL_PIN,PIXELS_NUM)”,将灯带的引脚号和灯珠数量作为参数传递进去;在“while True”循环结构中建立for内层循环,对编号为0-59共60个灯珠进行随机颜色的“赋值”;my_red、my_green和my_blue三个变量的值均被赋为“randint(0,255)”(从0至255中随机取整),再通过“my_np[i] = (my_red,my_green,my_blue)”语句,实现为每个灯珠设置红色、绿色和蓝色三种随机颜色的目的;最后,添加0.001秒钟的时间等待语句:“time.sleep(0.001)”,控制相邻两个灯珠每次进行颜色切换的时间差(如图11)。

将程序保存为“【04】随机颜色炫彩灯带.py”,运行程序进行测试:灯带很快就从第0颗灯珠开始亮起,接着就会快速亮起第1颗、第2颗……每颗灯珠亮起显示的均为随机颜色;第一次循环(内层嵌套的for循环)结束后,第二次循环立刻运行,将上一次循环所设置的随机颜色“覆盖”并重新亮起一种新的随机颜色,这样我们就得到了随机颜色炫彩灯带(如图12)。

猜你喜欢

灯珠灯带杜邦
电路状态展示教具制作
图形化编程与炫彩多变的灯珠矩阵
杜邦安全文化精髓研究
LED 成品灯具中铝基板通用不同品牌3030-LED灯珠焊盘的设计
便携式可收放LED灯带
使用LED点光源实现均匀照明效果的要点探究
隐形灯带点亮家的光芒
杜邦智慧型产品及实用解决方案
改进的杜邦分析体系及其应用分析
小米杂货铺又添新品:支持1600万种色彩的灯带