[IOT]用紅外線動作感測器來偵測是否有人,控制 LED 燈的開跟關(II)

在前篇「用紅外線動作感測器(PIR Motion Sensor)來偵測是否有人,控制 LED 燈的開跟關」,

是透過 ThreadPoolTimer 每一秒去檢查 PIR 的值是否為 High,

像這種Check Value是否為High或是Low,它的行為跟Button一樣。

所以我們可以改用 GpioPin 的 ValueChanged 事件來 Handle它。

作業系統

Windows 10 IOT Core

設備

Raspberry Pi 2
紅外線動作感測器(PIR Motion Sensor)
LED燈
麵包板
杜邦線

實作

這次我們的電接 3.3 V 的就可以了,所以大顆的 LED燈 就不用接電阻了。

而 LED燈 我們接在 GPIO 4, 而 PIR 的 Output 就接在 GPIO 17。

而偵測到值為High時,就讓 LED 閃3下。 程式如下,

//Global Vars ...
//LED 相關
private const int LED_GPIO_4 = 4;
private GpioPin _gpLED4 = null;

// for PIR
private const int PIR_GPIO_17 = 17;
private GpioPin _gpPIR17 = null;
		
		

public MainPage()
{
	this.InitializeComponent();
	try
	{
		//初始設定 LED燈
		InitGPIO_LED4();
		//初始設定 PIR Sensor
		InitGPIO_PIR17();
	}
	catch (Exception ex)
	{
		throw;
	}
}

//初始設定 LED燈
private void InitGPIO_LED4()
{
	var gpio = GpioController.GetDefault();
	if (gpio != null)
	{
		_gpLED4 = gpio.OpenPin(LED_GPIO_4);
		_gpLED4.Write(GpioPinValue.Low);
		_gpLED4.SetDriveMode(GpioPinDriveMode.Output);
	}
	else
	{
		//ShowLog("Not support GPIO!!!");
	}
}

//初始設定 PIR Sensor
private void InitGPIO_PIR17()
{
	var gpio = GpioController.GetDefault();
	if (gpio != null)
	{
		_gpPIR17 = gpio.OpenPin(PIR_GPIO_17);
		if (_gpPIR17.IsDriveModeSupported(GpioPinDriveMode.InputPullUp))
			_gpPIR17.SetDriveMode(GpioPinDriveMode.InputPullUp);
		else
			_gpPIR17.SetDriveMode(GpioPinDriveMode.Input);
			
		// Set a debounce timeout to filter out switch bounce noise from a button press
		_gpPIR17.DebounceTimeout = TimeSpan.FromMilliseconds(50);
		_gpPIR17.ValueChanged += _gpPIR17_ValueChanged;  
	}
	else
	{
		//ShowLog("Not support GPIO!!!");
	}
}

private void _gpPIR17_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e)
{
	if (e.Edge == GpioPinEdge.FallingEdge)
	{
		//偵測到值為High時,就讓 LED 閃3下
		var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => {
			_gpLED4.Write(GpioPinValue.High);
			await Task.Delay(TimeSpan.FromSeconds(1));
			_gpLED4.Write(GpioPinValue.Low);
			await Task.Delay(TimeSpan.FromSeconds(0.5));
			_gpLED4.Write(GpioPinValue.High);
			await Task.Delay(TimeSpan.FromSeconds(1));
			_gpLED4.Write(GpioPinValue.Low);
			await Task.Delay(TimeSpan.FromSeconds(0.5));
			_gpLED4.Write(GpioPinValue.High);
			await Task.Delay(TimeSpan.FromSeconds(1));
			_gpLED4.Write(GpioPinValue.Low);
		});
	}
 }

其中 DebounceTimeout 的設定是為了去 避免 值在變化時的 雜訊,就像 Button 我們按下去時,Low 到 High 中間會有一些 值。

參考資料

用紅外線動作感測器(PIR Motion Sensor)來偵測是否有人,控制 LED 燈的開跟關

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^