前几天在淘宝上买了个长得这样的土壤湿度传感器:

结果搜了一圈,网上似乎还没有Windows 10的例子代码,又只能自己爆了。

这个传感器有4个阵脚,意思分别是:

针脚 含义
AO 模拟信号输出
DO  数字信号输出 
GND  电源负极 
VCC  电源正极 

所以,我们把VCC接到树莓派的DC3.3v输出上,我用的是PIN 01,GND接在任何一个接地端口上,我用的是PIN 09,DO输出接任何一个空闲的GPIO端口,我用的是21。如果不清楚树莓派端口布局的朋友可以参考这张图:

连线完成就像是这样:

电源连通之后,电源灯会亮起:

调节传感器上的旋钮(蓝色的菊花),这个是灵敏度的校准,也是个阈值,直到在干燥空气中不让DO-LED亮起。

倒一杯水,或者没有水的话,舔一下传感器的触角,DO-LED应该会亮起,这时候就校准好了。然后就能爆代码了!!!

这个传感器在干燥时候输出的是高电平,遇到水输出低电平。根据这个原理,把代码爆成这样:

public GpioPin MoistureSensorOutputPin { get; set; }

public DispatcherTimer DispatcherTimer { get; set; }

public MainPage()
{
    this.InitializeComponent();
    Loaded += OnLoaded;
}

private async void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
    var ctl = await GpioController.GetDefaultAsync();
    MoistureSensorOutputPin = ctl?.OpenPin(21);
    if (MoistureSensorOutputPin != null)
    {
        MoistureSensorOutputPin.SetDriveMode(GpioPinDriveMode.Input);
        DispatcherTimer = new DispatcherTimer()
        {
            Interval = TimeSpan.FromSeconds(1)
        };
        DispatcherTimer.Tick += (O_O, n_n) =>
        {
            var pinValue = MoistureSensorOutputPin.Read();
            if (pinValue == GpioPinValue.High)
            {
                Debug.WriteLine("Dry");
            }
            else
            {
                Debug.WriteLine("Water Detected!");
            }
        };
        DispatcherTimer.Start();
    }
}

注意不要用这个事件:

public event TypedEventHandler<GpioPin, GpioPinValueChangedEventArgs> ValueChanged;

这个会重复输出好多次的。。。

运行结果