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()代码>零件。继电器激活部分是我不知道如何工作的部分。到目前为止发布的代码完全符合我的要求。