我正在写一个Netduino 3程序,它将控制转向灯和其他继电器用于hayrides。我的程序是在我拿到设备之前编写的,所以我不确定它的效果如何,但我已经遇到了其中一个按钮(hazardButton
)的问题。应用3.3v
时,它不会触发中断。应用5v
也是如此,但在应用GND
时会触发中断,但重新应用GND
时,它不会关闭中断。
这是我的代码:
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
namespace Tractor_Mate
{
public class Program
{
static InterruptPort hazardButton = new InterruptPort(Pins.GPIO_PIN_D0, false, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeBoth);
static OutputPort hazardLights = new OutputPort(Pins.ONBOARD_LED, false);
static bool hazardsActive = false;
public static void Main()
{
Debug.Print("Initializing Inputs... ");
hazardButton.OnInterrupt += new NativeEventHandler(hazardButton_OnInterrupt);
Thread.Sleep(Timeout.Infinite);
}
static void hazardButton_OnInterrupt(uint data1, uint data2, DateTime time)
{
while (data2 == 0)
{
hazardLights.Write(true);
Thread.Sleep(500);
hazardLights.Write(false);
Thread.Sleep(500);
hazardsActive = true;
}
hazardsActive = false;
}
}
}
我遇到Hazard Lights
的问题,还没有尝试过任何其他问题。我将按钮连接起来,这样当引脚转到HIGH
时它会触发,然后当LOW
将其关闭时。
答案 0 :(得分:0)
public class Program
{
static InterruptPort hazardButton = new InterruptPort(Pins.GPIO_PIN_D0, false, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeBoth);
static OutputPort hazardLights = new OutputPort(Pins.ONBOARD_LED, false);
static volatile bool hazardsActive = false;
public static void Main()
{
Debug.Print("Initializing Inputs... ");
hazardButton.OnInterrupt += new NativeEventHandler(hazardButton_OnInterrupt);
bool lightOn = true;
while (true)
{
if (!hazardsActive)
{
hazardLights.Write(false);
}
else
{
hazardLights.Write(lightOn);
lightOn = !lightOn;
}
Thread.Sleep(500);
}
}
static void hazardButton_OnInterrupt(uint data1, uint data2, DateTime time)
{
hazardsActive = !hazardsActive;
}
}
我无法测试这个,因为我没有安装Netduino SDK(我有一个NetDuino,但是我玩了它已经有一段时间了)。原则很简单:
中断仅切换打开或关闭的危险。该变量标记为volatile
,因为它可以从多个线程设置,并且需要从寄存器读取而不是线程缓存,因此volatile
告诉编译器不要优化它。
main
方法具有无限循环,可检查危险是否开启。当危险关闭时(if
的第一部分),它会向输出引脚写入错误(可能会关闭灯,除非引脚被反转)。
当危险开启时(else
部分),它会向引脚写入一个值,然后反转该值,以便下次关闭它,然后打开,然后关闭等。最后一部分循环再等循环再等待500ms。
注意强>
根据您使用的按钮中的联系人的“质量”,您可能需要向中断处理程序添加去抖动逻辑。 “弹跳”是开关触点(或任何其他机械触点)的现象,当更改状态时,该触点可以非常快速地使触点多次打开/关闭。这是由于电信号弥合了间隙,因为触点彼此非常接近(认为静电跳过间隙)。很多时候这是通过电容在硬件方面处理的,但我不确定Netduino如何处理它。