C# 按住/按下带有覆盆子皮GPIO的按钮

C# 按住/按下带有覆盆子皮GPIO的按钮,c#,visual-studio,button,raspberry-pi,gpio,C#,Visual Studio,Button,Raspberry Pi,Gpio,我想我的按钮做以下两件事 无论何时按下按钮,都要做些什么 每当按钮被按住一定时间(2秒)时,请执行某些操作 我正在使用的当前代码看起来有点像这样: //Comfirming a letter or sending the word. private void btnRightValueChanged(GpioPin sender, GpioPinValueChangedEventArgs e) { //if button is pressed it w

我想我的按钮做以下两件事

  • 无论何时按下按钮,都要做些什么
  • 每当按钮被按住一定时间(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秒呢?

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

在名称空间上方,我们需要添加此名称空间,以便使用Stopwatch类

using System.Diagnostics;
现在我们要通过以下方式申报秒表:

Stopwatch stopWatch;
当按下并按住按钮时,我的代码将通过
下降沿
拾取该按钮。当它被按下,我也希望它创建一个新的秒表,并启动它

松开按钮时,将通过
RisingEdge
进行检查。我停止计时器并获取两个事件之间的时间。然后我比较if语句中按下的时间,这样我就可以决定按下按钮该做什么。在本例中,请发送Word,或附加当前字符并预览它

    //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();
            }
        }
    }
如果有更好的方法来解决我的问题,请让我知道,但到目前为止,这个解决方案对我有效


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

您不能检查
GpioPinValue.Low
是否为真,并检查与系统时钟的对比情况吗?顺便说一句,如果有人感兴趣,这里是gpio命名空间的MS参考:“我想让我的按钮做……”——您的说明不准确。大多数事件报告方案使用边缘检测而不是电平检测,因此它们报告开关闭合(例如按下按钮)和开关断开(例如松开按钮)。按钮按下后(不等待释放)是否会执行第一个“动作”那么两者都应该是“什么”吗“按下并按住按钮2秒后,可以执行哪些操作?如果按住按钮超过3秒,应怎么做?“重复这个动作吗?”锯末,我觉得他的问题很清楚。若按钮保持2秒钟,那个么做一些事情,比如他的代码注释状态。我相信gpio有一个液位检测器,就像我提到的。按下按钮就是按住并释放(可以说很快),按住按钮就是在释放之前按住按钮2秒钟。我想为每个“事件”提供两个单独的函数。