Arduino按钮计数器

Arduino按钮计数器,arduino,Arduino,我正在使用Arduino,但我的代码遇到了问题。我想要一个按钮来点亮某些灯,每次你按下它,灯就会以不同的模式点亮。现在,代码没有记录按钮被按下的次数。我真的很感激任何帮助 const int buttonPin = 4; // pushbutton 1 pin int ledPins[] = {5,6,7,8,9,10}; int buttonCounter = 0; int buttonState = digitalRead(buttonPin); void setup(){ pi

我正在使用Arduino,但我的代码遇到了问题。我想要一个按钮来点亮某些灯,每次你按下它,灯就会以不同的模式点亮。现在,代码没有记录按钮被按下的次数。我真的很感激任何帮助

const int buttonPin = 4;  // pushbutton 1 pin
int ledPins[] = {5,6,7,8,9,10};
int buttonCounter = 0;  
int buttonState = digitalRead(buttonPin);

void setup(){
  pinMode(buttonPin, INPUT); 
  Serial.begin(9600); 
  // The for loop refers to each pin number
  // by their position in the array
  for(int i = 0; i < 6; i++){
    pinMode(ledPins[i], OUTPUT);
  }
}

 int countButtonPresses() 
 {
   if (buttonState == 0) 
   {
     buttonCounter = buttonCounter + 1;
   }
   return buttonCounter;
 }

void loop(){
  int displayTime = 800;
  int pattern = countButtonPresses();
  Serial.println(pattern);
  switch(pattern) {
    case 1: 
      for(int i = 0; i <=5; i++){
        digitalWrite(ledPins[i], HIGH);
        delay(displayTime);
        digitalWrite(ledPins[i], LOW);
      }
      break;
    case 2:
      for(int i = 0; i <=5; i += 2){
        digitalWrite(ledPins[i], HIGH);
        delay(displayTime); 
        digitalWrite(ledPins[i], LOW);
      }
      break;
    default:
      Serial.println(countButtonPresses());
  }
}
const int buttonPin=4;//按钮1引脚
int-ledPins[]={5,6,7,8,9,10};
int buttonCounter=0;
int buttonState=digitalRead(buttonPin);
无效设置(){
pinMode(按钮输入,输入);
Serial.begin(9600);
//for循环指的是每个管脚编号
//根据它们在阵列中的位置
对于(int i=0;i<6;i++){
引脚模式(LED引脚[i],输出);
}
}
int countButtonPresses()
{
如果(按钮状态==0)
{
buttonCounter=buttonCounter+1;
}
返回按钮计数器;
}
void循环(){
int displayTime=800;
int pattern=countbuttonpress();
串行打印LN(模式);
开关(模式){
案例1:

对于(int i=0;i我稍微修改了您的代码。我添加了一个简单的中断,无论您的代码指针当前在何处,它都会修改计数(这将使您能够存储按下次数,即使您在循环中)

int buttonPin=2;//按钮1引脚
int-ledPins[]={5,6,7,8,9,10};
volatile int buttonCounter=0;
int buttonState=0;
void countbuttonpress();
无效执行照明(int LED引脚[6],int延迟时间,int增量);
无效设置(){
pinMode(按钮输入,输入);
Serial.begin(9600);
//for循环指的是每个管脚编号
//根据它们在阵列中的位置
对于(int i=0;i<6;i++){
引脚模式(LED引脚[i],输出);
}
//这里好多了
buttonState=digitalRead(buttonPin);
//将中断连接到按钮引脚
附件中断(0,计数按钮按下,下降);
}
void循环(){
int displayTime=800;
Serial.println(按钮计数器);
开关(按钮计数器){
案例1:
执行照明(LED引脚,显示时间,1);
打破
案例2:
执行照明(LED引脚,显示时间,2);
打破
}
}
void countbuttonpress()
{
按钮计数器++;
//使用模式数修改此条件
如果(按钮计数器>2)
按钮计数器=1;
}
无效执行照明(int LED引脚[6],int延迟时间,int增量)
{

对于(inti=0;i,在我看来,问题是您不清楚自己想要做什么:-)

第一个错误是逻辑错误:您无法计算按钮按下的次数,因为当您按下一次按钮时,程序返回“一”,并执行模式一。下次您按下按钮时,程序再次返回“一”,依此类推。因此,您必须更改逻辑(例如,第一次按时,执行模式一,第二次按时,执行模式二)

第二个错误是对按钮按下的处理。假设您的按钮返回零(我们称之为“低激活”),则您的程序可能会在您释放它之前计数几十次。原因是您没有对其进行“去抖动”

“反弹”效应是你的Arduino比你快,如果你按下一个按钮十分之一秒,Arduino会循环几次,发现按钮被按下,并计算出多次“按下”

为了避免这种情况,当您发现它被按下时(buttonstate=0),您必须执行照明任务,并等待buttonstate变为!=0。此外,您必须在loop()函数中移动指令“buttonstate=digitalRead(buttonPin);”,以便连续读取按钮的状态


我“甩了”一些让它工作的想法;尝试写得更好,如果有问题,请再次询问。

我制作了一个视频,详细解释了如何实现这一点:以防其他人正在寻找它。

看起来好像您在初始化过程中设置了buttonState,并且从不更改它。如果buttonState最初为非零,您将永远不会更改它记住计数器。也许你应该读一下主回路中的按钮销?
int buttonPin = 2;  // pushbutton 1 pin
int ledPins[] = {5,6,7,8,9,10};
volatile int buttonCounter = 0;
int buttonState = 0;

void countButtonPresses();
void ExecuteIllumination(int ledPins[6],int DelayTime,int increments);

void setup(){
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
  // The for loop refers to each pin number
  // by their position in the array
  for(int i = 0; i < 6; i++){
    pinMode(ledPins[i], OUTPUT);
  }
  //Here is much better
  buttonState=digitalRead(buttonPin);

  //Attach interrupt to button pin
  attachInterrupt(0,countButtonPresses,FALLING);
}

void loop(){
  int displayTime = 800;
  Serial.println(buttonCounter);
  switch(buttonCounter) {
    case 1:
      ExecuteIllumination(ledPins,displayTime,1);
      break;
    case 2:
      ExecuteIllumination(ledPins,displayTime,2);
      break;
      }
}

void countButtonPresses()
 {
   buttonCounter++;
   // modify this condition with number of patterns
   if (buttonCounter>2)
    buttonCounter=1;
 }
void ExecuteIllumination(int ledPins[6],int DelayTime,int increments)
{
    for(int i = 0; i <=5; i += increments){
        digitalWrite(ledPins[i], HIGH);
        delay(DelayTime);
        digitalWrite(ledPins[i], LOW);
      }
}