我正在编写一个简单的arduino代码。我有两个LED和相应的两个开关。按下一个开关时,一个LED指示灯亮,另一个指示灯熄灭。然后有一个Serial.read函数,它从计算机读取重置。然后两个开关都关闭。然后按下其他开关并打开其他LED。我的问题是当一个开关打开时其他开关不应该工作,直到Serial.read发生。但在我的情况下,当led1打开时,如果我按下switch2,led2打开,led1关闭。但这不是我想要的操作。我想制作逻辑,当led1打开时,如果我按下switch2,led2不应该打开并等待Serial.read发生。这是我的代码。我需要知道逻辑中应该纠正的是什么:
SSL_CTX_set_cipher_list(ctx, "HIGH:MEDIUM:!eNULL:!aNULL:!RC4");
答案 0 :(得分:1)
这就是答案。
int switch1 = 2;
int motorled1 = 3;
int switch2 = 4;
int motorled2 = 5;
int d1 = 0;
int d2 = 0;
int buzzer;
char reset1;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(4, INPUT);
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
d1 = digitalRead(2);
d2 = digitalRead(4);
if (d1 == 1 && buzzer == 0) {
digitalWrite(motorled1, HIGH);
buzzer = 1;
} else if (d2 == 1 && buzzer == 0) {
digitalWrite(motorled2, HIGH);
buzzer = 2;
}
if (Serial.available() > 0) {
Serial.write(buzzer);
reset1 = Serial.read();
buzzer = 0;
if (reset1 == 'R') {
Serial.println("LED is off");
digitalWrite(motorled1, LOW);
digitalWrite(motorled2, LOW);
}
}
}
答案 1 :(得分:0)
您似乎正在使用某种异步代码结构。这是一件好事,但我不确定这是否是你打算做的。
在当前状态下,代码将反复循环,检查其中一个按钮是否被按下。
现在,有两种方法可以实现这一目标:
对于第二种解决方案,您可以替换
if (Serial.available() > 0)
{
reset1 = (Serial.read());
digitalWrite(motorled1, LOW);
digitalWrite(motorled2, LOW);
}
通过
while (Serial.available() <= 0)
{}
reset1 = (Serial.read());
digitalWrite(motorled1, LOW);
digitalWrite(motorled2, LOW);
在串口上没有任何东西的情况下基本上什么都不做。当然,这将完全冻结程序的其余部分,并且不是非常灵活。
首先,还有多种方法可以做到这一点。由于您似乎不熟悉C编程(没有冒犯),最简单的方法之一是将if (d1==1)
和else if (d2==1)
语句更改为if (d1==1 && serial_read == false)
和{{1 }}。然后,在程序的顶部添加:
else if (d2==1 && serial_read == true)
这是基本的想法。我会让你理清各种错误和改进(例如再次将int serial_read = false;
if(Serial.available() > 0)
{
reset1 = (Serial.read());
serial_read = true;
}
设置为serial_read
)作为练习。
我还强烈建议你阅读一般的编程,特别是C编程。我还建议你尝试坚持一些约定来缩进你的代码。没有比带有混合缩进的代码更糟糕的了。