本文翻译整理自:Arduino With Python: How to Get Started
https://realpython.com/arduino-python/
文章目录
- 一、Arduino平台
- 1、Arduino硬件
- 2、Arduino软件
- 二、“Hello, World!”与Arduino
- 1、上传眨眼示例草图
- 2、连接外部组件
- 3、使用面包板
- 三、“Hello, World!” 与 Arduino和Python
- 1、上传Firmata草图
- 2、读取数字输入
- 3、读取模拟输入
- 4、使用模拟输出
- 5、使用传感器触发通知
- 四、结论
- 五、进一步阅读
微控制器已经存在了很长时间,它们被用于从复杂机械到普通家用电器的所有领域。然而,使用它们传统上是留给那些受过正式技术培训的人,如技术人员和电气工程师。Arduino的出现使所有开发人员都更容易使用电子应用程序设计。在本教程中,您将了解如何使用Arduino和Python来开发自己的电子项目。
您将使用Python介绍Arduino的基础知识并学习如何:
- 设置电子电路
- 在Arduino上设置Firmata协议
- 用Python为Arduino编写基本应用程序
- 控制模拟和数字输入和输出
- 将Arduino传感器和开关与更高级别的应用程序集成
- 在您的PC上触发通知并使用Arduino发送电子邮件
免费奖励: 5个关于Python掌握的想法,这是一门面向Python开发人员的免费课程,向您展示了将Python技能提升到一个新的水平所需的路线图和心态。
一、Arduino平台
Arduino是一个由硬件和软件组成的开源平台,允许交互式电子项目的快速发展。Arduino的出现吸引了来自许多不同行业的专业人士的注意,促成了创客运动的开始。
随着创客运动和物联网的概念越来越受欢迎,Arduino已经成为电子原型设计和MVP开发的主要平台之一。
Arduino使用自己的编程语言,类似于C++。然而,可以将Arduino与Python或其他高级编程语言一起使用。事实上,像Arduino这样的平台可以很好地与Python配合使用,尤其是对于需要与传感器和其他物理设备集成的应用程序。
总而言之,Arduino和Python可以促进一个有效的学习环境,鼓励开发人员进入电子设计领域。如果你已经知道了Python的基础知识,那么你就可以通过使用Python来控制Arduino。
Arduino平台包括硬件和软件产品。在本教程中,您将使用Arduino硬件和Python软件了解基本电路以及数字和模拟输入和输出。
1、Arduino硬件
要运行这些示例,您需要通过连接电子元件来组装电路。您通常可以在电子元件商店或良好的Arduino入门套件中找到这些物品。您需要:
- 一个Arduino Uno或其他兼容的板
- 任何颜色的标准LED
- 一个按钮
- 10 KOhm电位器
- 470欧姆电阻
- 10 KOhm电阻器
- 面包板
- 各种颜色和尺寸的跳线
让我们仔细看看其中的几个组件。
组件1是Arduino Uno或其他兼容板。Arduino是一个项目,包括许多用于不同用途的板和模块,Arduino Uno是其中最基本的。它也是整个Arduino家族中使用最多、文档最多的板,所以对于刚刚开始使用电子产品的开发人员来说,这是一个很好的选择。
注意:Arduino是一个开放的硬件平台,因此还有许多其他供应商销售可用于运行您在此处看到的示例的兼容板。在本教程中,您将学习如何使用Arduino Uno。
元件5和6是电阻器。大多数电阻器根据颜色代码由彩色条纹标识。一般情况下,前三种颜色代表一个电阻器的值,而第四种颜色代表其公差。对于470欧姆的电阻器,前三种颜色是黄色、紫色和棕色。对于10 KOhm的电阻器,前三种颜色是棕色、黑色和橙色。
组件7是一个面包板,您可以使用它来连接所有其他组件并组装电路。虽然不需要面包板,但如果您打算开始使用Arduino,建议您购买一个。
2、Arduino软件
除了这些硬件组件之外,您还需要安装一些软件。该平台包括Arduino IDE,一个用于对Arduino设备进行编程的集成开发环境,以及其他在线工具。
Arduino旨在让您轻松地对电路板进行编程。一般来说,您将遵循以下步骤:
- 将电路板连接到您的PC
- 安装并打开Arduino IDE
- 配置电路板设置
- 写代码
- 按IDE上的按钮将程序上传到板上
要在您的计算机上安装Arduino IDE,请从Arduino网站下载适合您操作系统的版本。查看安装说明的留档:
- 如果您正在使用Windows,请使用Windows安装程序确保下载在Windows上使用Arduino所需的驱动程序。查看Arduino留档了解更多详细信息。
- 如果您正在使用Linux,那么您可能必须将您的用户添加到某些组中,以便使用串行端口对Arduino进行编程。Linux的Arduino安装指南中描述了此过程。
- 如果您使用的是macOS,那么您可以按照OS X的Arduino安装指南安装Arduino IDE。
注意: 您将在本教程中使用Arduino IDE,但Arduino还提供了一个Web编辑器,允许您使用浏览器对Arduino板进行编程。
现在您已经安装了Arduino IDE并收集了所有必要的组件,您就可以开始使用Arduino了!接下来,您将上传一个“Hello, World!”程序到您的董事会。
二、“Hello, World!”与Arduino
Arduino IDE附带了几个示例草图,您可以使用它们来学习Arduino的基础知识。草图是您用于可以上传到板上的程序的术语。由于Arduino Uno没有附加显示器,因此您需要一种方法来查看程序的物理输出。您将使用Blink示例草图使Arduino板上的内置LED闪烁。
1、上传眨眼示例草图
要开始使用,请使用USB电缆将Arduino板连接到您的PC并启动Arduino IDE。要打开Blink示例草图,请访问文件菜单并选择示例,然后选择01。基础知识,最后是眨眼:
Blink示例代码将被加载到一个新的IDE窗口中。但是在您将草图上传到主板之前,您需要通过选择主板及其连接的端口来配置IDE。
要配置板,请访问工具菜单,然后访问板。对于Arduino Uno,您应该选择Arduino/Genuino Uno:
选择板后,您必须设置适当的端口。再次访问工具菜单,这次选择端口:
端口的名称可能会有所不同,具体取决于您的操作系统。在Windows中,端口将被命名为COM4
、COM5
或类似名称。在macOS或Linux中,您可能会看到类似/dev/ttyACM0
或/dev/ttyUSB0
的内容。如果您在设置端口时遇到任何问题,请查看Arduino故障排除页面。
配置板和端口后,您就可以将草图上传到Arduino了。为此,您只需按IDE工具栏中的上传按钮:
当您按上传时,IDE会编译草图并将其上传到您的电路板。如果要检查错误,则可以在上传前按验证,这只会编译您的草图。
USB数据线提供串行连接以上传程序并为Arduino板供电。在上传过程中,您会看到板上的LED闪烁。几秒钟后,上传的程序将运行,您会看到LED灯每秒闪烁一次:
上传完成后,USB电缆将继续为Arduino板供电,程序存储在Arduino微控制器上的闪存中,您也可以使用电池或其他外部电源在没有USB电缆的情况下运行应用程序。
2、连接外部组件
在上一节中,您使用了Arduino板上已经存在的LED。但是,在大多数实际项目中,您需要将外部组件连接到电路板。为了进行这些连接,Arduino有几个不同类型的引脚:
[](https://files.realpython.com/media/arduino_ports.ccba6e743d26.png =400x)
虽然这些连接通常被称为引脚,但您可以看到它们并不完全是物理引脚。相反,引脚是插座上的孔,您可以将跳线连接到这些孔上。在上图中,您可以看到不同的引脚组:
- 橙色矩形:这些是13个 数字引脚,您可以将其用作输入或输出。它们仅适用于具有2个不同级别的数字信号:
- 0级:由电压0V表示
- 1级:由5V电压表示
- 绿色矩形:这是6个模拟引脚,您可以将其用作模拟输入。它们适用于0V和5V之间的任意电压。
- 蓝色矩形:这是5个电源引脚。它们主要用于为外部组件供电。
要开始使用外部组件,您将连接外部LED以运行Blink示例草图。内置LED连接到数字引脚#13。因此,让我们将外部LED连接到该引脚并检查它是否闪烁。(标准LED是您之前看到的组件之一。)
在将任何东西连接到Arduino板之前,最好将其与计算机断开连接。拔掉USB电缆后,您将能够将LED连接到电路板:
请注意,该图显示了数字引脚现在面向您的电路板。
3、使用面包板
电子电路项目通常涉及测试几个想法,您可以添加新组件并随时进行调整。然而,直接连接组件可能很棘手,尤其是在电路很大的情况下。
为了便于原型制作,您可以使用面包板连接组件。这是一种带有几个孔的设备,这些孔以特定方式连接,因此您可以使用跳线轻松连接组件:
您可以通过查看彩色线条来查看哪些孔是相互连接的。您将使用面包板侧面的孔为电路供电:
- 将红线上的一个孔连接到电源。
- 将蓝线上的一个孔连接到地面。
然后,您可以轻松地将组件连接到电源或接地,只需使用红色和蓝色线上的其他孔。面包板中间的孔按照颜色指示连接。您将使用这些来连接电路的组件。这两个内部部分由一个小凹陷隔开,您可以在上面连接集成电路(IC)。
您可以使用面包板来组装Blink示例草图中使用的电路:
对于这个电路,重要的是要注意发光二极管必须根据它的极性连接,否则它将无法工作。发光二极管的正端子称为阳极,通常是较长的端子。负端子称为阴极,较短。如果您使用的是回收组件,那么您也可以通过在发光二极管本身寻找平坦的侧面来识别端子。这将指示负端子的位置。
当您将LED连接到Arduino引脚时,您总是需要一个电阻器来限制其电流并避免过早烧坏LED。在这里,您使用470欧姆电阻器来执行此操作。您可以按照连接并检查电路是否相同:
- 电阻器连接到Arduino板上的数字引脚13。
- 发光二极管的阳极连接到电阻的另一个端子。
- LED阴极通过蓝线孔连接到地(GND)。
有关更详细的解释,请查看如何使用面包板。
完成连接后,将Arduino插入PC并重新运行Blink草图:
由于两个LED都连接到数字引脚13,当草图运行时,它们会一起闪烁。
三、“Hello, World!” 与 Arduino和Python
在上一节中,您将Blink草图上传到Arduino板上。Arduino草图用类似于C++的语言编写,并在您按下上传时编译并记录在微控制器的闪存中。虽然您可以使用另一种语言直接对Arduino微控制器进行编程,但这不是一项微不足道的任务!
但是,有一些方法可以将Arduino与Python或其他语言一起使用。一个想法是在PC上运行主程序,并使用串行连接通过USB电缆与Arduino通信。草图将负责读取输入,将信息发送到PC,并从PC获取更新以更新Arduino输出。
要从PC控制Arduino,您必须为PC和Arduino之间的通信设计一个协议。例如,您可以考虑使用如下消息的协议:
- VALUE OF PIN 13 IS HIGH:用于告诉PC数字输入引脚的状态
- SET PIN 11 LOW:用于告诉Arduino设置输出引脚的状态
定义好协议后,您可以编写一个Arduino草图来向PC发送消息,并根据协议更新引脚的状态。在PC上,您可以编写一个程序,根据您设计的协议通过串行连接控制Arduino。为此,您可以使用您喜欢的任何语言和库,例如Python和PySerial库。
幸运的是,有标准协议可以做到这一切!Firmata就是其中之一。该协议建立了一种串行通信格式,允许您读取数字和模拟输入,以及将信息发送到数字和模拟输出。
Arduino IDE包括现成的草图,这些草图将使用Firmata协议通过Python驱动Arduino。在PC端,有多种语言的协议实现,包括Python。为了开始使用Firmata,让我们用它来实现一个“Hello, World!”程序。
1、上传Firmata草图
在编写Python程序来驱动Arduino之前,您必须上传Firmata草图,以便您可以使用该协议来控制电路板。该草图可在Arduino IDE的内置示例中找到。要打开它,请访问文件菜单,然后是示例,然后是Firmata,最后是标准Firmata:
草图将被加载到一个新的IDE窗口中。要将其上传到Arduino,您可以按照之前所做的相同步骤操作:
- 将USB电缆插入PC。
- 在IDE上选择适当的板和端口。
- 按上传。
上传完成后,您不会注意到Arduino上的任何活动。要控制它,您仍然需要一个可以通过串行连接与板通信的程序。要在Python中使用Firmata协议,您需要pyFirmata包,您可以使用pip
安装它:
壳牌
$ pip install pyfirmata
安装完成后,您可以使用Python和Firmata运行等效的Blink应用程序:
import pyfirmata
import time
board = pyfirmata.Arduino('/dev/ttyACM0')
while True:
board.digital[13].write(1)
time.sleep(1)
board.digital[13].write(0)
time.sleep(1)
下面是这个程序的工作原理。您导入 pyfirmata
并使用它与Arduino板建立串行连接,它由第4行中的board
对象表示。您还可以通过将参数传递给pyfirmata. Arduino()pyfirmata.Arduino()
board.digital
是一个列表,其元素代表Arduino的数字引脚。这些元素具有方法read()
和write()
,它们将读写引脚的状态。与大多数嵌入式设备程序一样,此程序主要由无限循环组成:
- 在第7行,数字引脚13接通,这将LED接通一秒钟。
- 在第9行,该引脚关闭,这将关闭LED一秒钟。
现在您已经了解了如何使用Python控制Arduino的基础知识,让我们介绍一些应用程序以与其输入和输出进行交互。
2、读取数字输入
数字输入只能有两个可能的值。在电路中,这些值中的每一个都由不同的电压表示。下表显示了标准Arduino Uno板的数字输入表示:
值 | 电平 | 电压 |
---|---|---|
0 | 低 | 0V |
1 | 高 | 5V |
要控制LED,您将使用按钮向Arduino发送数字输入值。按钮应在释放时向电路板发送0V,按下时向电路板发送5V。下图显示了如何将按钮连接到Arduino板:
您可能会注意到LED连接到数字引脚13上的Arduino,就像以前一样。数字引脚10用作数字输入。要连接按钮,您必须使用10 KOhm电阻,它在该电路中充当下拉电阻。下拉电阻确保释放按钮时数字输入获得0V。
当您释放按钮时,您打开按钮上两根电线之间的连接。由于没有电流流过电阻器,引脚10只是连接到地(GND)。数字输入得到0V,代表0(或低)状态。当你按下按钮时,你给电阻器和数字输入施加5V。电流流过电阻器,数字输入得到5V,代表1(或高)状态。
您也可以使用面包板来组装上述电路:
[](https://files.realpython.com/media/digital_input_2.a46059238b65.png =400x)
现在您已经组装了电路,您必须在PC上运行一个程序来使用Firmata控制它。该程序将根据按钮的状态打开LED:
import pyfirmata
import time
board = pyfirmata.Arduino('/dev/ttyACM0')
it = pyfirmata.util.Iterator(board)
it.start()
board.digital[10].mode = pyfirmata.INPUT
while True:
sw = board.digital[10].read()
if sw is True:
board.digital[13].write(1)
else:
board.digital[13].write(0)
time.sleep(0.1)
让我们来看看这个程序:
- 第1行和第2行 导入
pyfirmata
和time
。 - 第4行使用
pyfirmata.Arduino()
设置与Arduino板的连接。 - 第6行分配了一个迭代器,用于读取电路输入的状态。
- 第7行启动迭代器,它使一个循环与您的主代码并行运行。循环执行
board.iterate()
来更新从Arduino板获得的输入值。 - 第9行将引脚10设置为
pyfirmata.INPUT
的数字输入。这是必要的,因为默认配置是使用数字引脚作为输出。 - 第11行启动一个无限
while
循环,此循环读取输入引脚的状态,将其存储在sw
中,并使用该值通过更改引脚13的值来打开或关闭LED。 - 第17行在
while
循环的迭代之间等待0.1秒。这不是绝对必要的,但这是避免CPU过载的一个很好的技巧,当循环中没有等待命令时,CPU会达到100%的负载。
pyfirmata
还提供了更紧凑的语法来处理输入和输出引脚。当您使用多个引脚时,这可能是一个不错的选择。您可以重写以前的程序以获得更紧凑的语法:
import pyfirmata
import time
board = pyfirmata.Arduino('/dev/ttyACM0')
it = pyfirmata.util.Iterator(board)
it.start()
digital_input = board.get_pin('d:10:i')
led = board.get_pin('d:13:o')
while True:
sw = digital_input.read()
if sw is True:
led.write(1)
else:
led.write(0)
time.sleep(0.1)
在此版本中,您使用board.get_pin()
创建两个对象。digital_input
表示数字输入状态,led
表示LED状态。运行此方法时,您必须传递一个字符串参数,该参数由冒号分隔的三个元素组成:
- 该类型的引脚(
a
为模拟或d
为数字) - 别针的号码
- 该模式的引脚(
i
输入或o
输出)
由于digital_input
是使用引脚10的数字输入,因此您传递参数'd:10:i'
。LED状态设置为使用引脚13的数字输出,因此led
参数是'd:13:o'
。
当您使用board.get_pin()
时,无需像以前使用pyfirmata. INPUT那样显式设置引脚10作为输入pyfirmata.INPUT
设置引脚后,您可以使用read()
访问数字输入引脚的状态,并使用write()
设置数字输出引脚的状态。
数字输入广泛用于电子项目。几个传感器提供数字信号,如存在或门传感器,可用作电路的输入。但是,在某些情况下,您需要测量模拟值,例如距离或物理量。在下一节中,您将看到如何使用Arduino和Python读取模拟输入。
3、读取模拟输入
与只能打开或关闭的数字输入相比,模拟输入用于读取某些范围内的值。在Arduino Uno上,模拟输入的电压范围从0V到5V。适当的传感器用于测量物理量,例如距离。这些传感器负责在适当的电压范围内对这些物理量进行编码,以便Arduino可以读取它们。
要读取模拟电压,Arduino使用模/数换器或者模数转换器(ADC),它将输入电压转换为具有固定位数的数字,这决定了转换的分辨率。Arduino Uno使用10位ADC,可以确定1024个不同的电压电平。
模拟输入的电压范围被编码为0到1023之间的数字。当施加0V时,Arduino将其编码为数字0。当施加5V时,编码数字为1023。所有中间电压值都按比例编码。
一个电位器是一个可变电阻器,您可以使用它来设置施加到Arduino模拟输入的电压。您将它连接到一个模拟输入来控制闪烁LED的频率:
在这个电路中,LED的设置和以前一样。电位器的端端子连接到地(GND)和5V引脚。这样,中央端子(光标)可以根据其位置具有0V到5V范围内的任何电压,它连接到模拟引脚A0上的Arduino。
使用面包板,您可以按如下方式组装此电路:
在控制LED之前,您可以使用电路根据电位器的位置检查Arduino读取的不同值。为此,请在您的PC上运行以下程序:
Python
import pyfirmata
import time
board = pyfirmata.Arduino('/dev/ttyACM0')
it = pyfirmata.util.Iterator(board)
it.start()
analog_input = board.get_pin('a:0:i')
while True:
analog_value = analog_input.read()
print(analog_value)
time.sleep(0.1)
在第8行,您将analog_input
设置为模拟A0输入引脚,参数为'a:0:i'
。在无限while
循环中,您读取此值,将其存储在analog_value
中,并使用print()
将输出显示到控制台。当您在程序运行时移动电位器时,您应该输出类似于以下内容:
0.0
0.0293
0.1056
0.1838
0.2717
0.3705
0.4428
0.5064
0.5797
0.6315
0.6764
0.7243
0.7859
0.8446
0.9042
0.9677
1.0
1.0
打印的值会发生变化,从电位器位置在一端时的0到另一端时的1。请注意,这些是浮点值,可能需要根据应用程序进行转换。
要改变闪烁LED的频率,您可以使用analog_value
来控制LED保持开启或关闭的时间:
import pyfirmata
import time
board = pyfirmata.Arduino('/dev/ttyACM0')
it = pyfirmata.util.Iterator(board)
it.start()
analog_input = board.get_pin('a:0:i')
led = board.get_pin('d:13:o')
while True:
analog_value = analog_input.read()
if analog_value is not None:
delay = analog_value + 0.01
led.write(1)
time.sleep(delay)
led.write(0)
time.sleep(delay)
else:
time.sleep(0.1)
在这里,您将delay
计算为analog_value + 0.01
,以避免delay
等于零。否则,在最初的几次迭代中,通常会得到None
的analog_value
。为了避免在运行程序时出错,您在第13行使用条件来测试analog_value
是否为None
。然后您控制闪烁LED的周期。
尝试运行程序并更改电位器的位置。您会注意到闪烁LED的频率发生了变化:
到目前为止,您已经了解了如何在电路上使用数字输入、数字输出和模拟输入。在下一节中,您将看到如何使用模拟输出。
4、使用模拟输出
在某些情况下,需要模拟输出来驱动需要模拟信号的设备。Arduino不包括真正的模拟输出,即电压可以设置为特定范围内的任何值。然而,Arduino确实包括几个脉冲宽度调制(PWM)输出。
PWM是一种调制技术,其中使用数字输出来产生具有可变功率的信号。为此,它使用恒定频率的数字信号,其中占空比根据所需功率而改变。占空比表示信号设置为高周期的分数。
并非所有Arduino数字引脚都可以用作PWM输出。可以用波浪号(~
)标识的引脚:
一些设备被设计成由PWM信号驱动,包括一些电机。如果您使用模拟滤波器,甚至可以从PWM信号中获得真实的模拟信号。在前面的示例中,您使用数字输出来打开或关闭发光二极管灯。在本节中,您将使用PWM根据电位器给出的模拟输入值来控制发光二极管的亮度。
当PWM信号施加到LED时,其亮度会根据PWM信号的占空比而变化。您将使用以下电路:
该电路与上一节中用于测试模拟输入的电路相同,除了一个区别。由于无法将PWM与引脚13一起使用,因此用于LED的数字输出引脚是引脚11。
您可以使用面包板组装电路,如下所示:
组装好电路后,您可以通过以下程序使用PWM控制LED:
import pyfirmata
import time
board = pyfirmata.Arduino('/dev/ttyACM0')
it = pyfirmata.util.Iterator(board)
it.start()
analog_input = board.get_pin('a:0:i')
led = board.get_pin('d:11:p')
while True:
analog_value = analog_input.read()
if analog_value is not None:
led.write(analog_value)
time.sleep(0.1)
与您之前使用的程序有一些不同之处:
- 在第10行,您通过传递参数
'd:11:p'
将led
设置为PWM模式。 - 在第15行,您调用
led.write()
,analog_value
作为参数。这是一个介于0和1之间的值,从模拟输入中读取。
在这里,您可以看到电位器移动时的LED行为:
为了显示占空比的变化,将示波器插入引脚11。当电位计处于零位时,您可以看到LED熄灭,因为引脚11的输出为0V。当您转动电位计时,LED会随着PWM占空比的增加而变亮。当你一直转动电位计时,占空比达到100%。LED以最大亮度持续亮起。
通过这个例子,您已经了解了使用Arduino及其数字和模拟输入和输出的基础知识。在下一节中,您将看到一个使用Arduino和Python在PC上驱动事件的应用程序。
5、使用传感器触发通知
Firmata是使用Python开始使用Arduino的好方法,但需要PC或其他设备来运行应用程序的成本可能很高,而且这种方法在某些情况下可能不实用。然而,当需要收集数据并使用外部传感器将其发送到PC时,Arduino和Firmata是一个很好的组合。
在本节中,您将使用连接到Arduino的按钮来模拟数字传感器,并在您的机器上触发通知。例如,对于更实际的应用,您可以将按钮视为触发报警通知的门传感器。
要在PC上显示通知,您将使用标准的PythonGUI工具包Tkinter。当您按下按钮时,这将显示一个消息框。有关Tkinter的深入介绍,请查看Python GUI Programming With Tkinter。
您需要组装在数字输入示例中使用的相同电路:
组装电路后,使用以下程序触发通知:
import pyfirmata
import time
import tkinter
from tkinter import messagebox
root = tkinter.Tk()
root.withdraw()
board = pyfirmata.Arduino('/dev/ttyACM0')
it = pyfirmata.util.Iterator(board)
it.start()
digital_input = board.get_pin('d:10:i')
led = board.get_pin('d:13:o')
while True:
sw = digital_input.read()
if sw is True:
led.write(1)
messagebox.showinfo("Notification", "Button was pressed")
root.update()
led.write(0)
time.sleep(0.1)
该程序类似于数字输入示例中使用的程序,但有一些更改:
- 第3行和第4行导入设置Tkinter所需的库。
- 第6行创建Tkinter的主窗口。
- 第7行告诉Tkinter不要在屏幕上显示主窗口。对于此示例,您只需要看到消息框。
- 17号线 开始
while
循环:- 当您按下按钮时,LED将打开,
messagebox.showinfo()
显示一个消息框。 - 循环暂停,直到用户按下确定。这样,只要消息在屏幕上,LED就会一直亮着。
- 用户按下确定后,
root.update()
从屏幕上清除消息框,LED关闭。
- 当您按下按钮时,LED将打开,
要扩展通知示例,您甚至可以在按下按钮时使用按钮发送电子邮件:
import pyfirmata
import time
import smtplib
import ssl
def send_email():
port = 465 # For SSL
smtp_server = "smtp.gmail.com"
sender_email = "<your email address>"
receiver_email = "<destination email address>"
password = "<password>"
message = """Subject: Arduino Notification\n The switch was turned on."""
context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
print("Sending email")
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message)
board = pyfirmata.Arduino('/dev/ttyACM0')
it = pyfirmata.util.Iterator(board)
it.start()
digital_input = board.get_pin('d:10:i')
while True:
sw = digital_input.read()
if sw is True:
send_email()
time.sleep(0.1)
您可以在使用Python发送电子邮件中了解有关send_email()
的更多信息。在这里,您使用电子邮件服务器凭据配置该函数,该凭据将用于发送电子邮件。
注意: 如果您使用Gmail帐户发送电子邮件,则需要启用允许不太安全的应用程序选项。有关如何执行此操作的更多信息,请查看使用Python发送电子邮件。
通过这些示例应用程序,您已经了解了如何使用Firmata与更复杂的Python应用程序进行交互。Firmata允许您使用连接到Arduino的任何传感器为您的应用程序获取数据。然后您可以在主应用程序中处理数据并做出决策。您甚至可以使用Firmata将数据发送到Arduino输出、控制开关或PWM设备。
如果您有兴趣使用Firmata与更复杂的应用程序进行交互,请尝试其中一些项目:
- 温度监视器,当温度过高或过低时提醒您
- 一种可以感知灯泡何时烧坏的模拟光传感器
- 一种水传感器,可以在地面太干时自动打开洒水器
四、结论
由于创客运动和物联网的日益普及,微控制器平台正在兴起。像Arduino这样的平台尤其受到关注,因为它们允许像您这样的开发人员使用他们的技能并深入电子项目。
你学会了如何:
- 使用Arduino和Python开发应用程序
- 使用Firmata协议
- 控制模拟和数字输入和输出
- 将传感器与更高级别的Python应用程序集成
您还看到了Firmata如何成为需要PC并依赖传感器数据的项目的一个非常有趣的替代方案。此外,如果您已经了解Python,这是开始使用Arduino的简单方法!
五、进一步阅读
现在您已经了解了使用Python控制Arduino的基础知识,您可以开始处理更复杂的应用程序了。有几个教程可以帮助您开发集成项目。这里有一些想法:
- REST API: 它们被广泛用于集成不同的应用程序。您可以将REST与Arduino结合使用,构建从传感器获取信息并向执行器发送命令的API。要了解REST API,请查看Python REST API with Flask、Connexion和SQLAlchemy。
- 替代GUI: 在本教程中,您使用Tkinter构建了一个图形应用程序。但是,还有其他用于桌面应用程序的图形库。要查看替代方案,请查看如何使用wxPython构建Python GUI应用程序。
- 线程: 您在本教程中使用的无限
while
循环是Arduino应用程序的一个非常常见的特性。但是,使用线程运行主循环将允许您同时执行其他任务。要了解如何使用线程,请查看Python中的线程介绍。 - 人脸检测: 物联网应用程序集成机器学习和计算机视觉算法是很常见的。例如,有了这些,你可以构建一个警报,当它检测到相机上的人脸时触发通知。要了解更多关于面部识别系统的信息,请查看使用Python进行传统人脸检测。
最后,除了Firmata和Arduino之外,还有其他在微控制器中使用Python的方法:
- pySerial: Arduino Uno不能直接运行Python,但你可以设计自己的Arduino草图,并使用pySerial建立串行连接。然后你可以使用自己的协议用Python控制Arduino。
- MicroPython: 如果您有兴趣直接在微控制器上运行Python,请查看MicroPython项目。它提供了在ESP8266和ESP32等微控制器上执行Python的高效实现。
- SBC: 另一种选择是使用树莓派等单板计算机(SBC)来运行Python。SBC是完整的Arduino大小的计算机,可以运行基于Linux的操作系统,允许您使用vanilla Python。由于大多数SBC提供通用输入和输出引脚,您可以在大多数应用程序中使用它来替换Arduino。
2024-09-17(二)