我想在执行之前计算按钮(开关)的按下次数
I want to count the number of presses of the button(switch) before it executes
我的代码只执行案例1。如果我按3次我需要。它将执行我的案例 3。非常感谢
int pushButton = 13;
void setup() {
Serial.begin(9600);
pinMode(pushButton, INPUT);
for(int pin=10;pin<=12;pin++){
pinMode(pin,OUTPUT);
}
}
void loop() {
int ctr=0;
int buttonState = digitalRead(pushButton);
if(buttonState ==1)
{
ctr+=1;
Serial.println(ctr);
}
switch (ctr) {
case 1:
Serial.println("00000000000000000000");
blinking();
break;
case 2:
Serial.println("AAAAAAAAAAAAAAAA");
running();
break;
case 3:
incremental();
default:
Serial.println("push the button");
}
}
void blinking(){
for(int z=0;z<=3;z++){
for(int i=10;i<=12;i++){
digitalWrite(i,HIGH);
}delay(500);
for(int i=10;i<=12;i++){
digitalWrite(i,LOW);
}delay(500);
}
}
void running(){
for(int z=0;z<=2;z++){
for(int i=10;i<=12;i++){
digitalWrite(i,HIGH);
delay(500);
digitalWrite(i,LOW);
}
}
}
void incremental(){
for(int z=0;z<=2;z++){
int d=1500;
for(int i=10;i<=12;i++){
digitalWrite(i,HIGH);
delay(d); d-=500;
}
for(int i=10;i<=12;i++){
digitalWrite(i,LOW);
}delay(500);
}
}
我的代码只执行案例1。如果我按3次我需要。它将执行我的案例 3。非常感谢
将int ctr=0
更改为static int ctr=0
这与在全局范围内声明 ctr
是一样的。
不会在每次调用loop
函数时重置为0
。
应检查按钮去抖。
除了每 次 次 loop()
运行 秒将 ctr 分配为零之外,您还有一个问题,即如果按住按钮, ctr
会不断增加,这可能不是你想要的。当默认情况下 运行 无限期时,它还会递增 ctr
三倍。不清楚您是否打算将案例 3 设为 fall-through 默认案例;它通常被认为是不好的做法或错误,因此如果是故意的,则值得发表评论。
以下代码使 ctr
静态,因此它并不总是被赋值为零,并且仅在按下按钮时递增 ctr
,如果只是 [=24] 则不会递增=] 或卡住。它也 returns ctr
在默认情况下为零,因此您可以循环状态(这可能不是您的意图)。为了清楚起见,我删除了调试输出。
void loop()
{
static int ctr = 0 ;
static bool button_down = false ;
int button_state = digitalRead(pushButton) == 1 ;
if( !button_down && button_state = 1 )
{
ctr++ ;
button_down = true ;
}
else if( button_state = 0 )
{
button_down = false ;
}
switch( ctr )
{
case 1:
blinking();
break;
case 2:
running();
break;
case 3:
incremental();
break ;
default:
ctr = 0 ;
break ;
}
}
我的代码只执行案例1。如果我按3次我需要。它将执行我的案例 3。非常感谢
int pushButton = 13;
void setup() {
Serial.begin(9600);
pinMode(pushButton, INPUT);
for(int pin=10;pin<=12;pin++){
pinMode(pin,OUTPUT);
}
}
void loop() {
int ctr=0;
int buttonState = digitalRead(pushButton);
if(buttonState ==1)
{
ctr+=1;
Serial.println(ctr);
}
switch (ctr) {
case 1:
Serial.println("00000000000000000000");
blinking();
break;
case 2:
Serial.println("AAAAAAAAAAAAAAAA");
running();
break;
case 3:
incremental();
default:
Serial.println("push the button");
}
}
void blinking(){
for(int z=0;z<=3;z++){
for(int i=10;i<=12;i++){
digitalWrite(i,HIGH);
}delay(500);
for(int i=10;i<=12;i++){
digitalWrite(i,LOW);
}delay(500);
}
}
void running(){
for(int z=0;z<=2;z++){
for(int i=10;i<=12;i++){
digitalWrite(i,HIGH);
delay(500);
digitalWrite(i,LOW);
}
}
}
void incremental(){
for(int z=0;z<=2;z++){
int d=1500;
for(int i=10;i<=12;i++){
digitalWrite(i,HIGH);
delay(d); d-=500;
}
for(int i=10;i<=12;i++){
digitalWrite(i,LOW);
}delay(500);
}
}
我的代码只执行案例1。如果我按3次我需要。它将执行我的案例 3。非常感谢
将int ctr=0
更改为static int ctr=0
这与在全局范围内声明 ctr
是一样的。
不会在每次调用loop
函数时重置为0
。
应检查按钮去抖。
除了每 次 次 loop()
运行 秒将 ctr 分配为零之外,您还有一个问题,即如果按住按钮, ctr
会不断增加,这可能不是你想要的。当默认情况下 运行 无限期时,它还会递增 ctr
三倍。不清楚您是否打算将案例 3 设为 fall-through 默认案例;它通常被认为是不好的做法或错误,因此如果是故意的,则值得发表评论。
以下代码使 ctr
静态,因此它并不总是被赋值为零,并且仅在按下按钮时递增 ctr
,如果只是 [=24] 则不会递增=] 或卡住。它也 returns ctr
在默认情况下为零,因此您可以循环状态(这可能不是您的意图)。为了清楚起见,我删除了调试输出。
void loop()
{
static int ctr = 0 ;
static bool button_down = false ;
int button_state = digitalRead(pushButton) == 1 ;
if( !button_down && button_state = 1 )
{
ctr++ ;
button_down = true ;
}
else if( button_state = 0 )
{
button_down = false ;
}
switch( ctr )
{
case 1:
blinking();
break;
case 2:
running();
break;
case 3:
incremental();
break ;
default:
ctr = 0 ;
break ;
}
}