Я пишу простую программу сигнализации, в которой используется датчик движения 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();
}
}
Фактический результат: Датчик активен по умолчанию. Первый щелчок, все еще активен. Второй клик, все еще активен. Третий клик, неактивный и последующие клики работают так, как должно быть (вкл. И выкл.).
Любая идея, что происходит? Я пытался понять это в течение нескольких часов
Любой набор
static bool onOff = true;
если вы хотите, чтобы ваш датчик активен в начале.
или в Main():
motionSensor.DisableInterrupt();
если вы хотите, чтобы ваш сановник неактивен в начале.