为啥我必须执行两次按钮功能才能使我的逻辑正常工作?

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() 上设置断点。你到达这条线了吗?

以上是关于为啥我必须执行两次按钮功能才能使我的逻辑正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要在提交按钮上单击两次才能提交我的表单?

按钮需要单击两次才能工作 - 为啥?

为啥我需要单击两次才能在输入字段中生成一个值

必须按两次才能进行 Swift 3 按钮操作

为啥我必须单击两次才能在 Label MouseDown 事件中执行方法

为啥我的word excel 一次打不开,必须两次才能打开,在“打开”中选择文件可以打开。