Python 操作 Arduino 入门

news2024/11/23 7:03:32

在这里插入图片描述

本文翻译整理自: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入门套件中找到这些物品。您需要:

  1. 一个Arduino Uno或其他兼容的板
  2. 任何颜色的标准LED
  3. 一个按钮
  4. 10 KOhm电位器
  5. 470欧姆电阻
  6. 10 KOhm电阻器
  7. 面包板
  8. 各种颜色和尺寸的跳线

让我们仔细看看其中的几个组件。

组件1是Arduino Uno或其他兼容板。Arduino是一个项目,包括许多用于不同用途的板和模块,Arduino Uno是其中最基本的。它也是整个Arduino家族中使用最多、文档最多的板,所以对于刚刚开始使用电子产品的开发人员来说,这是一个很好的选择。

注意:Arduino是一个开放的硬件平台,因此还有许多其他供应商销售可用于运行您在此处看到的示例的兼容板。在本教程中,您将学习如何使用Arduino Uno。

元件5和6是电阻器。大多数电阻器根据颜色代码由彩色条纹标识。一般情况下,前三种颜色代表一个电阻器的,而第四种颜色代表其公差。对于470欧姆的电阻器,前三种颜色是黄色、紫色和棕色。对于10 KOhm的电阻器,前三种颜色是棕色、黑色和橙色。

组件7是一个面包板,您可以使用它来连接所有其他组件并组装电路。虽然不需要面包板,但如果您打算开始使用Arduino,建议您购买一个。


2、Arduino软件

除了这些硬件组件之外,您还需要安装一些软件。该平台包括Arduino IDE,一个用于对Arduino设备进行编程的集成开发环境,以及其他在线工具。

Arduino旨在让您轻松地对电路板进行编程。一般来说,您将遵循以下步骤:

  1. 将电路板连接到您的PC
  2. 安装并打开Arduino IDE
  3. 配置电路板设置
  4. 写代码
  5. 按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中,端口将被命名为COM4COM5或类似名称。在macOS或Linux中,您可能会看到类似/dev/ttyACM0/dev/ttyUSB0的内容。如果您在设置端口时遇到任何问题,请查看Arduino故障排除页面。

配置板和端口后,您就可以将草图上传到Arduino了。为此,您只需按IDE工具栏中的上传按钮:

Buttons for verify and upload on Arduino IDE


当您按上传时,IDE会编译草图并将其上传到您的电路板。如果要检查错误,则可以在上传前按验证,这只会编译您的草图。

USB数据线提供串行连接以上传程序并为Arduino板供电。在上传过程中,您会看到板上的LED闪烁。几秒钟后,上传的程序将运行,您会看到LED灯每秒闪烁一次:

在这里插入图片描述


上传完成后,USB电缆将继续为Arduino板供电,程序存储在Arduino微控制器上的闪存中,您也可以使用电池或其他外部电源在没有USB电缆的情况下运行应用程序。


2、连接外部组件

在上一节中,您使用了Arduino板上已经存在的LED。但是,在大多数实际项目中,您需要将外部组件连接到电路板。为了进行这些连接,Arduino有几个不同类型的引脚:

[Arduino Uno Ports](https://files.realpython.com/media/arduino_ports.ccba6e743d26.png =400x)


虽然这些连接通常被称为引脚,但您可以看到它们并不完全是物理引脚。相反,引脚是插座上的孔,您可以将跳线连接到这些孔上。在上图中,您可以看到不同的引脚组:

  • 橙色矩形:这些是13个 数字引脚,您可以将其用作输入或输出。它们仅适用于具有2个不同级别的数字信号:
    1. 0级:由电压0V表示
    2. 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草图:

Arduino built-in and external LEDs blinking


由于两个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,您可以按照之前所做的相同步骤操作:

  1. 将USB电缆插入PC。
  2. 在IDE上选择适当的板和端口。
  3. 按上传。

上传完成后,您不会注意到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板的数字输入表示:

电平电压
00V
15V

要控制LED,您将使用按钮向Arduino发送数字输入值。按钮应在释放时向电路板发送0V,按下时向电路板发送5V。下图显示了如何将按钮连接到Arduino板:

在这里插入图片描述


您可能会注意到LED连接到数字引脚13上的Arduino,就像以前一样。数字引脚10用作数字输入。要连接按钮,您必须使用10 KOhm电阻,它在该电路中充当下拉电阻。下拉电阻确保释放按钮时数字输入获得0V。

当您释放按钮时,您打开按钮上两根电线之间的连接。由于没有电流流过电阻器,引脚10只是连接到地(GND)。数字输入得到0V,代表0(或低)状态。当你按下按钮时,你给电阻器和数字输入施加5V。电流流过电阻器,数字输入得到5V,代表1(或高)状态。

您也可以使用面包板来组装上述电路:

[Circuit for digital input on breadboard](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行 导入 pyfirmatatime
  • 第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状态。运行此方法时,您必须传递一个字符串参数,该参数由冒号分隔的三个元素组成:

  1. 该类型的引脚(a为模拟或d为数字)
  2. 别针的号码
  3. 该模式的引脚(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等于零。否则,在最初的几次迭代中,通常会得到Noneanalog_value。为了避免在运行程序时出错,您在第13行使用条件来测试analog_value是否为None。然后您控制闪烁LED的周期。

尝试运行程序并更改电位器的位置。您会注意到闪烁LED的频率发生了变化:

Led controlled by an analog input


到目前为止,您已经了解了如何在电路上使用数字输入、数字输出和模拟输入。在下一节中,您将看到如何使用模拟输出。


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)

与您之前使用的程序有一些不同之处:

  1. 在第10行,您通过传递参数'd:11:p'led设置为PWM模式。
  2. 在第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循环:
    1. 当您按下按钮时,LED将打开,messagebox.showinfo()显示一个消息框。
    2. 循环暂停,直到用户按下确定。这样,只要消息在屏幕上,LED就会一直亮着。
    3. 用户按下确定后,root.update()从屏幕上清除消息框,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(二)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2151756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Day02-JS+Vue+Ajax】

1. JS介绍 在前面的课程中&#xff0c;我们已经学习了HTML、CSS的基础内容&#xff0c;我们知道HTML负责网页的结构&#xff0c;而CSS负责的是网页的表现。 而要想让网页具备一定的交互效果&#xff0c;具有一定的动作行为&#xff0c;还得通过JavaScript来实现。那今天,我们就…

Charles抓包工具测试实战

总结 工作原理 主要功能 优点 安装与配置 安装 组件介绍 Charles代理设置 Charles访问控制 客户端 Windows代理设置 MacOS代理设置 IOS手机代理设置 Android手机代理设置 Charles抓包实战 分析问题 抓包 后台出了问题 抓取https数据 全是乱码 Windows证书安装 Charles ht…

项目文件配置

1. 参数配置化 1.1 问题分析 1.2 问题解决 Value 注解通常用于外部配置的属性注入&#xff0c;具体用法为&#xff1a;Value("${配置文件中的key}") 2. yml配置文件 2.1 SpringBoot提供了多种属性配置方式 2.2 常见配置文件格式对比 2.3 yml 基本语法 大小写敏…

如何利用nw.js打包vue项目

引言 最近有一个开发windows桌面应用的需求, 需要将vue项目打包成.exe文件&#xff0c;最好是变成可安装版(非绿色版)。特此记录一下如何通过nw.js将vue项目打包成.exe。可能这种方式不是最优&#xff0c;仅供大家参考&#xff01; nw.js简介&#xff08;以下描述来自nw.js官…

SAP abap-platform-rap-opensap 使用 ABAP RESTful 应用程序编程模型 (RAP)构建应用程序

openSAP 课程“使用 ABAP RESTful 应用程序编程模型 &#xff08;RAP&#xff09; 构建应用程序”的示例。 Description This repository offers optional hands-on exercises for the free openSAP Course Building Apps with the ABAP RESTful Application Programming Mode…

【已解决】华为AR100-S路由器 恢复出厂后,找不到5G wifi的设置

前两帖讨论了华为AR100-S路由器&#xff1a; 一是用电脑浏览器访问web管理界面报错的解决&#xff0c;详情点这里&#xff01; https://blog.csdn.net/weixin_62598385/article/details/142215136 再就是如何回复出厂&#xff0c;也即如何复位&#xff0c; 详情点这里&#xff…

计算机网络nat 映射案列

1 拓扑案列 2 配置 pc 访问外网 # interface LoopBack192 ip address 192.168.1.1 255.255.255.0 # interface Vlan-interface1 ip address 10.1.1.1 255.255.255.0 # # ip route-static 0.0.0.0 0 10.1.1.2 # local-user admin class manage password hash $h$6$0XD4lC…

前端组件库

vant2现在的地址 Vant 2 - Mobile UI Components built on Vue

sqli-lab靶场学习(四)——Less11-14(post方法)

前言 第1-10关都是get方法&#xff0c;本关开始进入post方法。其实post也好get也好&#xff0c;本质都差不多&#xff0c;使用的技巧也基本相同。 Less11 第11关打开是一个输入用户名密码的界面 显然登陆对话框会使用post方式提交&#xff0c;这里我们尝试在Username一栏通过…

【软件基础知识】什么是 API,详细解读

想象一下,你正在使用智能手机上的天气应用。你打开应用,瞬间就能看到实时天气、未来预报,甚至是空气质量指数。但你有没有想过,这些数据是如何神奇地出现在你的屏幕上的?答案就在三个字母中:API。 API,全称Application Programming Interface(应用程序编程接口),是现代软件世…

大数据最新面试题(持续更新)

2024大数据面试题 什么是Hbase&#xff1f;它与Hadoop的关系是什么&#xff1f; Hbase是一个开源的分布式数据库&#xff0c;基于Hadoop的HDFS&#xff0c;用于大数据存储和处理。它提供了高性能的读写能力和可扩展性。 Hbase的架构是什么&#xff1f; Hbase的架构由Region…

C++11——lambda

lambda lambda的介绍lambda的使用lambda的细节->捕捉列表 lambda的介绍 lambda是匿名函数&#xff0c;再适合的场景去使用可以提高代码的可读性。 场景&#xff1a; 假设有一个Goods类需要进行按照价格、数量排序 class Goods {string name;size_t _price;//价格int num;/…

大模型推理性能优化

LLM 推理的核心指标 首 Token 延迟(决定了用户体验) 延迟:从输入到输出最后一个 token 的延迟 吞吐量:每秒针对所有请求生成的 token 数(针对所有并发请求) 推理的性能卡点 1. KV-Cache 大小导致并发能力受限 LLM推理的过程是一个自回归的过程,前 i 次的token会作为…

秒懂Linux之共享内存

目录 共享内存概念 模拟实现共享内存 创建key阶段 ​编辑创建共享内存阶段 删除共享内存阶段 查看共享内存属性阶段 挂接共享内存到进程阶段 取消共享内存与进程挂接阶段 进程通信阶段 添加管道改进版 共享内存函数 shmget函数 shmat函数 shmdt函数 shmctl函数 共享内存概念 共…

第二十一节:学习Redis缓存数据库的Hash操作(自学Spring boot 3.x的第五天)

这节记录下Redis的Hash操作。主要是opsForHash方式和boundHashOps方式。 boundHashOps和opsForHash都是Spring Data Redis中用于操作Redis哈希数据结构的方法&#xff0c;但它们在使用方式和场景上存在一些区别。 boundHashOps 使用方式&#xff1a; boundHashOps方法通过Redi…

【第十三章:Sentosa_DSML社区版-机器学习聚类】

目录 【第十三章&#xff1a;Sentosa_DSML社区版-机器学习聚类】 13.1 KMeans聚类 13.2 二分KMeans聚类 13.3 高斯混合聚类 13.4 模糊C均值聚类 13.5 Canopy聚类 13.6 Canopy-KMeans聚类 13.7 文档主题生成模型聚类 13.8 谱聚类 【第十三章&#xff1a;Sentosa_DSML社…

C#基于SkiaSharp实现印章管理(8)

上一章虽然增加了按路径绘制文本&#xff0c;支持按矩形、圆形、椭圆等路径&#xff0c;但测试时发现通过调整尺寸、偏移量等方式不是很好控制文本的位置。相对而言&#xff0c;使用弧线路径&#xff0c;通过弧线起始角度及弧线角度控制文本位置更简单。同时基于路径绘制文本时…

Chainlit集成LlamaIndex实现知识库高级检索(简单融合寻回器)

检索原理 ** 简单融合寻回器 ** 简单融合寻回原理&#xff0c;是利用多个检索器&#xff0c;融合查询最终的结果返回给LLM。此检索器还将通过生成与原始问题相关的问题&#xff0c;用相关问题再次检索多个检索器的数据&#xff0c;把原始问题和相关问题经过多个检索器检索结果…

Relations Prediction for Knowledge Graph Completion using Large Language Models

文章目录 题目摘要简介相关工作方法论实验结论局限性未来工作 题目 使用大型语言模型进行知识图谱补全的关系预测 论文地址&#xff1a;https://arxiv.org/pdf/2405.02738 项目地址&#xff1a; https://github.com/yao8839836/kg-llm 摘要 知识图谱已被广泛用于以结构化格式表…

高级java每日一道面试题-2024年9月20日-分布式篇-什么是CAP理论?

如果有遗漏,评论区告诉我进行补充 面试官: 什么是CAP理论&#xff1f; 我回答: 在Java高级面试中&#xff0c;CAP理论是一个经常被提及的重要概念&#xff0c;它对于理解分布式系统的设计和优化至关重要。CAP理论是分布式系统理论中的一个重要概念&#xff0c;它描述了一个分…