Python 物联网入门指南(四)(2)

简介: Python 物联网入门指南(四)

Python 物联网入门指南(四)(1)https://developer.aliyun.com/article/1507227

缩进

注意for循环块中的缩进

for i in range(10, 1, -1): 
       print("Count down no: ", i)

Python 执行for循环语句下的代码块。这是 Python 编程语言的一个特性。只要缩进级别相同,它就会执行for循环下的任何代码块:

for i in range(0,10): 
       #start of block 
       print("Hello") 
       #end of block

缩进有以下两个用途:

  • 它使代码可读性更强
  • 它帮助我们识别要在循环中执行的代码块

在 Python 中,要注意缩进,因为它直接影响代码的执行方式。

嵌套循环

在 Python 中,可以实现循环内的循环。例如,假设我们需要打印地图的xy坐标。我们可以使用嵌套循环来实现这个:

for x in range(0,3): 
   for y in range(0,3): 
         print(x,y)

预期输出是:


在嵌套循环中要小心代码缩进,因为它可能会引发错误。考虑以下例子:

for x in range(0,10): 
   for y in range(0,10): 
   print(x,y)

Python 解释器会抛出以下错误:

SyntaxError: expected an indented block

这在以下截图中可见:


因此,在 Python 中要注意缩进是很重要的(特别是嵌套循环),以成功执行代码。IDLE 的文本编辑器会在你编写代码时自动缩进。这应该有助于理解 Python 中的缩进。

一个 while 循环

当特定任务需要执行直到满足特定条件时,会使用while循环。while循环通常用于执行无限循环中的代码。让我们看一个具体的例子,我们想要打印i的值从09

i=0 
while i<10: 
  print("The value of i is ",i) 
  i+=1

while循环内,我们每次迭代都会将i增加1i的值增加如下:

i += 1

这等同于i = i+1

这个例子会执行代码,直到i的值小于 10。也可以执行无限循环中的某些操作:

i=0 
while True: 
  print("The value of i is ",i) 
  i+=1

可以通过在键盘上按下Ctrl + C来停止这个无限循环的执行。

也可以有嵌套的while循环:

i=0 
j=0 
while i<10: 
  while j<10: 
    print("The value of i,j is ",i,",",j) 
    i+=1 
    j+=1

for循环类似,while循环也依赖于缩进的代码块来执行一段代码。

Python 可以打印字符串和整数的组合,只要它们作为print函数的参数呈现,并用逗号分隔。在前面提到的示例中,i,j 的值是iprint函数的参数。您将在下一章中了解更多关于函数和参数的内容。此功能使得格式化输出字符串以满足我们的需求成为可能。

树莓派的 GPIO

树莓派 Zero 配备了一个 40 针的 GPIO 引脚标头。在这 40 个引脚中,我们可以使用 26 个引脚来读取输入(来自传感器)或控制输出。其他引脚是电源引脚(5V3.3VGround引脚):

树莓派 Zero GPIO 映射(来源:https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md

我们可以使用树莓派的 GPIO 最多 26 个引脚来接口设备并控制它们。但是,有一些引脚具有替代功能。

较早的图像显示了树莓派的 GPIO 引脚的映射。圆圈中的数字对应于树莓派处理器上的引脚编号。例如,GPIO 引脚2(底部行左侧的第二个引脚)对应于树莓派处理器上的 GPIO 引脚2,而不是 GPIO 引脚标头上的物理引脚位置。

一开始,尝试理解引脚映射可能会令人困惑。保留 GPIO 引脚手册(可与本章一起下载)以供参考。需要一些时间来适应树莓派 Zero 的 GPIO 引脚映射。

树莓派 Zero 的 GPIO 引脚是 3.3V 兼容的,也就是说,如果将大于 3.3V 的电压应用到引脚上,可能会永久损坏引脚。当设置为时,引脚被设置为 3.3V,当引脚被设置为低时,电压为 0V。

闪烁灯

让我们讨论一个例子,我们将使用树莓派 Zero 的 GPIO。我们将把 LED 接口到树莓派 Zero,并使其以 1 秒的间隔闪烁

让我们接线树莓派 Zero 开始:

使用 Fritzing 生成的 Blinky 原理图

在前面的原理图中,GPIO 引脚 2 连接到 LED 的阳极(最长的腿)。LED 的阴极连接到树莓派 Zero 的地引脚。还使用了 330 欧姆的限流电阻来限制电流的流动。

)。Raspbian Jessie操作系统映像带有预安装的库。这是一个非常简单易用的库,对于初学者来说是最好的选择。它支持一套标准设备,帮助我们轻松入门。

例如,为了接口 LED,我们需要从gpiozero库中导入LED类:

from gpiozero import LED

我们将在 1 秒的间隔内打开和关闭 LED。为了做到这一点,我们将导入time库。在 Python 中,我们需要导入一个库来使用它。由于我们将 LED 接口到 GPIO 引脚 2,让我们在我们的代码中提到这一点:

import time 
led = LED(2)

我们刚刚创建了一个名为led的变量,并定义我们将在LED类中使用 GPIO 引脚 2。让我们使用while循环来打开和关闭 LED,间隔为 1 秒。

gpiozero库的 LED 类带有名为on()off()的函数,分别将 GPIO 引脚 2 设置为高电平和低电平:

while True: 
    led.on() 
    time.sleep(1) 
    led.off() 
    time.sleep(1)

在 Python 的时间库中,有一个sleep函数,可以在打开/关闭 LED 之间引入 1 秒的延迟。这在一个无限循环中执行!我们刚刚使用树莓派 Zero 构建了一个实际的例子。

将所有代码放在名为blinky.py的文件中(可与本书一起下载),从命令行终端运行代码(或者,您也可以使用 IDLE3):

python3 blinky.py

GPIO 控制的应用

现在我们已经实施了我们的第一个示例,让我们讨论一些能够控制 GPIO 的可能应用。我们可以使用树莓派的 GPIO 来控制家中的灯光。我们将使用相同的示例来控制台灯!

有一个名为PowerSwitch Tail II的产品(www.powerswitchtail.com/Pages/default.aspx),可以将交流家电(如台灯)与树莓派连接起来。PowerSwitch Tail 配有控制引脚(可以接收 3.3V 高电平信号),可用于打开/关闭灯。开关配有必要的电路/保护,可直接与树莓派 Zero 接口:

树莓派 Zero 与 PowerSwitch Tail II 接口

让我们从上一节中使用相同的示例,将 GPIO 引脚 2 连接到 PowerSwitch Tail 的**+in引脚。让我们将树莓派 Zero 的 GPIO 引脚的地线连接到 PowerSwitch Tail 的-in**引脚。PowerSwitch Tail 应连接到交流电源。灯应连接到开关的交流输出。如果我们使用相同的代码并将灯连接到 PowerSwitch Tail,我们应该能够以 1 秒的间隔打开/关闭。

连接到树莓派 Zero 的 PowerSwitch Tail II 使用 LED 闪烁代码进行家电控制只是一个例子。不建议在如此短的时间间隔内打开/关闭台灯。

总结

在本章中,我们回顾了 Python 中的整数、布尔和字符串数据类型,以及算术运算和逻辑运算符。我们还讨论了接受用户输入和循环。我们介绍了树莓派 Zero 的 GPIO,并讨论了 LED 闪烁示例。我们使用相同的示例来控制台灯!

您听说过名为Slack的聊天应用程序吗?您是否尝试过在工作时从笔记本电脑控制家里的台灯?如果这引起了您的兴趣,请在接下来的几章中与我们一起工作。

第十一章:条件语句、函数和列表

在本章中,我们将在前一章学到的基础上进行扩展。您将学习有关条件语句以及如何使用逻辑运算符来检查条件的使用。接下来,您将学习如何在 Python 中编写简单的函数,并讨论如何使用触摸开关(瞬时按键)将输入接口到树莓派的 GPIO 引脚。我们还将讨论使用树莓派 Zero 进行电机控制(这是最终项目的预演),并使用开关输入来控制电机。让我们开始吧!

在本章中,我们将讨论以下主题:

  • Python 中的条件语句
  • 使用条件输入根据 GPIO 引脚状态采取行动
  • 使用条件语句跳出循环
  • Python 中的函数
  • GPIO 回调函数
  • Python 中的电机控制

条件语句

在 Python 中,条件语句用于确定特定条件是否满足,通过测试条件是true还是false。条件语句用于确定程序的执行方式。例如,条件语句可以用于确定是否是开灯的时间。语法如下:

if condition_is_true:
  do_something()

通常使用逻辑运算符来测试条件,并执行缩进块下的任务集。让我们考虑一个例子,check_address_if_statement.py(可在本章下载)中,程序需要使用yesno问题来验证用户输入:

check_address = input("Is your address correct(yes/no)? ") 
if check_address == "yes": 
  print("Thanks. Your address has been saved") 
if check_address == "no": 
  del(address) 
  print("Your address has been deleted. Try again")

在这个例子中,程序期望输入yesno。如果用户提供了输入yes,条件if check_address == "yes"true,则在屏幕上打印消息Your address has been saved

同样,如果用户输入是no,程序将执行在逻辑测试条件if check_address == "no"下的缩进代码块,并删除变量address

if-else 语句

在前面的例子中,我们使用if语句测试每个条件。在 Python 中,还有一种名为if-else语句的替代选项。if-else语句使得在主条件不为true时测试替代条件成为可能:

check_address = input("Is your address correct(yes/no)? ") 
if check_address == "yes": 
  print("Thanks. Your address has been saved") 
else: 
  del(address) 
  print("Your address has been deleted. Try again")

在这个例子中,如果用户输入是yes,则在if下的缩进代码块将被执行。否则,将执行else下的代码块。

if-elif-else 语句

在前面的例子中,对于除yes之外的任何用户输入,程序执行else块下的任何代码。也就是说,如果用户按下回车键而没有提供任何输入,或者提供了no而不是no,则if-elif-else语句的工作如下:

check_address = input("Is your address correct(yes/no)? ") 
if check_address == "yes": 
  print("Thanks. Your address has been saved") 
elif check_address == "no": 
  del(address) 
  print("Your address has been deleted. Try again") 
else: 
  print("Invalid input. Try again")

如果用户输入是yes,则在if语句下的缩进代码块将被执行。如果用户输入是no,则在elifelse-if)下的缩进代码块将被执行。如果用户输入是其他内容,则程序打印消息:Invalid input. Try again

重要的是要注意,代码块的缩进决定了在满足特定条件时需要执行的代码块。我们建议修改条件语句块的缩进,并找出程序执行的结果。这将有助于理解 Python 中缩进的重要性。

到目前为止,我们讨论的三个例子中,可以注意到if语句不需要由else语句补充。elseelif语句需要有一个前置的if语句,否则程序执行将导致错误。

跳出循环

条件语句可以用于跳出循环执行(for循环和while循环)。当满足特定条件时,可以使用if语句来跳出循环:

i = 0 
while True: 
  print("The value of i is ", i) 
  i += 1 
  if i > 100: 
    break

在前面的例子中,while循环在一个无限循环中执行。i的值递增并打印在屏幕上。当i的值大于100时,程序会跳出while循环,并且i的值从 1 打印到 100。

条件语句的应用:使用 GPIO 执行任务

在上一章中,我们讨论了将输出接口到树莓派的 GPIO。让我们讨论一个简单的按键按下的例子。通过读取 GPIO 引脚状态来检测按钮按下。我们将使用条件语句来根据 GPIO 引脚状态执行任务。

让我们将一个按钮连接到树莓派的 GPIO。你需要准备一个按钮、上拉电阻和几根跳线。稍后给出的图示展示了如何将按键连接到树莓派 Zero。按键的一个端子连接到树莓派 Zero 的 GPIO 引脚的地线。

按键接口的原理图如下:

树莓派 GPIO 原理图

按键的另一个端子通过 10K 电阻上拉到 3.3V。按键端子和 10K 电阻的交点连接到 GPIO 引脚 2(参考前一章中分享的 BCM GPIO 引脚图)。

将按键接口到树莓派 Zero 的 GPIO - 使用 Fritzing 生成的图像

让我们回顾一下需要查看按钮状态的代码。我们利用循环和条件语句来使用树莓派 Zero 读取按钮输入。

我们将使用在上一章介绍的gpiozero库。本节的代码示例是GPIO_button_test.py,可与本章一起下载。

在后面的章节中,我们将讨论面向对象编程OOP)。现在,让我们简要讨论类的概念。在 Python 中,是一个包含定义对象的所有属性的蓝图。例如,gpiozero库的Button类包含了将按钮接口到树莓派 Zero 的 GPIO 接口所需的所有属性。这些属性包括按钮状态和检查按钮状态所需的函数等。为了接口一个按钮并读取其状态,我们需要使用这个蓝图。创建这个蓝图的副本的过程称为实例化。

让我们开始导入gpiozero库,并实例化gpiozero库的Button类(我们将在后面的章节中讨论 Python 的类、对象及其属性)。按钮接口到 GPIO 引脚 2。我们需要在实例化时传递引脚号作为参数:

from gpiozero import Button 
#button is interfaced to GPIO 2 
button = Button(2)

gpiozero库的文档可在gpiozero.readthedocs.io/en/v1.2.0/api_input.html找到。根据文档,Button类中有一个名为is_pressed的变量,可以使用条件语句进行测试,以确定按钮是否被按下:

if button.is_pressed: 
    print("Button pressed")

每当按下按钮时,屏幕上会打印出消息Button pressed。让我们将这段代码片段放在一个无限循环中:

from gpiozero import Button 
#button is interfaced to GPIO 2 
button = Button(2)
while True: 
  if button.is_pressed: 
    print("Button pressed")

在无限的while循环中,程序不断检查按钮是否被按下,并在按钮被按下时打印消息。一旦按钮被释放,它就会回到检查按钮是否被按下的状态。

通过计算按钮按下次数来中断循环

让我们再看一个例子,我们想要计算按钮按下的次数,并在按钮接收到预定数量的按下时中断无限循环:

i = 0 
while True: 
  if button.is_pressed: 
    button.wait_for_release() 
    i += 1 
    print("Button pressed") 
  if i >= 10: 
    break

前面的例子可与本章一起下载,文件名为GPIO_button_loop_break.py

在这个例子中,程序检查is_pressed变量的状态。在接收到按钮按下时,程序可以使用wait_for_release方法暂停,直到按钮被释放。当按钮被释放时,用于存储按下次数的变量会增加一次。

当按钮接收到 10 次按下时,程序会跳出无限循环。

连接到树莓派 Zero GPIO 引脚 2 的红色瞬时按钮

Python 中的函数

我们简要讨论了 Python 中的函数。函数执行一组预定义的任务。print是 Python 中函数的一个例子。它可以将一些东西打印到屏幕上。让我们讨论在 Python 中编写我们自己的函数。

可以使用def关键字在 Python 中声明函数。函数可以定义如下:

def my_func(): 
   print("This is a simple function")

在这个函数my_func中,print语句是在一个缩进的代码块下编写的。在函数定义下缩进的任何代码块在代码执行期间调用函数时执行。函数可以被执行为my_func()

向函数传递参数:

函数总是用括号定义的。括号用于向函数传递任何必要的参数。参数是执行函数所需的参数。在前面的例子中,没有向函数传递参数。

让我们回顾一个例子,我们向函数传递一个参数:

def add_function(a, b): 
  c = a + b 
  print("The sum of a and b is ", c)

在这个例子中,ab是函数的参数。函数将ab相加,并在屏幕上打印总和。当通过传递参数32调用函数add_function时,add_function(3,2),其中a3b2

因此,执行函数需要参数ab,或者在没有参数的情况下调用函数会导致错误。可以通过为参数设置默认值来避免与缺少参数相关的错误:

def add_function(a=0, b=0): 
  c = a + b 
  print("The sum of a and b is ", c)

前面的函数需要两个参数。如果我们只向这个函数传递一个参数,另一个参数默认为零。例如,add_function(a=3)b默认为0,或者add_function(b=2)a默认为0。当在调用函数时未提供参数时,它默认为零(在函数中声明)。

同样,print函数打印传递的任何变量。如果调用print函数时没有传递任何参数,则会打印一个空行。

从函数返回值

函数可以执行一组定义的操作,并最终在结束时返回一个值。让我们考虑以下例子:

def square(a): 
   return a**2

在这个例子中,函数返回参数的平方。在 Python 中,return关键字用于在执行完成后返回请求的值。

函数中变量的作用域

Python 程序中有两种类型的变量:局部变量和全局变量。局部变量是函数内部的变量,即在函数内部声明的变量只能在该函数内部访问。例子如下:

def add_function(): 
  a = 3 
  b = 2 
  c = a + b 
  print("The sum of a and b is ", c)

在这个例子中,变量ab是函数add_function的局部变量。让我们考虑一个全局变量的例子:

a = 3 
b = 2 
def add_function(): 
  c = a + b 
  print("The sum of a and b is ", c) 
add_function()

在这种情况下,变量ab在 Python 脚本的主体中声明。它们可以在整个程序中访问。现在,让我们考虑这个例子:

a = 3 
def my_function(): 
  a = 5 
  print("The value of a is ", a)
my_function() 
print("The value of a is ", a)

程序输出为:

The value of a is
      5
      The value of a is
      3

在这种情况下,当调用my_function时,a的值为5,在脚本主体的print语句中a的值为3。在 Python 中,不可能在函数内部显式修改全局变量的值。为了修改全局变量的值,我们需要使用global关键字:

a = 3 
def my_function(): 
  global a 
  a = 5 
  print("The value of a is ", a)
my_function() 
print("The value of a is ", a)

一般来说,不建议在函数内修改变量,因为这不是一个很安全的修改变量的做法。最佳做法是将变量作为参数传递并返回修改后的值。考虑以下例子:

a = 3 
def my_function(a): 
  a = 5 
  print("The value of a is ", a) 
  return a 
a = my_function(a) 
print("The value of a is ", a)

在上述程序中,a的值为3。它作为参数传递给my_function。函数返回5,保存到a中。我们能够安全地修改a的值。

Python 物联网入门指南(四)(3)https://developer.aliyun.com/article/1507229

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
10天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
11天前
|
Python
深入理解Python装饰器:从入门到实践####
本文旨在通过简明扼要的方式,为读者揭开Python装饰器的神秘面纱,从基本概念、工作原理到实际应用场景进行全面解析。不同于常规的摘要仅概述内容概要,本文将直接以一段精炼代码示例开篇,展示装饰器如何优雅地增强函数功能,激发读者探索兴趣,随后深入探讨其背后的机制与高级用法。 ####
42 11
|
7天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
7天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
7天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
13天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
51 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
7天前
|
设计模式 缓存 开发框架
Python中的装饰器:从入门到实践####
本文深入探讨了Python中装饰器的工作原理与应用,通过具体案例展示了如何利用装饰器增强函数功能、提高代码复用性和可读性。读者将学习到装饰器的基本概念、实现方法及其在实际项目开发中的实用技巧。 ####
20 3
|
10天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
9天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
9天前
|
人工智能 数据挖掘 程序员
Python编程入门:从零到英雄
【10月更文挑战第37天】本文将引导你走进Python编程的世界,无论你是初学者还是有一定基础的开发者,都能从中受益。我们将从最基础的语法开始讲解,逐步深入到更复杂的主题,如数据结构、面向对象编程和网络编程等。通过本文的学习,你将能够编写出自己的Python程序,实现各种功能。让我们一起踏上Python编程之旅吧!