在CircuitPython上Adafruit IO如何使用W5100S-EVB-Pico2
扫描二维码
随时随地手机看文章
通过遵循本指南,了解使用Adafruit IO在CircuitPython上使用W5100S-EVB-Pico2的基础知识。
学习使用W5100S-EVB-Pico 2一开始可能会让人望而生畏,但使用它实际上非常简单。此外,MicroPython和CircuitPython等平台使得在其上开发项目变得非常容易。
在这个项目中,您将学习使用W5100S-EVB-Pico 2的基础知识,以及如何使用Adafruit IO在CircuitPython上使用它,基于一个简单的LED程序,通过向上或向下移动操纵杆或使用Adafruit IO的控制器依次打开或关闭灯。
首先,让我们从连接图和Adafruit IO的在线用户界面开始。
以上是我的项目结构和用户界面。
这个项目真的很简单。在游戏板上,你可以通过向上移动操纵杆将灯光从红色变为绿色,向下移动操纵杆,灯光将从绿色变为红色。同时,在控制器上按向上键,灯由红色变为绿色,按向下键,灯由绿色变为红色,灯由绿色变为红色。
用户界面还将在电源切换按钮下方显示哪些灯已经打开或关闭。
设置板
在开发项目之前,我们需要配置该块以与CircuitPython兼容。进入CircuitPython下载页面,搜索W5100-EVB-Pico 2并将UF2文件下载到本地计算机上。
通过按住BOOTLEG按钮将您的电路板与PC连接并连接到PC。
将UF2文件拖到单板的驱动器上。
您的板子现在应该包含这些文件。
您现在可以根据连接图连接模块,也可以用以太网电缆连接路由器。
设置用户界面
让我们从制作用户界面开始。
去Adafruit的网站,以用户身份登录/注册。
登录后,进入他们的IO页面。
找到网页顶部的提要页面,创建5个提要,它们是
•电源
•控制器
•红色
•绿色
•蓝色
第一列是提要的名称。第二列是提要的关键。第三列是最近推送到提要的值。
该密钥用于评估板和接口之间的数据传输。这些提要中的值影响用户界面的状态或评估板的状态。
您可以通过单击提要并按提要信息来更改名称或键。
接下来,转到仪表板选项卡。
添加一个按钮块,并将其与电源绑定。
将“开启值”设置为1,“关闭值”设置为0。
这意味着当提要中的值更新为1时,该块将切换到On状态。如果该值不等于1,则该块将处于关闭状态。
接下来,创建一个控制器块并将其与控件提要绑定。
按预览选项卡上的按钮查看控制器上的每个值。
我们将使用的唯一两个按钮是UP和DOWN按钮,它们对应的值是5和13。
最后,为每种颜色制作三个指示块,并分别绑定颜色馈送。
将标题和On颜色更改为已绑定到的颜色提要。将条件设置为等于1.0,这样只有值1才会打开指示块。
根据需要配置块的位置。
完成接口的设置。
编码前的准备
在编写项目代码之前,我们仍然需要下载库来帮助我们更容易地开发项目。
进入CircuitPython的库页面,将包含MPY库的bundle zip文件夹下载到您的计算机上。
将这5个文件解压到电路板的lib文件夹中。
1. adafruit_io
2. adafruit_miniqtt
3. adafruit_wiznet5k
4. adafruit_connection_manager
5. adafruit_requests
接下来,在lib文件夹中创建一个名为secrets.py的文本文件。
转到此链接并将JSON代码粘贴到文本文件中。
找到你的名字和令牌去Adafruit IO和按下键选项卡在页面的右上角。
将aio_name和aio_key粘贴到secrets.py文件中。JSON中的其他变量可以忽略,因为我们不会在这个项目中使用它们。
在CircuitPython上编码
让我们开始使用CircuitPython上的web编辑器编写项目代码。
转到CircuitPython的代码编辑器,并记住将电路板连接到计算机上。
按connect选项卡,选择您的设备并在代码编辑器上打开code.py。
必需的库
首先将库导入到文件中。
记住,在使用Adafruit接口之前,我们还需要这个secrets.py文件,所以让我们使用下面的代码来检查lib文件夹是否包含这个文件。
如果没有secrets.py文件,程序将在执行主代码之前立即终止。
模块和单板端口设置
接下来,让我们用模块设置板的端口。
根据连接图,我将摇臂模块的垂直组件连接到GP26上,绿、黄、红灯分别连接到GP11、13、15上。
首先,让我们初始化GP26的引脚。
由于我们的Rocker模块是一个模拟信号模块,我们使用CircuitPython的AnalogIn函数将引脚26设置为对板的模拟输入。
对于红绿灯模块,模块将接收GP11、gp13和gp15的数字信号,打开模块上各自的信号灯。因此,我们可以使用CircuitPython的DigitalInOut函数将端口设置为数字信号。我们还需要将方向更改为OUTPUT。
为了按顺序打开灯,我们还需要创建一个列表,以红色、黄色和绿色的顺序存储3盏灯。
旁注:在W5100S-EVB-Pico 2中,有用于模拟信号和数字信号的端口。您可以参考以下图片或访问Wiznet的官方网站来查找ADC端口
以太网连接
接下来,让我们使用该板的以太网功能。
首先将SPI接口Pin与CircuitPython连接。
对于电路板的特定引脚,您可以查看Wiznet官方网站提供的这张图表。
正如您所看到的,引脚16-19对板的SPI接口有特定的用途。使用以下代码设置SPI接口。
使用adafruit.wiznet5k提供的WIZNET5K功能将它们组合为以太网接口。查看Github页面了解更多信息。
接下来,要使用HTTP连接到万维网,我们需要为以太网接口设置一个请求会话。我们可以使用下面的代码初始化SSL请求会话。
请求会话是为HTTP请求保留的。我们可以注释这一行。
以太网接口的最终部分如下:
MQTT通信集
让我们开始将我们的板制作成一个MQTT客户机,准备好侦听Adafruit IO消息。
我们可以用这个函数来设置客户机。
在MQTT内部。MQTT函数,在使用该函数之前需要填写几个参数。
参考Adafruit的MQTT API网站,您可以在MQTT Connection Details小节的HOST Name中找到broker的参数。当我们将用户身份验证信息存储在secrets.py文件中时,我们可以简单地从secrets JSON中获取这些信息并加载到MQTT函数中。将is_ssl设置为True允许我们连接到8883端口上的Adafruit MQTT Api。最后,我们通过引用前面的代码为MQTT客户机设置池和上下文。
当我们设置客户机时,我们需要为客户机的不同用途创建回调函数。
在这个项目中,我们想做回调函数,当客户端连接,断开或接收/发送消息。
连接功能
这个函数在我们第一次连接到Adafruit IO服务器时被调用。当我们连接到功能时,我们应该订阅电源馈送和控制器馈送。
订阅提要将允许在该提要中更新的任何消息触发您的消息功能。每当您从订阅的提要收到消息时,程序就会执行此操作。
在CircuitPython中,你可以使用client.subscribe("some_topic")来订阅物联网平台上的任何主题/提要。
但是,不同的平台可能需要不同的主题格式。因此,我们需要检查网站的MQTT API页面,以便查找主题的格式。
您可以在Adafruit的MQTT API页面中找到MQTT API主题格式。
如上所示,主题格式为的形式
因此,让我们将电源和控制器提要设置为可订阅的主题,因为我们希望电源和控制器提要上的任何更新都能触发影响程序的消息函数。
将这两个主题放入一个名为subscribe_feed_list的列表中。
我们还需要为3个LED灯设置主题,因为我们也将使用此格式将数据发布到这些主题。
将3个LED主题放入红色,黄色和绿色的顺序列表中,因为我们要按顺序发布到这些主题。
最后,在Connected函数中,我们运行for循环来订阅两个提要。
断开功能
当我们从MQTT服务器断开连接时,将调用该函数。
在这个项目中,我只是添加了一条print语句来通知用户客户端已经在终端中成功断开连接。
消息函数
当订阅的主题中有任何更新时,将调用此函数。
由于订阅了两个不同的主题,因此首先需要确定哪个主题触发了消息函数。
让我们首先在接收到有关电源主题的更新时定义该函数。
启动设备后,电源按钮将切换为打开状态。正如我们之前设计的电源开关在输入值为1时打开一样,我们将在这3个函数之外发布一个值为1的电源开关,以通知接口我们已经打开了设备。
在界面中,用户可以将电源开关切换到关闭状态。这将导致feed值更新为0,此时应该关闭机器。
因此,我们希望获得电源馈送的最新值,并确定我们的程序是否停止。
在这段代码中,我们使用global关键字允许将这个局部函数更改为位于该函数外部的power变量。然后根据功率开关的最新值将功率设置为True或False,该值在1和0之间变化。
接下来,让我们在接收到控制器主题的更新时定义该函数。
当用户按下控制器块上的任何按钮时,将在控制器提要中发布一个值。在我们的项目中,因为我们只使用UP和DOWN按钮,所以我们的函数只需要处理这两个值,即值5表示UP,值13表示DOWN。
在下一节中,我将分别解释打开和关闭灯的算法。
打开灯的算法
在开灯之前,我们需要先处理最大的情况,即如果所有的灯都开着,我们不能继续增加要开的灯的数量。
为了跟踪打开的灯的数量,我使用了一个名为current_light_on_pos的变量来跟踪已打开的当前LED位置的位置。
也就是说,位置0是指只有红灯亮,位置1是指红黄灯都亮,位置2是指所有灯都亮。在current_light_on_pos中还包含并初始化了一个额外的位置-1,它指的是所有的灯都关闭了。
因此,如果current_light_on_pos的值为2,则表示不能再打开灯了,因此我们从终端通知用户不能再打开灯了。
在处理了最大值情况之后,让我们继续讨论开灯的函数。
当我们按下控制器上的UP按钮时,我们应该首先将current_light_on_pos增加1,并通过使用led_set[current_light_on_pos]在新位置上打开列表内的灯。value = True。最后,我们将值1发布到Adafruit IO到相应的颜色主题,因为我们希望界面显示已打开的颜色。
关掉灯的算法
同样,让我们先处理最小情况,也就是所有灯都关闭的情况。
如果current_light_on_pos中的值为-1,则表示所有的灯都关闭了。因此,我们需要通知用户,我们不能在终端关闭更多的灯。
在处理了最小情况之后,让我们继续讨论关灯的函数。
当我们按下控制器上的DOWN按钮时,我们应该首先通过led_set[current_light_on_pos]关闭列表中current_light_on_pos处的灯。value = False,并将值0发布到Adafruit IO对应的色源。最后,我们将current_light_on_pos减1,以更新当前已打开的灯的最新位置。
最后,由于我们将更改current_light_on_pos的值和led_set中的值,我们需要在函数中使用global关键字设置它们。
这就完成了MQTT客户机的消息功能。
全消息功能:
主程序
现在让我们完成主板将要运行的主程序。
我们首先初始化程序中要使用的剩余变量。
power变量被用作while循环的条件,以保持主程序的运行,直到power变为False(即从在线界面关闭)。我们还应该初始化消息变量,以便在客户机中使用。消息的功能。
接下来,让我们将定义的MQTT客户机连接到MQTT服务器,即Adafruit IO。
只需使用MQTT.connect()函数连接到服务器,这将同时触发我们前面定义的MQTT.connected()函数。同时,我们将值1发布到Adafruit IO,以将电源开关更改为On状态。
让我们为程序编写while循环。这个while循环将一直运行,直到power变量变为False。在while循环内部,为了维护与MQTT服务器的连接,我们需要使用MQTT.loop()。
对于while循环内的函数。我们希望摇臂模块的输入打开或关闭灯。让我们定义read_Vertical = Dir_Vertical这个值。用于存储操纵杆垂直值的当前值。然后,我们简单地使用我们之前定义的相同的光响应算法,但使用不同的条件来触发灯亮和关灯功能。
您可以为代码设置自己的阈值,但我使用60000作为打开灯的上限阈值,3000作为关闭灯的下限阈值。
最后,添加一个时间。Sleep函数限制while循环的指令。
复位和断开
最后,当退出while循环时,需要将接口上的所有内容重置为默认状态,并断开与服务器的连接。只需运行for循环并将相应的默认值发布到电源馈送和LED馈送,它们都是0,然后断开与服务器的连接。
结论
这里结束了项目代码和设置。您可以根据上述步骤进行编码,也可以在GitHub页面中试用代码。如果你有任何问题,你也可以在YouTube视频下评论。我希望这有助于您更多地了解如何在CircuitPython上使用W5100S-EVB-Pico 2,并开始您的第一个物联网创建之旅。
本文编译自hackster.io