为啥我必须执行两次按钮功能才能使我的逻辑正常工作?
Posted
技术标签:
【中文标题】为啥我必须执行两次按钮功能才能使我的逻辑正常工作?【英文标题】:Why do I have to execute my button function twice in order for my logic to work properly?为什么我必须执行两次按钮功能才能使我的逻辑正常工作? 【发布时间】:2015-01-11 16:07:55 【问题描述】:我正在编写一个简单的警报程序,该程序使用检测入侵的 PIR 运动传感器。
我的预期逻辑是尝试为我的传感器打开或关闭切换按钮。默认情况下,传感器应处于非活动状态/关闭状态,除非单击第一次,否则在这种情况下传感器将处于活动状态。
这是代码
public class Program
static InterruptPort motionSensor = new InterruptPort(Pins.GPIO_PIN_D0, false, ResistorModes.Disabled, InterruptModes.InterruptEdgeLow);
static OutputPort redLED = new OutputPort(Pins.GPIO_PIN_D9, false);
static OutputPort greenLED = new OutputPort(Pins.GPIO_PIN_D6, false);
static OutputPort blueLED = new OutputPort(Pins.GPIO_PIN_D5, false);
static InterruptPort onboardBtn = new InterruptPort(Pins.ONBOARD_BTN, false, Port.ResistorMode.Disabled, InterruptModes.InterruptEdgeLow);
static bool onOff;
public static void Main()
onboardBtn.OnInterrupt += new NativeEventHandler(onboardBtn_onInterrupt);
motionSensor.OnInterrupt += new NativeEventHandler(motion_onInterrupt);
while (true)
Thread.Sleep(Timeout.Infinite);
static void onboardBtn_onInterrupt(UInt32 data1, UInt32 data2, DateTime Timeout)
onboardBtn.DisableInterrupt();
//Motion Sensor
if (onOff == false)
motionSensor.DisableInterrupt();
onOff = true;
else
motionSensor.EnableInterrupt();
onOff = false;
onboardBtn.EnableInterrupt();
static void motion_onInterrupt(uint data1, uint data2, DateTime time)
motionSensor.DisableInterrupt();
Debug.Print("Movement found ");
int i = 0;
while (i < 5)
blueLED.Write(true);
Thread.Sleep(100);
blueLED.Write(false);
Thread.Sleep(50);
redLED.Write(true);
Thread.Sleep(100);
redLED.Write(false);
Thread.Sleep(50);
i++;
motionSensor.EnableInterrupt();
实际结果是:传感器默认处于活动状态。第一次单击,仍然处于活动状态。第二次点击,仍然有效。第三次点击,不活动,随后的点击按原样工作(打开和关闭)。
知道发生了什么吗?我已经尝试了好几个小时了
【问题讨论】:
【参考方案1】:任意设置
static bool onOff = true;
如果您希望您的传感器在开始时处于活动状态。
或在Main()中:
motionSensor.DisableInterrupt();
如果您希望您的传感器在开始时处于非活动状态。
【讨论】:
我的目的是让传感器在开始时处于非活动状态。通过在 Main() 中插入第二个方法,toggle 甚至不起作用。它一直处于不活动状态。 在 motionSensor.EnableInterrupt() 上设置断点。你到达这条线了吗?以上是关于为啥我必须执行两次按钮功能才能使我的逻辑正常工作?的主要内容,如果未能解决你的问题,请参考以下文章