2773| 2
|
[教程] 利用树莓派,学习python快乐之旅(2):求救信号灯 |
对于摩尔斯码,大家都不陌生,尤其是对于海上航行的"SOS"求救信号,更为人们所熟知,根据摩尔斯码的规划,26个英文字母均有对应的信号指示,如"S"为三短“滴”,"O"为三长“哒”,根据信息的长短规律,人们就可知道捕获的信号是什么内容,并由此做出相应的反应,如是求救,及时施救。 在树莓派的模块化、积木式的语句中,这一功能很好实现,如果利用树莓派自带的thonny python Ide软件应该如何实现呢,程序如下: 按顺序执行: from gpiozero import LEDfrom time import sleep # SOS滴=1t,嗒=3t,滴嗒间=1t,字符间=3t,单词间=7t t = 0.2 led = LED(5)# led.on()#第一个短“滴"Ssleep(t) led.off sleep(t) led.on() sleep(t) led.off sleep(t) led.on() sleep(t) led.off sleep(t) sleep(t*3)#暂停3个单位时间t led.on()#长”哒“o sleep(t*3) led.off sleep(t*3) led.on() sleep(t*3) led.off sleep(t*3)led.on() sleep(t*3) led.off sleep(t*3) sleep(t*3))#暂停3个单位时间t led.on()##第二个短“滴"S sleep(t) led.off sleep(t) led.on() sleep(t) led.off sleep(t) led.on() sleep(t) led.off sleep(t) sleep(t*3))#暂停3个单位时间t按循环结构执行 大家注意到,无论是”S"还是“O",都是有三次相同信号组成,可不可以简化呢?这里我们用到for循环”for i in range (3):"即循环变量为i ,次数为3 这样我们就可以把S或O的相同语句放在循环里: from gpiozero import LED from time import sleep # SOS滴=1t,嗒=3t,滴嗒间=1t,字符间=3t,单词间=7t t = 0.2 led = LED(5)# for i in range (3): led.on() sleep(t) led.off sleep(t) sleep(t*3) for i in range (3): led.on() sleep(t*3) led.off sleep(t*3) sleep(t*3) for i in range (3): led.on() sleep(t) led.off sleep(t) sleep(t*3) sleep(t*3) 这里需要注意的是:第一循环指令后面一定要冒号,第二循环体内指令一定要缩进。 在学习求教信号灯的过程中,我尝试了字母的大小写,体验到调入模块的指令名称一定要大写,并且指定端口时包括端口号的指令就是调入的指令,也要大写;循环体内指令一定要缩进! 讲课的郎老师细心地截屏,标注要点发给我们 此程序还可以优化。 但是,程序还是有些长,可不可以再改进呢?,这时我们用到了"while "循环语句: from gpiozero import LED from time import sleep # SOS滴=1t,嗒=3t,滴嗒间=1t,字符间=3t,单词间=7t t = 0.2 led = LED(5)# . while True: led.blink(on_time=t, off_time=t, n=3, background=False) # 亮的时间,灭的时间,闪烁的次数,是否后台运行 sleep(t*3) led.blink(on_time=t*3, off_time=t, n=3, background=False) sleep(t*3) led.blink(on_time=t, off_time=t, n=3, background=False) sleep(t*3) sleep(t*7) 到此,优化程序并没有结束,我们还可以定义函数和调用函数的形式改进程序。 这样,在调用时,三次blink的指令,我们就可以用 di或da这样的函数名称来代表了,大家看,一段冗长的程序就被我们精简的很短一段了。 from gpiozero import LED from time import sleep # SOS滴=1t,嗒=3t,滴嗒间=1t,字符间=3t,单词间=7t t = 0.2 led = LED(5)# def di(led): global t led.blink(on_time=t, off_time=t, n=3, background=False)# 亮的时间,灭的时间,闪烁的次数,是否后台运行 def da(led): global t led.blink(on_time=3t, off_time=3t, n=3, background=False) while True:di(led) sleep(t*3) da(led) sleep(t*3) di(led) sleep(t*3) sleep(t*7) 程序运行结果如下: , |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed