在前篇「用紅外線動作感測器(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:從零開始的軟體開發生活」
請大家繼續支持 ^_^