Почему я должен выполнить мою функцию кнопки дважды, чтобы моя логика работала правильно?

1

Я пишу простую программу сигнализации, в которой используется датчик движения 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();

    }


}

Фактический результат: Датчик активен по умолчанию. Первый щелчок, все еще активен. Второй клик, все еще активен. Третий клик, неактивный и последующие клики работают так, как должно быть (вкл. И выкл.).

Любая идея, что происходит? Я пытался понять это в течение нескольких часов

Теги:
logic
microcontroller
motion-detection
netduino

1 ответ

1

Любой набор

static bool onOff = true;

если вы хотите, чтобы ваш датчик активен в начале.

или в Main():

motionSensor.DisableInterrupt();

если вы хотите, чтобы ваш сановник неактивен в начале.

  • 0
    Мое намерение состоит в том, чтобы сделать датчик вначале неактивным. Вставив второй метод в Main (), переключение даже не работает. Это постоянно неактивно.
  • 0
    Установите точку останова на motionSensor.EnableInterrupt (). Вы достигаете этой линии?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню