2773浏览
查看: 2773|回复: 2

[教程] 利用树莓派,学习python快乐之旅(2):求救信号灯

[复制链接]
         对于摩尔斯码,大家都不陌生,尤其是对于海上航行的"SOS"求救信号,更为人们所熟知,根据摩尔斯码的规划,26个英文字母均有对应的信号指示,如"S"为三短“滴”,"O"为三长“哒”,根据信息的长短规律,人们就可知道捕获的信号是什么内容,并由此做出相应的反应,如是求救,及时施救。利用树莓派,学习python快乐之旅(2):求救信号灯图1
       在树莓派的模块化、积木式的语句中,这一功能很好实现,如果利用树莓派自带的thonny  python Ide软件应该如何实现呢,程序如下:
按顺序执行:
from gpiozero import LED
from time import sleep
# SOS滴=1t,嗒=3t,滴嗒间=1t,字符间=3t,单词间=7t
t = 0.2
led = LED(5)#
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

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)
这里需要注意的是:第一循环指令后面一定要冒号,第二循环体内指令一定要缩进。
      在学习求教信号灯的过程中,我尝试了字母的大小写,体验到调入模块的指令名称一定要大写,并且指定端口时包括端口号的指令就是调入的指令,也要大写;循环体内指令一定要缩进!
     讲课的郎老师细心地截屏,标注要点发给我们

利用树莓派,学习python快乐之旅(2):求救信号灯图5
    此程序还可以优化。
利用树莓派,学习python快乐之旅(2):求救信号灯图4
但是,程序还是有些长,可不可以再改进呢?,这时我们用到了"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)

到此,优化程序并没有结束,我们还可以定义函数和调用函数的形式改进程序。

利用树莓派,学习python快乐之旅(2):求救信号灯图3
这样,在调用时,三次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)
利用树莓派,学习python快乐之旅(2):求救信号灯图2
程序运行结果如下:




DFrJ5KYVQaH  中级技匠

发表于 2020-2-27 08:14:04

马老师的贴子,真是好,向你学习
回复

使用道具 举报

DFrJ5KYVQaH  中级技匠

发表于 2020-2-27 08:44:47

贴子,有个错误。sleep(3t)是个错误语句
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail