所以我一直在用TinkerCad做实验,等待我的arduino到来。目前,我有一个循环的led灯,我想启动和停止循环按一个按钮。
目前,我能够通过按钮启动我的循环,但不能停止循环与相同的按钮按下。这是否与退弹有关?
const int button = 10;
const int led1 = 8;
const int led2 = 4;
const int led3 = 3;
const int timedelay = 250;
boolean buttonstate = false;
void setup()
{
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(button, INPUT);
}
void loop() {
if(digitalRead(button)==HIGH) // check if button is pushed
buttonstate = !buttonstate; //reverse buttonstate value
if(buttonstate==true)
{
digitalWrite(led1, HIGH);
delay(timedelay);
digitalWrite(led1, LOW);
delay(timedelay);
digitalWrite(led2, HIGH);
delay(timedelay);
digitalWrite(led2, LOW);
delay(timedelay);
digitalWrite(led3, HIGH);
delay(timedelay);
digitalWrite(led2, HIGH);
delay(timedelay);
digitalWrite(led1, HIGH);
delay(timedelay);
digitalWrite(led3, LOW);
delay(timedelay);
digitalWrite(led2, LOW);
delay(timedelay);
digitalWrite(led1, LOW);
delay(timedelay);
digitalWrite(led1, HIGH); }
else {
digitalWrite(led1, HIGH);
}
}
我的电路设置。
EDIT:
我已经调整了我的代码,用毫秒代替了延迟,并在寻找按钮状态的变化。还在寻找一种方法来调整循环结束时的interval_led1,以使病态的led灯序列。
const int led1 = 13;
const int led2 = 8;
const int led3 = 5;
const int button = 10;
int ledState_led1 = LOW; // ledState used to set the LED
int ledState_led2 = LOW;
int ledState_led3 = LOW;
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis_led1 = 0; // will store last time LED was updated
unsigned long previousMillis_led2 = 0;
unsigned long previousMillis_led3 = 0;
long interval_led1 = 500; // interval at which to blink (milliseconds)
long interval_led2 = 600;
long interval_led3 = 700;
boolean buttonstate = false;
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(button, INPUT);
}
void loop() {
// check to see if it's time to blink the LED; that is, if the difference
// between the current time and last time you blinked the LED is bigger than
// the interval at which you want to blink the LED.
unsigned long currentMillis_led1 = millis();
unsigned long currentMillis_led2 = millis();
unsigned long currentMillis_led3 = millis();
bool current_state = digitalRead(button);
bool prev_buttonstate= false;
if(current_state==HIGH && current_state != prev_buttonstate)
{
buttonstate = !buttonstate; //reverse buttonstate value
}
prev_buttonstate = current_state;
if(buttonstate==true)
if (currentMillis_led1 - previousMillis_led1 >= interval_led1) {
previousMillis_led1 = currentMillis_led1;
if (ledState_led1 == LOW) {
ledState_led1 = HIGH;
} else {
ledState_led1 = LOW;
}
digitalWrite(led1, ledState_led1);
}
if(buttonstate==true)
if (currentMillis_led2 - previousMillis_led2 >= interval_led2) {
previousMillis_led2 = currentMillis_led2;
if (ledState_led2 == LOW) {
ledState_led2 = HIGH;
} else {
ledState_led2 = LOW;
}
digitalWrite(led2, ledState_led2);
}
if(buttonstate==true)
if (currentMillis_led3 - previousMillis_led3 >= interval_led3) {
previousMillis_led3 = currentMillis_led3;
if (ledState_led3 == LOW) {
ledState_led3 = HIGH;
} else {
ledState_led3 = LOW;
}
digitalWrite(led3, ledState_led3);
}
}
这里你的两个案例在延迟方面有很大的不同。if(buttonstate==true)
是非常长的执行 因为多个 delay
中的指示。else
是非常快的,因为没有 delay
在其中。
当 buttonstate==True
而你按下按钮(正如Delta_G所说的那样,你会发现,在你按下按钮的同时,你也会发现,你会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现,在你按下按钮的同时,你也会发现 delay()
阻止测试的发生,你应该使用的是 millis()
比如说做计时,但假设你很幸运,你通过了你的第一次。if
声明),所以 buttonstate
会翻到 false
.
由于没有耽误你的 else
指令,董事会将在短时间内回到你最初的 if
不幸的是,它仍将是 true
因为你的速度不够快,只能按这个按钮几微秒。所以 buttonstate
将再次翻转,你的代码将落在你的 if(buttonstate==true)
很长,让你能及时在 "你是谁 "之前释放按钮。if(digitalRead(button)==HIGH)
是重新评估的。
解决方法(除了@Delta_G提出的时间问题和@TomServo提出的硬件问题外)是寻求一个新的解决方案。变化 的按钮状态。因此,你必须与它之前的值进行比较。你可以声明另一个布尔值 boolean prev_buttonstate = false;
并可以做这样的事情。
bool current_state = digitalRead(button);
if(current_state==HIGH && current_state != prev_buttonstate)
{
buttonstate = !buttonstate; //reverse buttonstate value
}
prev_buttonstate = current_state;
希望能帮到你!
你的电路是正确的。如果你继续多按一下按钮,条件会继续保持良好,状态又会假性复位。
为了模拟切换效果,可以使用一个bool变量,像这样:。当信号变低时,你就会重置变量。
void loop() {
static bool ready = true;
if(digitalRead(button)==HIGH && ready)
{
ready = false;
buttonstate = !buttonstate; //reverse buttonstate value
if(buttonstate){
digitalWrite(led1, HIGH);
delay(timedelay);
digitalWrite(led1, LOW);
delay(timedelay);
/* Etc*/ }
else {
digitalWrite(led1, HIGH);
}
}
else
if(digitalRead(button)==LOW && !ready)
{
ready = true;
}
}