我使用的是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());
}
}
答案 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万一其他人正在寻找此事。