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

本文介紹如何透過紅外線動作感測器(PIR Motion Sensor)來偵測是否有人,然後控制 LED 燈的開跟關。

作業系統

Windows 10 IOT Core

設備

Raspberry Pi 2

紅外線動作感測器(PIR Motion Sensor)

LED燈

麵包板

電阻

杜邦線

實作

在先前的文章中「安裝 Windows 10 IoT core 到 Raspberry Pi 2」,使用 Blinky 專案來讓 LED 燈一閃一閃的。

再來,我們可以拿一個 紅外線動作感測器 (PIR Motion Sensor) 來偵測是否有人,

有人的話,就讓 LED燈 亮起來,不然就關掉LED燈。

所以,而 LED燈 就依 Blinky 專案 的接法,詳細請參考「安裝 Windows 10 IoT core 到 Raspberry Pi 2

再來就是將 PIR Motion Sensor 接到 PI 的 GPIO 上面,

VCC 接 PI 的 5V 接腳,

GND就接 PI 的接地 ,

而 OUT 就接 GPIO 12 (PIN 32),如下圖,

準備就緒後,就可以來開始寫程式了,

新增一個 「Background Application (IoT)」 專案,取名為 InfraredRayTest ,如下,

因為要使用 GPIO ,所以要加入「Windows IoT Extensions for the UWP」,如下,

參考 BlinkyHeadlessCS 專案

先設定GPIO,再透過 Timer 每 1 秒問 PIR Motion Sensor 是否有偵測到人,

有的話,就設定 LED燈 為 Low, LED燈就會亮起來了,程式如下,

using System;
using Windows.ApplicationModel.Background;
//加入以下的using
using Windows.Devices.Gpio;
using Windows.System.Threading;

namespace InfraredRayTest
{
    public sealed class StartupTask : IBackgroundTask
    {
        BackgroundTaskDeferral deferral;
        private GpioPinValue irPinValue = GpioPinValue.Low;
        private const int LED_PIN = 5; // pin 29
        private GpioPin ledPin;
        private const int IR_PIN = 12; // pin 32
        private GpioPin irPin;
        private ThreadPoolTimer timer;
        public void Run(IBackgroundTaskInstance taskInstance)
        {
            deferral = taskInstance.GetDeferral();
            InitGPIO();
            timer = ThreadPoolTimer.CreatePeriodicTimer(Timer_Tick, TimeSpan.FromMilliseconds(1000));
        }

        private void InitGPIO()
        {
            //設定 LED
            ledPin = GpioController.GetDefault().OpenPin(LED_PIN);
            //一開始不要亮!
            ledPin.Write(GpioPinValue.High);
            ledPin.SetDriveMode(GpioPinDriveMode.Output);

            //設定 紅外線 Sensor
            irPin = GpioController.GetDefault().OpenPin(IR_PIN);
            irPin.SetDriveMode(GpioPinDriveMode.Input);
        }

        private void Timer_Tick(ThreadPoolTimer timer)
        {
            irPinValue = irPin.Read();
            //紅外線偵測到,就開啟 LED 燈 (設定為Low),沒有就關掉它 (設定為High)
            //當LED一支腳為3.3V,GPIO 5 為 High ,因為電位差為0,所以不會亮。
            GpioPinValue ledPinValue = (irPinValue == GpioPinValue.High) ? GpioPinValue.Low : GpioPinValue.High;
            ledPin.Write(ledPinValue);
        }
    }
}

再來就可以透過 VS.NET 將程式部署到 PI 上面,然後測試看看結果,如下,

如果有偵測到人,就會讓 LED燈亮起來,如下,

沒有LED燈就熄掉,如下,

特別感謝

同事 Kent 借 紅外線動作感測器(PIR Motion Sensor) 給我們測試

同事 Wright 對於設備的串接與教導

參考資料

Arduino 筆記 – Lab20 用紅外線動作感測器 (PIR Motion Sensor) 控制 LED 的開關

Hi, 

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

請大家繼續支持 ^_^