尝试按下一个按钮并以 2Hz 的频率切换 LED 闪光灯,直到我再次按下按钮
Trying to press a button and toggle an LED flash at 2Hz until i press the button again
我正在尝试学习编码,这真的让我很困惑,所以我想我会问问你们可爱的人。
基本上我试图按下一个按钮并打开一个 LED 开关,它每秒闪烁两次,这将一直持续到我再次按下按钮将其关闭。
到目前为止,这是我的代码。
bool latch = false;
void setup(){
pinMode(1, INPUT);
pinMode(13, OUTPUT);
}
void loop(){
if (digitalRead(1)){
latch = !latch;
}
if (latch == 1){
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}else{
digitalWrite(13, LOW)
}
}
由于调用了 delay(1000)
,您的代码要求您在调用 digitalRead(1)
的那一瞬间按下按钮。当 delay()
正在运行时,Arduino 无法监听按钮按下。此外,您调用 delay(1000)
两次,这会使 LED 每两秒闪烁一次,而不是每秒闪烁两次。
解决方案是制作一个计数器,计算自上次打开或关闭 LED 后经过的毫秒数。该循环每毫秒将 counter
加 1,因此当 counter
等于或大于 500(半秒)时,LED 会打开或关闭。
这是一个程序,当按下按钮时,LED 开始闪烁(1 秒内亮起和熄灭),再次按下按钮时停止闪烁。代码里有更多的解释。
bool latch = false;
bool led_state = false;
// How many milliseconds it has been since the last LED state change
int counter = 0;
void setup() {
pinMode(2, INPUT);
pinMode(13, OUTPUT);
}
void loop() {
// Check if the button was pressed
if (digitalRead(2)){
// If the button was pressed, wait half a second before toggling latch,
// to "de-bounce" the button (prevent it from sending multiple clicks for
// one press)
delay(300);
latch = !latch;
}
// If we are in on state (latch == true)...
if (latch) {
// ...add 1 to the counter and wait 1 millisecond...
counter += 1;
delay(1);
// ...and toggle the LED state if 500 milliseconds have passed.
// This we know because counter >= 500.
if (counter >= 500) {
if (led_state == true) led_state = false;
else if (led_state == false) led_state = true;
counter = 0;
}
digitalWrite(13, led_state);
// If we are in off state, turn the LED off
} else {
digitalWrite(13, false);
}
}
我用一个类似于我假设你设置的模拟器做了一些实验(用它来设置你未来的 Arduino 问题的情况,使人们更容易理解和帮助)
https://wokwi.com/arduino/projects/312378906051084864
除了在这里添加一个缺失的分号,并使用我假设你的编程知识是
之前
}else{
digitalWrite(13, LOW)
}
之后
}else{
digitalWrite(13, LOW);
}
我对您的 if 语句做了一些小改动,这使其适用于某些特定用途,您必须点击按钮将其打开并在您认为间隔即将到期时按住它。这是因为您使用了延迟功能,该功能基本上会停止所有程序的执行,直到间隔结束。因此,与您按钮关联的引脚必须在延迟间隔之后以及在评估闩锁期间处于高电平
if (digitalRead(1)){
latch = true;
}else{
latch = false;
}
推荐的替代方案
如果您对更好的稍微更高级的代码应用程序感兴趣,我找到了这个参考资料,它提供了一种无需使用延迟功能即可使 LED 闪烁的方法
https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay
我正在尝试学习编码,这真的让我很困惑,所以我想我会问问你们可爱的人。
基本上我试图按下一个按钮并打开一个 LED 开关,它每秒闪烁两次,这将一直持续到我再次按下按钮将其关闭。
到目前为止,这是我的代码。
bool latch = false;
void setup(){
pinMode(1, INPUT);
pinMode(13, OUTPUT);
}
void loop(){
if (digitalRead(1)){
latch = !latch;
}
if (latch == 1){
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}else{
digitalWrite(13, LOW)
}
}
由于调用了 delay(1000)
,您的代码要求您在调用 digitalRead(1)
的那一瞬间按下按钮。当 delay()
正在运行时,Arduino 无法监听按钮按下。此外,您调用 delay(1000)
两次,这会使 LED 每两秒闪烁一次,而不是每秒闪烁两次。
解决方案是制作一个计数器,计算自上次打开或关闭 LED 后经过的毫秒数。该循环每毫秒将 counter
加 1,因此当 counter
等于或大于 500(半秒)时,LED 会打开或关闭。
这是一个程序,当按下按钮时,LED 开始闪烁(1 秒内亮起和熄灭),再次按下按钮时停止闪烁。代码里有更多的解释。
bool latch = false;
bool led_state = false;
// How many milliseconds it has been since the last LED state change
int counter = 0;
void setup() {
pinMode(2, INPUT);
pinMode(13, OUTPUT);
}
void loop() {
// Check if the button was pressed
if (digitalRead(2)){
// If the button was pressed, wait half a second before toggling latch,
// to "de-bounce" the button (prevent it from sending multiple clicks for
// one press)
delay(300);
latch = !latch;
}
// If we are in on state (latch == true)...
if (latch) {
// ...add 1 to the counter and wait 1 millisecond...
counter += 1;
delay(1);
// ...and toggle the LED state if 500 milliseconds have passed.
// This we know because counter >= 500.
if (counter >= 500) {
if (led_state == true) led_state = false;
else if (led_state == false) led_state = true;
counter = 0;
}
digitalWrite(13, led_state);
// If we are in off state, turn the LED off
} else {
digitalWrite(13, false);
}
}
我用一个类似于我假设你设置的模拟器做了一些实验(用它来设置你未来的 Arduino 问题的情况,使人们更容易理解和帮助)
https://wokwi.com/arduino/projects/312378906051084864
除了在这里添加一个缺失的分号,并使用我假设你的编程知识是
之前
}else{
digitalWrite(13, LOW)
}
之后
}else{
digitalWrite(13, LOW);
}
我对您的 if 语句做了一些小改动,这使其适用于某些特定用途,您必须点击按钮将其打开并在您认为间隔即将到期时按住它。这是因为您使用了延迟功能,该功能基本上会停止所有程序的执行,直到间隔结束。因此,与您按钮关联的引脚必须在延迟间隔之后以及在评估闩锁期间处于高电平
if (digitalRead(1)){
latch = true;
}else{
latch = false;
}
推荐的替代方案
如果您对更好的稍微更高级的代码应用程序感兴趣,我找到了这个参考资料,它提供了一种无需使用延迟功能即可使 LED 闪烁的方法
https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay