我们将使用行人步行按钮实现交通信号灯。 该项目与LED配合使用,这使我们能够在代码执行时看到其状态。 对于交通信号灯(也称为刹车灯),我们将使用红色,黄色和绿色的LED来匹配交通信号灯上的相同颜色的灯。 我们还将使用红色和黄色的LED来表示“请勿行走”(红色)和“行走”(黄色)指示灯。

我们将使用按钮(也称为瞬时按钮),因为它仅在按下时才触发(打开)。 释放后,它不再被触发(关闭)。 触发是用于描述按钮状态的词,其中“触发”表示从按钮的一侧到另一侧的连接已连接(打开)。 保持触发(锁定)的按钮称为闩锁按钮,通常必须再次按下该按钮才能将其关闭。

我们将首先打开绿色交通信号灯LED和红色步行LED信号,以模拟交通信号灯和步行信号。 这是我们将要使用的正常状态。 当按下按钮时,交通信号灯将变成黄色几秒钟,然后变成红色。 几秒钟后,步行信号将变为黄色,几秒钟后将开始闪烁。 再过几秒钟后,步行信号将循环回到红色,交通信号灯变为绿色。

为了使事情变得更加有趣,我们还将看到如何修改该项目,以便使用从网页模拟的按钮。 我们将看到如何通过网络远程控制硬件和代码。 如果使用的Pyboard或其他不具有任何联网功能的MicroPython板,则将需要一个网络模块。 在我们开发项目时,我们将重新修改Pyboard的网络。

零件需求

设置硬件

尽管有很多电线需要使用WiPy进行连接,而对于Pyboard则需要更多,但我们将使用的组件很容易插入面包板上。

使用WiPy的接线图

使用Pyboard的接线图

代码编写

现在该为我们的项目编写代码了。我们将分两部分编写代码。 在第一部分中,我们将看到如何编写代码来模拟人行横道按钮和交通信号灯。 在第二部分中,我们将放弃使用硬件按钮,而是使用Web浏览器来远程控制按钮动作。

正如您将看到的,第2部分将重用第一部分中的大多数代码,但使用HTML服务器代码会更加复杂。 让我们从项目的第一部分开始。

第1部分:交通信号灯模拟器–使用按钮

该项目的第1部分的代码将需要监视按钮,并在按下按钮时如上所述循环照明。 我们还需要代码来初始化将LED设置为初始熄灭的LED。 我们可以编写用于监视按钮和循环LED的函数。 我们将使用中断将按钮的函数绑定到硬件,以便避免使用轮询循环。

导入

设置

该项目的设置代码将需要初始化按钮和LED实例,然后关闭所有LED(以防万一),并打开绿色的停车灯LED和红色的步行信号LED。 下面显示了设置和初始化的代码。

函数

该项目的这一部分需要两个函数。 首先,我们需要一个循环灯光的函数。 其次,我们需要一个监视按钮按下的功能。 让我们看一下循环灯的函数。

我们将自行车灯函数命名为cycle_lights()。 回想一下,我们需要控制灯光如何改变状态。 如前所述,我们以特定的周期进行此操作。 概括地说,当我们要模拟按下步行请求按钮时更改红绿灯时调用此函数。 因此,将从按钮的代码中调用此函数。

下面显示了cycle_lights()按钮的代码。 如您所见,代码非常简单。 唯一棘手的部分可能是用于使黄色步行LED闪烁的循环。

我们将按钮函数命名为button_pressed()。 此函数用作按钮按下中断的回调。 从技术上讲,我们告诉MicroPython将这种方法与pin中断相关联,但稍后我们会看到。 但是,此函数还有另一个元素需要说明。

当我们使用按钮之类的组件并且用户(您)按下按钮时,按钮中的触点不会立即从关闭状态变为打开状态。 在很小的时期内,读取的值不稳定。 因此,我们不能简单地说“引脚何时变高”,因为在引脚上读取的值可能会迅速从低变高(或从高变低)。 这称为弹跳。 我们可以使用代码(以及其他技术)人为地克服这种情况-称为去反弹。

在这种情况下,我们可以检查随时间变化的引脚(按钮)的值,并且仅当该值在此期间保持稳定时,才“触发”按钮按下。下面给出了用于去反弹的代码。 注意,在循环中,我们等待值50毫秒。 如果触发器足够长,我们调用cycle_lights()函数。

最后,当板子检测到中断时,我们需要设置按钮以调用button_pressed()函数。 下面在WiPy上设置回调函数。

第1部分完整代码

测试项目的这一部分需要将源代码文件复制到板上,然后执行它。 由于代码是在没有run()函数的情况下编写的,因此只需导入即可运行代码。 板上电前,请务必检查所有连接。 回想一下,一旦连接到开发板,我们将用于导入和运行代码的命令如下所示。

导入后,代码将运行,您可以按按钮查看灯光在各个阶段中的循环。 如果看不到任何指示灯亮(绿色刹车灯和红色步行信号应亮起),请检查设置和初始化代码。 如果按下按钮时灯不亮,请检查按钮的代码以确保正确无误。 如果它们没有按顺序点亮,则可能是插针接线错误。 遇到问题时,请务必检查所有接线,在断开或重新连接任何电线或组件之前,请务必先关闭电路板的电源。

第2部分:使用HTML远程控制

该部分的代码将使用第一部分中的所有代码,但我们不需要按钮的代码。 相反,我们将使用Socket类创建一个侦听器,以侦听来自Web浏览器的连接。 该代码将向客户端发送一个基于HTML的简短响应(一个简单的网页),该响应包含一个包含两个按钮的表单:一个按钮用于漫游请求,另一个按钮用于关闭服务器代码。 侦听器将在端口80上侦听。

导入

设置

无线网络设置

HTML响应字符串

函数

run()函数

第2部分完整代码(WiPy&Pyboard)

控制Web界面