Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 一个按钮用于选择4个继电器中的1个,同一个按钮用于激活所选继电器_Arduino - Fatal编程技术网

Arduino 一个按钮用于选择4个继电器中的1个,同一个按钮用于激活所选继电器

Arduino 一个按钮用于选择4个继电器中的1个,同一个按钮用于激活所选继电器,arduino,Arduino,我希望能够用一个按钮控制四个继电器。 (这是为行动能力非常有限的残疾朋友准备的,这将控制他的起居室躺椅。) 我想能够按下按钮一次,两次,三次或四次,以选择哪个继电器将被激活。短暂暂停后,按下相同按钮应激活所选继电器 因此,按下两次按钮将导致LED闪烁两次,然后短暂暂停,然后再次闪烁两次等,以指示继电器2已“选中”。一旦满足该条件,再次按下该按钮将在按下该按钮的持续时间内激活该继电器。一旦松开按钮,程序应返回循环,寻找再次按下按钮以选择不同的继电器 我已经将一些代码混合在一起,并使其部分工作。当我

我希望能够用一个按钮控制四个继电器。
(这是为行动能力非常有限的残疾朋友准备的,这将控制他的起居室躺椅。)

我想能够按下按钮一次,两次,三次或四次,以选择哪个继电器将被激活。短暂暂停后,按下相同按钮应激活所选继电器

因此,按下两次按钮将导致LED闪烁两次,然后短暂暂停,然后再次闪烁两次等,以指示继电器2已“选中”。一旦满足该条件,再次按下该按钮将在按下该按钮的持续时间内激活该继电器。一旦松开按钮,程序应返回循环,寻找再次按下按钮以选择不同的继电器

我已经将一些代码混合在一起,并使其部分工作。当我试图按下按钮激活继电器时,问题开始出现,变量
PushButtonCounter
递增,并认为我选择了下一个继电器,而实际上,我想激活先前选择的继电器

我如何解决这个问题

(我知道我的代码很难看,不符合公认的C代码惯例。 我也可能遗漏了一堆重要信息。可能有更好的方法来编码我在下面列出的代码块。)

其他信息: 我按照建议删除了
无符号long
,代码仍然可以工作到断开环路并激活所选继电器的程度。例如,按下三次按钮后,
PushButtonCounter
中存储的值应为“3”。这将在
switch
语句中进行评估,并下降到
情况3:
。LED按照我的要求闪烁,三次快速闪烁,然后暂停,三次快速闪烁,然后暂停。正如我所期望的那样,它在循环中循环。但是,下一步要做的是按住按钮以激活3号继电器。相反,
PushButtonCounter
现在设置为“4”,而
switch
语句现在的计算结果为
case 4:
。我需要以某种方式将
按钮计数器设置为短时间后“粘滞”,比如说不超过10秒,并且不改变,因此当我下次按下按钮时,它被检测为“在按住按钮的时间内激活选定的继电器”。一旦松开按钮,程序应返回循环的开始,等待更多的按钮按下,以选择新的继电器激活

// Constant values that won't change.
  const int Relay_1 = 2;
  const int Relay_2 = 3;
  const int Relay_3 = 4;
  const int Relay_4 = 5;
  const int LED = 6;
  const int PushButton = 7;

// Variable values that will change.
  int PushButtonCounter = 0;           // Counter for the number of push button presses.
  int CurrentButtonState = 0;          // Current state of the push button.
  int LastButtonState = 0;             // Previous state of the push button.
  unsigned long ButtonPressed;

void setup()
  {
    pinMode(Relay_1, OUTPUT);
    pinMode(Relay_2, OUTPUT);
    pinMode(Relay_3, OUTPUT);
    pinMode(Relay_4, OUTPUT);
    pinMode(LED, OUTPUT);
    pinMode(PushButton, INPUT);
    digitalWrite(Relay_1, LOW);
    digitalWrite(Relay_2, LOW);
    digitalWrite(Relay_3, LOW);
    digitalWrite(Relay_4, LOW);
    digitalWrite(LED, LOW);
  }

void loop()
  {
    CurrentButtonState = digitalRead(PushButton);        // Read the push button input pin.
    if (CurrentButtonState != LastButtonState)           // Compare the PushButtonState to its previous state.
      {
        if (CurrentButtonState == HIGH)                  // If the current state is HIGH then the button went from off to on.
          {
            ButtonPressed = millis();
            PushButtonCounter++;                         // If the state has changed, increment the counter.
          }
        delay(50);                                       // Delay a little bit to avoid bouncing.
      }
    LastButtonState = CurrentButtonState;                // Save the current state as the last state for next time through the loop.
    if (PushButtonCounter == 5) PushButtonCounter = 0;
    if (millis() > ButtonPressed + 2000)
      {
         switch (PushButtonCounter)
          {
            case 1:
              digitalWrite(LED, HIGH);
              delay(100);
              digitalWrite(LED, LOW);
            break;
            case 2:
              digitalWrite(LED, HIGH);
              delay(100);
              digitalWrite(LED, LOW);
              delay(500);
              digitalWrite(LED, HIGH);
              delay(100);
              digitalWrite(LED, LOW);
            break;  
            case 3:
              digitalWrite(LED, HIGH);
              delay(100);
              digitalWrite(LED, LOW);
              delay(500);
              digitalWrite(LED, HIGH);
              delay(100);
              digitalWrite(LED, LOW);              
              delay(500);
              digitalWrite(LED, HIGH);
              delay(100);
              digitalWrite(LED, LOW);
            break;  
            case 4:
              digitalWrite(LED, HIGH);
              delay(100);
              digitalWrite(LED, LOW);
              delay(500);
              digitalWrite(LED, HIGH);
              delay(100);
              digitalWrite(LED, LOW);
              delay(500);
              digitalWrite(LED, HIGH);
              delay(100);
              digitalWrite(LED, LOW);
              delay(500);
              digitalWrite(LED, HIGH);
              delay(100);
              digitalWrite(LED, LOW);
            break;
          }
        ButtonPressed = millis();  
      }
  }

首先,得到的值
unsigned long ButtonPressed=millis()将在离开此块时被丢弃。不要在这里定义按下的
按钮,而是使用全局按钮。我想知道这样快速地打开和关闭控制继电器的引脚是否真的很好。在
案例n:
之后打开,然后在while循环工作之后关闭,这不是必须的吗?我发布了一个更好的代码版本,那部分是先打开然后关闭继电器,这是假的。很抱歉给你带来了困惑。四个继电器之一的激活必须由用户控制,而不是定时事件。对中继激活事件计时可能会导致向后倾斜不够远,或向后倾斜太远。您的代码仍然具有未签名的长按钮pressed=millis();部分以及我没有看到继电器激活部分。我非常确定我需要
无符号长按钮pressed=millis()零件。继电器激活部分是我不知道如何工作的部分。到目前为止发布的代码完全符合我的要求。