繁体   English   中英

C#中的Raspberry 3按钮

[英]Raspberry 3 push button in c#

我正在通过Visual Studio和Windows 10 IoT试用Raspberry的C#。 只是花了我一个永恒的时间才能使一切正常,但是我慢慢地到达了那里。 按照他们过时的2年制教程,我了解了led的工作原理。 我现在正尝试在面包板上添加一个按钮来打开和关闭LED……可惜的是,这根本不起作用。 就像ValueChanged永远不会被触发。

我遵循了该指南: https : //developer.microsoft.com/en-us/windows/iot/samples/pushbutton

我的按钮的接线方式是:1个引脚直接接地,另一个引脚连接GPIO18(引脚12)

在问题出现之前,是的,我也尝试过使用GPIO5。 我刚刚回到GPIO18,因为它之前在我的python脚本上工作。

这是我要运行的代码,但是有按钮问题(指示灯很好):

public sealed class StartupTask : IBackgroundTask
{
    private GpioController gpio = GpioController.GetDefault();
    private GpioPin pinRed;
    private GpioPin pinBlue;
    private GpioPin pinButton;
    private GpioPinValue pinValue;
    private const int BLUE_PIN = 19;
    private const int RED_PIN = 26;
    private const int BUTTON_PIN = 18;

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        Debug.WriteLine("initialising");

        InitGpio();
        if (pinRed != null)
        {
            pinValue = GpioPinValue.High;
            pinRed.Write(pinValue);
            pinBlue.Write(pinValue);
        }
    }

    private void InitGpio()
    {
        gpio = GpioController.GetDefault();

        if (gpio == null)
        {
            pinRed = null;
            pinBlue = null;
            pinButton = null;
            Debug.WriteLine("Failed starting GPIO");
            return;
        }

        pinValue = GpioPinValue.Low;

        pinRed = gpio.OpenPin(RED_PIN);
        pinRed.Write(pinValue);
        pinRed.SetDriveMode(GpioPinDriveMode.Output);

        pinBlue = gpio.OpenPin(BLUE_PIN);
        pinBlue.Write(pinValue);
        pinBlue.SetDriveMode(GpioPinDriveMode.Output);

        pinButton = gpio.OpenPin(BUTTON_PIN);
        if (pinButton.IsDriveModeSupported(GpioPinDriveMode.InputPullUp))
        {
            Debug.WriteLine("Is supported");
            pinButton.SetDriveMode(GpioPinDriveMode.InputPullUp);
        }
        else
        {
            Debug.WriteLine("Not supported");
            pinButton.SetDriveMode(GpioPinDriveMode.Input);
        }

        pinButton.DebounceTimeout = TimeSpan.FromMilliseconds(50);
        pinButton.ValueChanged += buttonValueChange;

        Debug.WriteLine("GPIO initialised");
    }

    private void buttonValueChange(GpioPin sender, GpioPinValueChangedEventArgs e)
    {
        Debug.WriteLine("here");
        if (e.Edge == GpioPinEdge.FallingEdge)
        {
            Debug.WriteLine("Button push");

            pinValue = (pinValue == GpioPinValue.Low) ? GpioPinValue.High : GpioPinValue.Low;
            pinRed.Write(pinValue);
            pinBlue.Write(pinValue);
        }
        else
        {
            Debug.WriteLine("Button release");
        }
    }
}

是的,正如我所说,许多调试行都在Raspberry上试用C#(支持InputPullUp)。 buttonValueChange中的“这里”从不触发。 我在Python上进行了完全相同的接线设置,并且在相同的引脚上可以完美地工作。

建议此处ValueChanged不使用C#Win10 Iot触发,即“当Run方法结束时,除非创建了延迟对象,否则后台应用程序结束。”

因此,您可以尝试将此行添加到Run代码中:

var deferral = taskInstance.GetDeferral();

看看是否有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM