胖胖子 发表于 2015-2-22 19:26:05

求助! 一个按钮累计按5次以后点亮小灯

本帖最后由 胖胖子 于 2015-2-23 03:29 编辑

我想实现一个代码是一个按钮按5次以后可以点亮LED, 在按的过程中,如果等待时间过长的话,以前累计次数就清空

哪位大神能帮帮我, 万分感谢!


int led=8;
int button=3;
int num=0;

void setup(){
pinMode(led,OUTPUT);
pinMode(button,INPUT);
}

void loop(){
digitalWrite(led,LOW);
if(digitalRead(button)==HIGH){
    delay(10);
    digitalWrite(led,LOW);
    num=num+1;
if(num==5){
    delay(10);
    digitalWrite(led,HIGH);
    delay(2000);
    num=0;
}
}
}

无解,我自己这样写的一下,但是只要按下按钮,小灯就亮2秒,不是到5次以后才亮

林定祥 发表于 2015-2-22 20:32:43

自己一步步学习吧,否则就没有意义了。建议第一步先按一下能点亮,第二步按五下点亮,第三步在实现设想的功能。

胖胖子 发表于 2015-2-22 21:05:08

林定祥 发表于 2015-2-22 20:32 static/image/common/back.gif
自己一步步学习吧,否则就没有意义了。建议第一步先按一下能点亮,第二步按五下点亮,第三步在实现设想的功 ...

按一下亮一下LED是可以的,但是我想要按N 次以后才亮灯...卡这里好长时间了

vblearn 发表于 2015-2-22 22:32:50

提示,设置一个全局变量,对按键数进行计数。 再根据计数控制灯。

林定祥 发表于 2015-2-22 23:56:48

胖胖子 发表于 2015-2-22 21:05 static/image/common/back.gif
按一下亮一下LED是可以的,但是我想要按N 次以后才亮灯...卡这里好长时间了

提示一下,原来检测到按钮就电灯,现在检测到按钮让计数变量+1,再按一次再加一,只到判测到计数变量大于5才电灯,并将计数变量清0.……

胖胖子 发表于 2015-2-23 03:23:22

vblearn 发表于 2015-2-22 22:32 static/image/common/back.gif
提示,设置一个全局变量,对按键数进行计数。 再根据计数控制灯。

我这样写的,可是还是无作用,只要按下按钮,小等就会亮2秒,,,

int led=8;
int button=3;
int num=0;

void setup(){
pinMode(led,OUTPUT);
pinMode(button,INPUT);
}

void loop(){
digitalWrite(led,LOW);
if(digitalRead(button)==HIGH){
    delay(10);
    digitalWrite(led,LOW);
    num=num+1;
if(num==5){
    delay(10);
    digitalWrite(led,HIGH);
    delay(2000);
    num=0;
}
}
}

vblearn 发表于 2015-2-23 06:19:42

本帖最后由 vblearn 于 2015-2-23 06:32 编辑

你现在的写法,是按键等5个10MS之后就亮灯。判断按钮时,需要以按钮放开的时间为准。
还是请看看套件提供的例子,如何处理按键。
附上一个上次参照例程做的程序,希望有帮助。那个是按键后数码管依次从0显示到9。
byte p_switch=4; //4 port is switch
byte p_ledbegin=5; //5,6,7,8,9,10,11 ports are link to LED
byte a={
{ 1,1,1,1,1,1,0   },
{    0,1,1,0,0,0,0},
{    1,1,0,1,1,0,1},
{    1,1,1,1,0,0,1   },
{    0,1,1,0,0,1,1   },
{    1,0,1,1,0,1,1   },
{    1,0,1,1,1,1,1   },
{    1,1,1,0,0,0,0   },
{    1,1,1,1,1,1,1   },
{    1,1,1,1,0,1,1   }
};
byte m_buttonstate=LOW;//保存当前按钮的状态
//long m_lasttime=0;
int delaytime = 10; //10ms 用于去抖
int m_p = 0;

void setup() {               
// initialize the digital pin as an output.
pinMode(p_switch, INPUT);   //
for (int i=0;i<7;i++)
{
    pinMode(p_ledbegin+i,OUTPUT); //OUTPUT
}
}

void loop() {
int i,j;
int p=0;
int bAdd = 0;
//check button
byte reading = digitalRead(p_switch);
if (reading != m_buttonstate) { //如果按键状态发生了变化
    delay(delaytime);
    if (reading != m_buttonstate) { //如果在一定时间后仍发生变化(已去抖动)
      m_buttonstate=reading;//记录新状态
      if (reading==LOW)//如果当前是LOW,即放开键,则确认为一次按键
      {
      bAdd=1;
      }
    }
}
if (bAdd==1)//数码管显示增加1
{
    m_p++;
    if (m_p>=10) m_p=0;
}
//控制数码管输出
for (j=0;j<7;j++)
{
    if (a==1)
    {
      digitalWrite(p_ledbegin+j, LOW);
    }
    else
    {
      digitalWrite(p_ledbegin+j, HIGH);
    }
}
delay(2);            

}

小杰 发表于 2015-2-23 12:40:11

定义一个全局变量 count 按下一下 count++累计到5次之后再执行 digitalWrite(led,HIGH);按键之后要有适当的延时

林定祥 发表于 2015-2-23 13:13:04

胖胖子 发表于 2015-2-23 03:23 static/image/common/back.gif
我这样写的,可是还是无作用,只要按下按钮,小等就会亮2秒,,,

int led=8;


你的按钮按下是“高”,还是“低”?

Ansifa 发表于 2015-2-24 12:10:50

下面是用中断检测电平变化“上升沿”,五次才能亮。

你的 if(digitalRead(button)==HIGH)根本不起作用,按住开关,5次loop的时间就能满足。

如果不稳定,在开关两端并一个0.1uF的电容并且做好10k左右下拉电阻。

int led = 13;
int button = 3;
int num = 0;

void setup()
{
    pinMode(led, OUTPUT);
    pinMode(button, INPUT);
    attachInterrupt(1, MyFunc, RISING);//引脚3是中断1
}

void loop()
{
    if(num >= 5)
    {
      delay(10);
      digitalWrite(led, HIGH);
      delay(2000);
      digitalWrite(led, LOW);//这里你漏了
      num = 0;
    }
}

void MyFunc()
{
    delay(100);
    if(digitalRead(3) == HIGH)
    {
      num = num + 1;
    }
}

xinhoujue 发表于 2015-2-26 11:00:25

林定祥 发表于 2015-2-23 13:13 static/image/common/back.gif
你的按钮按下是“高”,还是“低”?

int led=8;
int button=3;

=号右边的数字代表I/O输出口的编号。

gpl 发表于 2015-2-26 19:22:27

int led=8;
int button=3;
int num=0;
int set=LOW;

void setup(){
pinMode(led,OUTPUT);
pinMode(button,INPUT);
}

void loop(){
if(set==LOW && digitalRead(button)==HIGH){
    delay(10);
    digitalWrite(led,LOW);
    set=HIGH;
    num=num+1;
}
if(set==HIGH && digitalRead(button)==LOW){
    delay(10);
    set=LOW;
}
if(num && num%5==0){
    delay(10);
    digitalWrite(led,HIGH);
}
}
页: [1]
查看完整版本: 求助! 一个按钮累计按5次以后点亮小灯