длительный импульс для входа GPIO C # UWP - PullRequest
0 голосов
/ 04 октября 2019

К моей малине подключен цифровой акустический датчик.
Каждый раз, когда он обнаруживает звук, он устанавливает входной сигнал ВЫСОКИЙ. Но он, кажется, активен только в течение нескольких миллисекунд.
Как я могу продлить сигнал в моей программе, что он остается на 500 мс?
Это функциональность, которую я знаю из контроллеров ПЛК.

Диаграмма
Пуск: вход датчика
Q: длительный сигнал

diagram
,

Вот мой подход с ответом Михаэля:
Но все-таки это не относится к Task.Delay. Это уходит напрямую.

    public MainPage()
    {
        this.InitializeComponent();
        GPIOinit();
        Serial();
    }


    private void GPIOinit()
    {
        const int PIN_AKUSTIK = 19;

        GpioController gpio = GpioController.GetDefault();  //GPIO-Controller mit Default belegen
        pin_akustik = gpio.OpenPin(PIN_AKUSTIK);
    }


    public async void Serial() 
    {
      //serial configuration

        while (true)
        {
            //frequency of constant while loop 300ms
            Sensor_Akustik();
        }
    } 




    public void Sensor_Akustik()
    {
        pin_akustik.ValueChanged += Pin_ValueChanged;
        pin_akustik.SetDriveMode(GpioPinDriveMode.Input);

         status_akustik = pin_akustik.Read().ToString();
        textblock_DebugAkustik_live.Text = status_akustik;
        Messenger.Default.Send<string, Page_Akustik>(status_akustik);
    }

    private void Pin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
    {
        if (args.Edge == GpioPinEdge.RisingEdge)
        {
            sender.Write(GpioPinValue.High);

            Task.Delay(3000).Wait();
        }
    }

1 Ответ

1 голос
/ 08 октября 2019

Вы можете обратиться к следующему коду. Вы можете попытаться обновить фиксированное выходное значение для контакта, если контакт настроен как вход.

    private void InitGPIO()
    {
        var gpio = GpioController.GetDefault();

        // Show an error if there is no GPIO controller
        if (gpio == null)
        {
            pin = null;
            GpioStatus.Text = "There is no GPIO controller on this device.";
            return;
        }

        pin = gpio.OpenPin(LED_PIN);
        pin.ValueChanged += Pin_ValueChanged;
        pin.SetDriveMode(GpioPinDriveMode.Input);

    }


    private void Pin_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
    {
        if(args.Edge == GpioPinEdge.RisingEdge)
        {
            sender.Write(GpioPinValue.High);
            Task.Delay(500).Wait();
        }
    }
...