Arduino,运行去抖动电压延时代码中的时间代码错误
Arduino, Run Time Code Error in Debouncing Voltage Time Delay Code
我是 Ansh Goel,我正在从 Udemy 学习 Arduino。我是这个领域的初学者。我正在为按钮去抖动创建一个代码来解决弹跳电压的问题。但是代码中有错误。没有编译时错误,但它是 运行 时间错误。
我还尝试使用 Serial.print() 检查代码以查找错误所在,然后我发现错误在第二个嵌套 if 条件中。 为了方便起见,我也提到了代码中哪里有错误。在那里我无法将 Serial.print("A") 函数也用于串行监视器。
我的主要动机是 运行 代码,这样我可以在按下按钮时使用一些延迟来停止弹跳电压。
来自第41行
这是我用来去抖动按钮的代码
const int btn_pin = 2;
const int debounce_delay = 50; //ms
// We need to remember the previous button state between loops
int btn_prev = HIGH;
int btn_state = HIGH;
unsigned long last_debounce_time = 0;
// Counter
int counter = 0;
void setup() {
Serial.begin(9600);
// Set up pins
pinMode(btn_pin, INPUT_PULLUP);
pinMode(13, OUTPUT);
}
void loop() {
int btn_read;
// Read current button state
btn_read = digitalRead(btn_pin);
//Remember when the button change state
// If the button was previously HIGH and now LOW, it's been pressed
if ( (btn_prev == HIGH) && (btn_read == LOW )) {
//Store the time it took to take the action for button press
last_debounce_time = millis();
}
//Wait before changing the state of the button
// IN THIS CONDITION THERE IS ERROR SOMEWHERE I AM NOT GETTING IT
if(millis() > (last_debounce_time + debounce_delay)){
if(btn_read != btn_state) {
Serial.println("A");
// Then store the button change value to the global variable
btn_state = btn_read;
if(btn_state == LOW) {
// Increment and print counter
counter++;
Serial.println(counter);
digitalWrite(13,HIGH);
delay(500);
digitalWrite(13,LOW);
delay(500);
}
}
}
// Remember the previous button state for the next loop iteration
btn_prev = btn_state;
}
出于测试目的,这是 TinkerCad 上的电路设计,您可以在线查看。
请帮我解决这个问题,这对我来说是一个很大的帮助。
您的代码可能在几个地方出现故障:
- 你没有正确循环 for loop
- 你的逻辑不成立
- digitalRead 不工作
- 打印不工作
首先,删除去抖动检查并查看是否有效:
//if(millis() > (last_debounce_time + debounce_delay)){
要检查所有其他问题,请在剩余的 if 之前添加以下内容:
- 延迟,这样你就不会得到无穷无尽的数据
- 打印毫,last_debounce_time,debounce_delay 和 btn_read
- 行尾
然后 运行 并按下按钮。输出会让你知道问题是什么
我是 Ansh Goel,我正在从 Udemy 学习 Arduino。我是这个领域的初学者。我正在为按钮去抖动创建一个代码来解决弹跳电压的问题。但是代码中有错误。没有编译时错误,但它是 运行 时间错误。
我还尝试使用 Serial.print() 检查代码以查找错误所在,然后我发现错误在第二个嵌套 if 条件中。 为了方便起见,我也提到了代码中哪里有错误。在那里我无法将 Serial.print("A") 函数也用于串行监视器。
我的主要动机是 运行 代码,这样我可以在按下按钮时使用一些延迟来停止弹跳电压。
来自第41行
这是我用来去抖动按钮的代码
const int btn_pin = 2;
const int debounce_delay = 50; //ms
// We need to remember the previous button state between loops
int btn_prev = HIGH;
int btn_state = HIGH;
unsigned long last_debounce_time = 0;
// Counter
int counter = 0;
void setup() {
Serial.begin(9600);
// Set up pins
pinMode(btn_pin, INPUT_PULLUP);
pinMode(13, OUTPUT);
}
void loop() {
int btn_read;
// Read current button state
btn_read = digitalRead(btn_pin);
//Remember when the button change state
// If the button was previously HIGH and now LOW, it's been pressed
if ( (btn_prev == HIGH) && (btn_read == LOW )) {
//Store the time it took to take the action for button press
last_debounce_time = millis();
}
//Wait before changing the state of the button
// IN THIS CONDITION THERE IS ERROR SOMEWHERE I AM NOT GETTING IT
if(millis() > (last_debounce_time + debounce_delay)){
if(btn_read != btn_state) {
Serial.println("A");
// Then store the button change value to the global variable
btn_state = btn_read;
if(btn_state == LOW) {
// Increment and print counter
counter++;
Serial.println(counter);
digitalWrite(13,HIGH);
delay(500);
digitalWrite(13,LOW);
delay(500);
}
}
}
// Remember the previous button state for the next loop iteration
btn_prev = btn_state;
}
出于测试目的,这是 TinkerCad 上的电路设计,您可以在线查看。
请帮我解决这个问题,这对我来说是一个很大的帮助。
您的代码可能在几个地方出现故障:
- 你没有正确循环 for loop
- 你的逻辑不成立
- digitalRead 不工作
- 打印不工作
首先,删除去抖动检查并查看是否有效:
//if(millis() > (last_debounce_time + debounce_delay)){
要检查所有其他问题,请在剩余的 if 之前添加以下内容:
- 延迟,这样你就不会得到无穷无尽的数据
- 打印毫,last_debounce_time,debounce_delay 和 btn_read
- 行尾
然后 运行 并按下按钮。输出会让你知道问题是什么