Button 我使用一个按钮作为开关,它打开但不';t关闭(Arduino)
我正试图使一个按钮作为开关工作。代码用于“打开”灯光,但不希望将其关闭 我的代码是这样工作的:Button 我使用一个按钮作为开关,它打开但不';t关闭(Arduino),button,arduino,arduino-uno,light,Button,Arduino,Arduino Uno,Light,我正试图使一个按钮作为开关工作。代码用于“打开”灯光,但不希望将其关闭 我的代码是这样工作的: 如果按下按钮且灯熄灭,则打开灯 如果按下按钮且灯亮起,则关闭灯 但是第二条不行 int buttonStatus = 0; int check = 1; int Status = 0; void setup() { pinMode(5,OUTPUT); pinMode(7,OUTPUT); pinMode(9,OUTPUT); pinMode(11,OUTPUT); pinMod
int buttonStatus = 0;
int check = 1;
int Status = 0;
void setup() {
pinMode(5,OUTPUT);
pinMode(7,OUTPUT);
pinMode(9,OUTPUT);
pinMode(11,OUTPUT);
pinMode(13,OUTPUT);
pinMode(2,INPUT);
}
void loop() {
if (check = 1) {
buttonStatus = digitalRead(2);
if (buttonStatus == HIGH && Status == 0) {
Status = 1;
buttonStatus = 0;
} else if (buttonStatus == HIGH && Status == 1) {
Status = 0;
buttonStatus = 0;
}
}
if (Status == 1) {
digitalWrite(5,HIGH);
delay(50);
digitalWrite(5,LOW);
digitalWrite(7,HIGH);
delay(50);
digitalWrite(7,LOW);
digitalWrite(9,HIGH);
delay(50);
digitalWrite(9,LOW);
digitalWrite(11,HIGH);
delay(100);
digitalWrite(11,LOW);
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,LOW);
} else {
digitalWrite(5,LOW);
digitalWrite(7,LOW);
digitalWrite(9,LOW);
digitalWrite(11,LOW);
digitalWrite(13,LOW);
}
}
尝试添加去盎司延迟。这是交换机的常见问题。
可能是因为一个浮动销。你有内置上拉或下拉电阻器吗
这是一件很常见的事情…好的,您的描述和代码告诉我们两件不同的事情。我正试图解释它们,但如果我错了,就告诉我,我会尝试更正答案 此代码允许您使用按钮打开和关闭针脚5上的灯。一个按钮将打开它,另一个按钮将关闭它。您必须将按钮一端连接到引脚2,另一端连接到接地(因为我们使用的是上拉电阻器) 我还添加了一个小的去盎司延迟,以应对机械开关的反弹(50毫秒) 当您按下按钮时,针脚5上的led将点亮,再次按下时,led将熄灭 这是你要求的行为。另一方面,当您按下按钮时,您的代码将点亮一系列指示灯。在这种情况下,如果你想用一个按钮开始循环,然后用另一个按钮停止循环,你必须使用一种简单的状态机,就像代码中的一样。我还为按钮添加了一个小的去抖动,它需要再次连接到2和接地之间
byte buttonStatus;
unsigned long lastEqualButtonTime;
#define debounceTimeMs 50
// Statuses
#define STATE_LEDSOFF 0
#define STATE_LED5ON 1
#define STATE_LED7ON 2
#define STATE_LED9ON 3
#define STATE_LED11ON 4
#define STATE_LED13ON 5
// How much time should each led be on?
// Expressed in milliseconds
#define TIME_LED5ON 50
#define TIME_LED7ON 50
#define TIME_LED9ON 50
#define TIME_LED11ON 100
#define TIME_LED13ON 100
byte stateMachineStatus;
unsigned long stateMachineTime;
void setup() {
pinMode(5,OUTPUT);
pinMode(7,OUTPUT);
pinMode(9,OUTPUT);
pinMode(11,OUTPUT);
pinMode(13,OUTPUT);
pinMode(2,INPUT_PULLUP);
buttonStatus = digitalRead(2);
lastEqualButtonTime = millis();
stateMachineStatus = STATE_LEDSOFF;
}
void loop() {
byte currentButtonStatus = digitalRead(2);
if (currentButtonStatus == buttonStatus)
lastEqualButtonTime = millis();
else if ((millis() - lastEqualButtonTime) > debounceTimeMs)
{
lastEqualButtonTime = millis();
buttonStatus = currentButtonStatus;
// Change only on change, not on value
if (buttonStatus == LOW) {
// Turn on the LEDs sequence if it was off
if (stateMachineStatus == STATE_LEDSOFF)
{
stateMachineStatus = STATE_LED5ON;
stateMachineTime = millis();
}
else // Turn it off if it was on
stateMachineStatus = STATE_LEDSOFF;
}
}
switch (stateMachineStatus)
{
case STATE_LEDSOFF:
digitalWrite(5,LOW);
break;
case STATE_LED5ON:
digitalWrite(5,HIGH);
if ((millis() > stateMachineTime) > TIME_LED5ON)
{
stateMachineTime += TIME_LED5ON;
digitalWrite(5,LOW);
stateMachineStatus = STATE_LED7ON;
}
break;
case STATE_LED7ON:
digitalWrite(7,HIGH);
if ((millis() > stateMachineTime) > TIME_LED7ON)
{
stateMachineTime += TIME_LED7ON;
digitalWrite(7,LOW);
stateMachineStatus = STATE_LED9ON;
}
break;
case STATE_LED9ON:
digitalWrite(9,HIGH);
if ((millis() > stateMachineTime) > TIME_LED9ON)
{
stateMachineTime += TIME_LED9ON;
digitalWrite(9,LOW);
stateMachineStatus = STATE_LED11ON;
}
break;
case STATE_LED11ON:
digitalWrite(11,HIGH);
if ((millis() > stateMachineTime) > TIME_LED11ON)
{
stateMachineTime += TIME_LED11ON;
digitalWrite(11,LOW);
stateMachineStatus = STATE_LED13ON;
}
break;
case STATE_LED13ON:
digitalWrite(13,HIGH);
if ((millis() > stateMachineTime) > TIME_LED13ON)
{
stateMachineTime += TIME_LED13ON;
digitalWrite(13,LOW);
stateMachineStatus = STATE_LED5ON;
}
break;
default:
stateMachineStatus = STATE_LEDSOFF;
break;
}
}
其工作方式如下:按下按钮,电路板将开始在LED之间循环。5, 7, 9, 11, 13, 5, 7, 9, 11, 13, ... 直到你再次按下按钮。当您这样做时,它停止,然后在下一次按下时从5重新启动
如果希望在13之后停止,请将第105行从stateMachineStatus=STATE\u LED5ON代码>至stateMachineStatus=STATE\u LEDSOFF代码>
注意:在您的代码中,延迟太低(与我在这里所说的相同):无法注意到一个led和另一个led之间的50毫秒。如果您希望实际按顺序查看它们,请在_LEDxON定义的时间中至少放置250个值
免责声明:我没有测试这些代码,因为我目前没有安装arduino ide。如果有一些bug,只要告诉我,我会修复它们。在这两种情况下,您都是在关灯<代码>数字写入(5,高);延迟(50);数字写入(5,低)代码>将在快速打开LED后关闭。@dda是的,这是我的代码,它打开,然后打开,然后另一个打开,然后关闭。让我重建它,我会发送图片。我应该把它寄到哪里?我不明白你的意思,在网上搜索浮动引脚:)我不知道这会有什么帮助或阻止它。在没有去盎司延迟的情况下按下开关可能会被理解为多次按下,并导致过程中的故障。这里有一个示例代码,展示了一种处理单状态按钮上的开关的好方法。嘿,谢谢,这里有一些错误,但没问题。我们可以聊天吗?嗯,我可以创建一个聊天室,但你需要20个代表才能回复。不管怎样只要在这里问,我会尽力回答。。什么才是最适合你的?第一个还是第二个?我是说skype,whatsapp什么的,它们做的都是一样的,看起来不一样,但实际上是一样的,它们做的不是一样的。第一个点亮一个led,另一个依次点亮。把时间花在。。时间到了500,然后你会看到他们依次出现。。。
byte buttonStatus;
unsigned long lastEqualButtonTime;
#define debounceTimeMs 50
// Statuses
#define STATE_LEDSOFF 0
#define STATE_LED5ON 1
#define STATE_LED7ON 2
#define STATE_LED9ON 3
#define STATE_LED11ON 4
#define STATE_LED13ON 5
// How much time should each led be on?
// Expressed in milliseconds
#define TIME_LED5ON 50
#define TIME_LED7ON 50
#define TIME_LED9ON 50
#define TIME_LED11ON 100
#define TIME_LED13ON 100
byte stateMachineStatus;
unsigned long stateMachineTime;
void setup() {
pinMode(5,OUTPUT);
pinMode(7,OUTPUT);
pinMode(9,OUTPUT);
pinMode(11,OUTPUT);
pinMode(13,OUTPUT);
pinMode(2,INPUT_PULLUP);
buttonStatus = digitalRead(2);
lastEqualButtonTime = millis();
stateMachineStatus = STATE_LEDSOFF;
}
void loop() {
byte currentButtonStatus = digitalRead(2);
if (currentButtonStatus == buttonStatus)
lastEqualButtonTime = millis();
else if ((millis() - lastEqualButtonTime) > debounceTimeMs)
{
lastEqualButtonTime = millis();
buttonStatus = currentButtonStatus;
// Change only on change, not on value
if (buttonStatus == LOW) {
// Turn on the LEDs sequence if it was off
if (stateMachineStatus == STATE_LEDSOFF)
{
stateMachineStatus = STATE_LED5ON;
stateMachineTime = millis();
}
else // Turn it off if it was on
stateMachineStatus = STATE_LEDSOFF;
}
}
switch (stateMachineStatus)
{
case STATE_LEDSOFF:
digitalWrite(5,LOW);
break;
case STATE_LED5ON:
digitalWrite(5,HIGH);
if ((millis() > stateMachineTime) > TIME_LED5ON)
{
stateMachineTime += TIME_LED5ON;
digitalWrite(5,LOW);
stateMachineStatus = STATE_LED7ON;
}
break;
case STATE_LED7ON:
digitalWrite(7,HIGH);
if ((millis() > stateMachineTime) > TIME_LED7ON)
{
stateMachineTime += TIME_LED7ON;
digitalWrite(7,LOW);
stateMachineStatus = STATE_LED9ON;
}
break;
case STATE_LED9ON:
digitalWrite(9,HIGH);
if ((millis() > stateMachineTime) > TIME_LED9ON)
{
stateMachineTime += TIME_LED9ON;
digitalWrite(9,LOW);
stateMachineStatus = STATE_LED11ON;
}
break;
case STATE_LED11ON:
digitalWrite(11,HIGH);
if ((millis() > stateMachineTime) > TIME_LED11ON)
{
stateMachineTime += TIME_LED11ON;
digitalWrite(11,LOW);
stateMachineStatus = STATE_LED13ON;
}
break;
case STATE_LED13ON:
digitalWrite(13,HIGH);
if ((millis() > stateMachineTime) > TIME_LED13ON)
{
stateMachineTime += TIME_LED13ON;
digitalWrite(13,LOW);
stateMachineStatus = STATE_LED5ON;
}
break;
default:
stateMachineStatus = STATE_LEDSOFF;
break;
}
}