Arduino按钮计数器

时间:2014-07-29 14:34:56

标签: 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(){
  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());
  }
}

3 个答案:

答案 0 :(得分:2)

在我看来,问题在于你并不清楚自己想做什么: - )

第一个错误是合乎逻辑的:您无法计算按下按钮的次数,因为当您按下按钮一次时,程序返回&#34;一个&#34;,并执行模式一。下次按下按钮时,程序将返回&#34;一个&#34;再一次,等等。因此,您必须更改逻辑(例如,当您第一次按下时,执行模式1,当您按第二次时,执行模式2)。

第二个错误是按下按钮的处理。如果按钮返回零(假设&#34;活动低和#34;),则假设您的按钮被按下,可能您的程序在发布之前会计数几十次。造成这种情况的原因在于你没有&#34;去除&#34;它。

&#34;弹跳&#34;效果是你的Arduino比你快,如果你按下一个按钮十分之一秒,Arduino会循环几次,按下按钮并计算许多&#34;按下&#34;。

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

我&#34;倾倒&#34;使它成功的一些想法;尝试写得更好,如果有问题,再问一遍。

答案 1 :(得分:0)

我修改了你的代码。我添加了一个简单的中断,无论你的代码指针当前在哪里,它都会修改计数(这样即使你在循环中也可以存储数量)。

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);
      }
}

您可能需要注意按钮的弹跳效果: Button debouncing

答案 2 :(得分:0)

我制作了一个视频,详细解释了如何实现这一目标:arduino button counter万一其他人正在寻找此事。