干簧管是一种可以用磁场控制开关状态的设备。当有磁场时,玻璃管中的两片铁片会贴合,从而导电。干簧管模块也就是基于这个原理的电子模块,有磁场时,输出低电平。

干簧管的应用:

门口灯光:当你开门时,亮灯,关门时熄灯。只需要在门锁上装个干簧管,在门框上装个磁铁就能搞定。

当然,装在门上做防盗报警设备。

还有类似的很多应用场景。这篇文章讨论的就是类似第一种的灯光控制场景,不过并不是有磁场开灯,没磁场关灯,而是检测到磁场时开灯,再次检测到磁场时关灯。并没有什么卵用,只是写给Windows 10 IoT初学者看的起步例子。

一、物理连接:

干簧管端VCC接DC3.3, GND接GROUND, DO接GPIO 05

LED正极接DC3.3, 负极接GPIO 06

二、爆代码

定义GPIO控制器、干簧管的GPIO端口、LED灯的GPIO端口、LED的开关标志

public GpioController GpioController { get; set; }

public GpioPin ReedPin { get; set; }

public GpioPin LedPin { get; set; }

public bool IsLightOn { get; set; }

初始化GPIO控制器

GpioController = GpioController.GetDefault();
if (null != GpioController)
{

}

记住,Windows 10 IoT设备最好判做一下非空的判断,以保证代码在没有GPIO控制器的设备上不会爆。

打开干簧管GPIO端口

ReedPin = GpioController.OpenPin(5);

设置端口模式为输入(因为我们要监听干簧管输出的信号)

ReedPin.SetDriveMode(GpioPinDriveMode.Input);

类似的,打开LED的GPIO端口,并设置端口模式为输出。开灯是输出低电平,关灯是输出高电平。

 LedPin = GpioController.OpenPin(6);
 LedPin.SetDriveMode(GpioPinDriveMode.Output);

LED一开始是熄灭的,所以先输出一个高电平

LedPin.Write(GpioPinValue.High);

然后,当干簧管的端口电平变化的时候,爆一个事件出来:

ReedPin.ValueChanged += (sender, args) =>
{

};

在这个事件里,判断干簧管当前电平是否为低电平,如果是的话,证明遇到了磁场,控制LED的开关:

if (ReedPin.Read() == GpioPinValue.Low)
{
    IsLightOn = !IsLightOn;

    LedPin.Write(IsLightOn ? GpioPinValue.Low : GpioPinValue.High);
}

最后,整个代码看起来就像这样:

using Windows.Devices.Gpio;
using Windows.UI.Xaml.Controls;

namespace WindowsIoTReedLight
{
    public sealed partial class MainPage : Page
    {
        public GpioController GpioController { get; set; }

        public GpioPin ReedPin { get; set; }

        public GpioPin LedPin { get; set; }

        public bool IsLightOn { get; set; }

        public MainPage()
        {
            this.InitializeComponent();

            GpioController = GpioController.GetDefault();
            if (null != GpioController)
            {
                ReedPin = GpioController.OpenPin(5);
                ReedPin.SetDriveMode(GpioPinDriveMode.Input);
                ReedPin.ValueChanged += (sender, args) =>
                {
                    if (ReedPin.Read() == GpioPinValue.Low)
                    {
                        IsLightOn = !IsLightOn;

                        LedPin.Write(IsLightOn ? GpioPinValue.Low : GpioPinValue.High);
                    }
                };

                LedPin = GpioController.OpenPin(6);
                LedPin.SetDriveMode(GpioPinDriveMode.Output);
                LedPin.Write(GpioPinValue.High);
            }
        }
    }
}

三、运行

部署工程到树莓派上,然后拿块磁铁靠近干簧管,灯亮,再次靠近,灯灭。