【问题标题】:Hold/Push Button with Raspberry Pi GPIO使用 Raspberry Pi GPIO 按住/按下按钮
【发布时间】:2017-01-10 17:54:29
【问题描述】:

我希望我的按钮执行以下 2 项操作;

  • 按下按钮时执行某些操作
  • 只要按住某个按钮一定时间(2 秒)就做某事

我正在使用的当前代码看起来有点像这样:

    //Comfirming a letter or sending the word.
    private void btnRightValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e)
    {
        //if button is pressed it will confirm a letter
        if (e.Edge == GpioPinEdge.FallingEdge)
        {
            //code to confirm letter
            ConfirmLetter();

            //if(buttonHeldForAWhile)
            //{
            //Send message
            //SendWord();
            //}
        }
    }

但是如何检查按钮是按住 2 秒还是 3 秒?

【问题讨论】:

  • 你不能只检查GpioPinValue.Low 是否为真,并检查它与系统时钟的关系吗?
  • 顺便说一下,如果有人感兴趣,这里是 gpio 命名空间的 MS 参考:msdn.microsoft.com/en-us/library/windows/apps/…
  • “我希望我的按钮执行...” -- 您的规范不准确。大多数事件报告方案使用边缘检测而不是电平检测,因此它们报告开关闭合(例如按钮按下)和开关打开(例如按钮释放)。按下按钮后是否立即执行第一个 "something" 操作(无需等待释放)?那么当按下按钮和保持2秒时,是否应该同时完成"something"动作?如果按住按钮超过 3 秒应该怎么办?重复这个动作?
  • @sawdust,我认为他的问题很清楚。如果按钮被按住 2 秒,然后做一些事情,比如他的代码 cmets 状态。而且我相信有一个用于 gpio 的电平检测器,就像我提到的那样。
  • press 是按住并松开(可以说是快速),按住是按住按钮 2 秒钟然后松开。我想为每个“事件”提供 2 个单独的功能。

标签: c# visual-studio button raspberry-pi gpio


【解决方案1】:

我找到了一种方法来解决我的问题,方法是使用秒表来测量按钮被按下的时间。

在我们的命名空间之上,我们需要添加它以便我们使用 Stopwatch 类。

using System.Diagnostics;

现在我们要声明一个秒表:

Stopwatch stopWatch;

当按钮被按下并按住时,我的代码将使用FallingEdge 来获取它。当它被按下时,我还希望它创建一个新的秒表并启动它。

释放按钮时,由RisingEdge 检查。我停止计时器并获取两个事件之间的时间。然后我比较 if 语句中按下的时间,以便我可以决定如何处理按钮按下。在这种情况下 SendWord,或附加当前字符并预览它。

    //Comfirming the chosen letter.
    private void btnRightValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e)
    {
        if (e.Edge == GpioPinEdge.FallingEdge)
        {
            stopWatch = new Stopwatch();
            stopWatch.Start();
        }

        if (e.Edge == GpioPinEdge.RisingEdge)
        {
            stopWatch.Stop();
            long duration = stopWatch.ElapsedMilliseconds;

            if (duration > 2000 )
            {
                SendWord();
            }
            else
            {
                //Add the current character to the word
                _currentWordSB.Append(Convert.ToString(_currentChar));

            //    //Reset currentChar aswell
                _currentChar = ' ';

            //    //The user confirmed the morse sequence and wants to start a new one, so we reset it.
                _morseCode.Clear();

            //    //Preview the word
                PreviewLetter();
            }
        }
    }

如果有任何更好的方法来解决我的问题,请告诉我,但到目前为止这个解决方案对我有效。

我需要这个,因为我正在处理一个通过按钮输入摩尔斯电码的 Raspberry Pi 项目。然后该输入必须显示在 LCD 屏幕上。如果用户对他的输入感到满意,他可以通过按住右键 2 秒将其发送给其他用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    相关资源
    最近更新 更多