使用Python整合物理设备与IOTA缠结

项目介绍

这个新手教程相对很简单,但却可以扩展到我们现实生活中很多重要的用例中。教程演示了如何使用IOTA协议接受来自物理设备(机器)提供的服务并为此支付费用。本教程的目标是演示如何基于给定的IOTA地址的当前余额来构建可以ON/OFF切换的简单的电源电路。

我们将使用有网络连接的树莓派和Python编程语言来检查IOTA缠结上的余额,并使用树莓派的内部GIO pin执行所连接的继电器的切换。继电器将再次连接到一个简单的电池供电电路,它能够ON/OFF发光二极管(LED),这里的LED可以代表任何物理设备。

注意!

这个项目的一个简单版本是不使用继电器,直接将LED连接到树莓派的GIO pin。 但是,由于树莓派的GIO pin最多只能提供5V电压,因此我们将使用继电器来证明可以使用相同的基本设置来管理高压设备。然而,选择低功率电路的主要原因是-除非了解自己在作什么,否则任何人都不应该在高压下玩耍。

现实应用

在深入讨论构建这个项目的细节之前,我们应该回过头来展望一下更大的蓝图:像这样一个简单的演示项目如何应用到现实世界的用例中来解决实际问题。

想象一下,你住在一家酒店,每个房间都配有一台冰箱。在大多数情况下,这些冰箱只是放在那里,消耗能源,不被使用,但你最终支付的房费里面还是会包含冰箱的使用费。如果有一种机制可以让你在使用时直接支付冰箱的使用时间,同时在没有使用时自动关闭冰箱而不计费用?这基本上是本教程中要创建的用例,唯一不同的为了方便和安全,我们将用LED来代替冰箱。

现在,让我们尝试描述一系列事件,以演示系统如何实现和使用。

首先,假设酒店老板已经在房间里安装了一台冰箱,在冰箱电源电路中放置了一个继电器。继电器连接到树莓派的内部GIO pin,作为冰箱支付系统的控制单元。接下来,他为冰箱创建了一个IOTA地址,这个地址用于冰箱有新的资金变化时进行监控。最后,他打印了IOTA地址的二维码,并将二维码贴到冰箱上。

现在系统的物理部分已经完成,然后创建一个简单的运行在树莓派上的Python程序来不断检查冰箱IOTA地址是否有新资金变动,并相应地开启/关闭冰箱(继电器)。

现在顾客晚上买了一瓶超棒的白葡萄酒,为了确保它保持凉爽,顾客可以拿起手机,打开他的IOTA钱包,扫描连接到冰箱的二维码,并根据事先计划好的冰箱使用时间将一定数量的IOTA传输到冰箱。

只要交易在缠结上得到确认,冰箱的余额就会增加,余额的变化将由树莓派上运行的Python程序获取。然后树莓派将使用其GIO pin来开启继电器,冰箱就启动运行了。

Python程序将记录顾客使用冰箱的时间和IOTA的数量,不断从活动余额中扣除时间,最后在余额为空时就会关闭冰箱。

注意!

在你想要使用相同设置控制多个设备的情况下,将中央树莓派作为所有设备的公共控制单元来运行可能会更好,其中每个设备都分配有其自己的唯一的IOTA地址。这可能很容易通过对Python代码稍作修改而使用多通道中继来实现。为了简化布线和编码,在本教程中仅管理一个设备,但随后可以随时扩展该项目以管理多个设备。

所需组件

在本节中,我们来看看构建项目所需的不同组件。你应该可以在大多数电子商店买到他们。

树莓派

该项目的“大脑”是树莓派。树莓派用来运行Python代码,监控我们的IOTA缠结地址以获得地址上的资金状态,并处理树莓派的GIO pin。

使用Python整合物理设备与IOTA缠结

继电器

继电器是用于开关电源电路的,从而控制设备的开启和关闭(在本文情况下为LED)。为了简化电路,我们将使用一个继电器模块(屏蔽),它包含内置在模块中的所有必需的组件、插脚和连接器。请注意,你可以购买带有多个可以单独开关的继电器(通道)的模块。如前所述,在需要管理多个设备的情况下,这可能很有用。

使用Python整合物理设备与IOTA缠结

面包板

电路试验板用于连接电路,无需进行任何焊接,便于组装和拆卸。

使用Python整合物理设备与IOTA缠结

发光二极管(LED)

当通电时LED将亮起并代表项目中我们的物理设备(冰箱)。

使用Python整合物理设备与IOTA缠结

电阻(330 ohm)

电阻用于限制发送到LED的电流。如果没有电阻,可能会损坏LED和/或树莓派。应该使用的电阻类型取决于LED的类型和提供给电路的电压。在本文的情况下使用的是9V电池,因此330欧姆的电阻应该没问题。建议事先研究一下你应该使用什么类型的电阻,这取决于在你的项目版本中所使用的组件。

使用Python整合物理设备与IOTA缠结

电池

电池用于为我们的电源电路供电。在本文情况下使用9V电池。

使用Python整合物理设备与IOTA缠结

电线

我们还需要一些电线来将它们连接起来。

使用Python整合物理设备与IOTA缠结

二维码

如果需要使用移动版IOTA钱包支付冰箱(LED)使用费,那么将IOTA付款地址打印出一个二维码是比较方便的。在使用IOTA钱包生成新地址时或在https://thetangle.org上搜索现有地址时,你会发现地址的二维码图片。

使用Python整合物理设备与IOTA缠结

电路连接

现在,让我们看看如何连接这个项目中使用的电路。

使用Python整合物理设备与IOTA缠结

电路连接规则如下:

  1. 将树莓派上的pin 2 (5V)连接到继电器模块上的VCC pin。
  2. 将树莓派上的pin 6(GROUND)连接到继电器模块的GND pin。
  3. 将树莓派上的pin 12 (GPIO18)连接到继电器模块的IN (Signal) pin。
  4. 将继电器模块上的COM端子连接到电池的正极(+)。
  5. 将继电器模块上的NO端子连接到具有电阻器的LED的阳极(+)侧。
  6. 将电池负极(-)连接到LED的阴极(-)侧。

注意!

注意LED上的两个pin具有不同的长度。短pin代表阴极(-)侧,长pin代表LED的阳极(+)。

所需的软件和库

在我们开始为这个项目编写Python代码之前,我们需要确保树莓派上安装了所有必需的软件和库。

  • 首先,我们需要在树莓派上安装操作系统。任何支持树莓派的Linux发行版应该都可以。在本文的例子中,使用了Raspbian发行版,因为它已经包含Python和几个Python编辑器(IDE)。Raspbian发行版安装说明可以在这里找到:https://www.raspberrypi.org/downloads/raspbian/
  • 如果你需要单独安装Python,可以在这里找到它:https://www.python.org/downloads/
  • 最后需要安装PyOTA API库,使我们能够使用Python编程语言访问IOTA缠结。带安装说明的PyIOTA API库可以在这里找到:https://github.com/iotaledger/iota.lib.py

Python代码

既然我们已经连接好了电路,并在树莓派上安装了必要的软件和库,下面开始编写运行项目的实际Python代码。

# Imports some Python Date/Time functions
import time
import datetime

# Imports GPIO library
import RPi.GPIO as GPIO

# Imports the PyOTA library
from iota import Iota
from iota import Address

# Setup O/I PIN's
LEDPIN=18
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(LEDPIN,GPIO.OUT)
GPIO.output(LEDPIN,GPIO.LOW)

# Function for checking address balance on the IOTA tangle.
def checkbalance():

print("Checking balance")
gb_result = api.get_balances(address)
balance = gb_result['balances']
return (balance[0])

# URL to IOTA fullnode used when checking balance
iotaNode = "https://field.carriota.com:443"

# Create an IOTA object
api = Iota(iotaNode, "")

# IOTA address to be checked for new light funds
# IOTA addresses can be created using the IOTA Wallet
address = [Address(b'IKNETWIYVUSILFMIBYEBUMAJOGHU9EEEQLFAVCZLPJWJGYOTWBKKIAFBEUMFYMNFUOQVBJJFFWFISMLGZZTJMHEGFY')]

# Get current address balance at startup and use as baseline for measuring new funds being added.
currentbalance = checkbalance()
lastbalance = currentbalance

# Define some variables
lightbalance = 0
balcheckcount = 0
lightstatus = False

# Main loop that executes every 1 second
while True:

# Check for new funds and add to lightbalance when found.
if balcheckcount == 10:
currentbalance = checkbalance()
if currentbalance > lastbalance:
lightbalance = lightbalance + (currentbalance - lastbalance)
lastbalance = currentbalance
balcheckcount = 0

# Manage light balance and light ON/OFF
if lightbalance > 0:
if lightstatus == False:
print("light ON")
GPIO.output(LEDPIN,GPIO.HIGH)
lightstatus=True
lightbalance = lightbalance -1
else:
if lightstatus == True:
print("light OFF")
GPIO.output(LEDPIN,GPIO.LOW)
lightstatus=False

# Print remaining light balance
print(datetime.timedelta(seconds=lightbalance))

# Increase balance check counter
balcheckcount = balcheckcount +1

# Pause for 1 sec.
time.sleep(1)

这个项目的源代码可以在这里找到:https://gist.github.com/huggre/a3044e6094867fe04096e0c64dc60f3b

运行项目

要运行该项目,首先需要将上述代码保存为树莓派上的文本文件。

请注意,Python程序文件使用.py扩展名,因此我们将该文件保存为树莓派上的let_there_be_light.py。

要执行该程序,只需启动一个新的终端窗口,进入let_there_be_light.py所保存在的文件夹并输入:

python let_there_be_light.py

现在应该可以在终端窗口中看到正在执行的代码,显示当前的用于点亮LED的余额并每10秒钟检查LED的IOTA地址余额以获取新的资金状态。

支付LED点亮费

要打开LED,只需使用IOTA钱包并将一些IOTA传输到LED的IOTA地址。只要交易被IOTA缠结确认,LED就会亮起来并保持常亮,直到LED点亮费的余额为空,具体取决于转移的IOTA数量。在本文例子中,将IOTA与LED点亮时间的兑换比率设置为1IOTA可以点亮LED1秒。

注意!

如果使用手机钱包支付LED点亮费用,可以考虑打印一个二维码,以便在任何想点亮LED的时候可以方便的进行支付。

捐赠作者

如果你喜欢本教程并希望作者继续制作其他教程,可以捐助在Python代码中所使用的作者的IOTA地址。另外,在构建和测试你自己的项目版本时,请保持代码中的IOTA地址,这样当作者的(以及你的)LED亮起时,都会给作者一个很好的提醒,说明其他人正在使用本教程。

 

原文链接:https://medium.com/@hugogregersen/integrating-physical-devices-with-iota-83f4e00cc5bb

胖子李

专栏作者:胖子李

个人简介:我共发表了 190 篇文章,总计被阅读了657,671 次,共获得了 1,884 个赞。

作者邮箱 作者主页 Ta的文章

1条评论 “使用Python整合物理设备与IOTA缠结”

  1. 树莓派访问IOTA地址是同过什么方式?无线?有线?连接到什么的地址?希望有个具体的教程,如果是stm32 就更好了。

发表评论

邮箱地址不会被公开。 必填项已用*标注