极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18427|回复: 11

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

[复制链接]
发表于 2015-2-22 19:26:05 | 显示全部楼层 |阅读模式
本帖最后由 胖胖子 于 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
自己一步步学习吧,否则就没有意义了。建议第一步先按一下能点亮,第二步按五下点亮,第三步在实现设想的功 ...

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

使用道具 举报

发表于 2015-2-22 22:32:50 | 显示全部楼层
提示,设置一个全局变量,对按键数进行计数。 再根据计数控制灯。
回复 支持 反对

使用道具 举报

发表于 2015-2-22 23:56:48 | 显示全部楼层
胖胖子 发表于 2015-2-22 21:05
按一下亮一下LED是可以的,但是我想要按N 次以后才亮灯...卡这里好长时间了


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

使用道具 举报

 楼主| 发表于 2015-2-23 03:23:22 | 显示全部楼层
vblearn 发表于 2015-2-22 22:32
提示,设置一个全局变量,对按键数进行计数。 再根据计数控制灯。

我这样写的,可是还是无作用,只要按下按钮,小等就会亮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;
  }
}
}
回复 支持 反对

使用道具 举报

发表于 2015-2-23 06:19:42 | 显示全部楼层
本帖最后由 vblearn 于 2015-2-23 06:32 编辑

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

  19. void setup() {               
  20.   // initialize the digital pin as an output.
  21.   pinMode(p_switch, INPUT);     //
  22.   for (int i=0;i<7;i++)
  23.   {
  24.     pinMode(p_ledbegin+i,OUTPUT); //OUTPUT
  25.   }
  26. }

  27. void loop() {
  28.   int i,j;
  29.   int p=0;
  30.   int bAdd = 0;
  31.   //check button
  32.   byte reading = digitalRead(p_switch);
  33.   if (reading != m_buttonstate) { //如果按键状态发生了变化
  34.     delay(delaytime);
  35.     if (reading != m_buttonstate) { //如果在一定时间后仍发生变化(已去抖动)
  36.       m_buttonstate=reading;  //记录新状态
  37.       if (reading==LOW)  //如果当前是LOW,即放开键,则确认为一次按键
  38.       {
  39.         bAdd=1;
  40.       }
  41.     }
  42.   }
  43.   if (bAdd==1)  //数码管显示增加1
  44.   {
  45.     m_p++;
  46.     if (m_p>=10) m_p=0;
  47.   }
  48.   //控制数码管输出
  49.   for (j=0;j<7;j++)
  50.   {
  51.     if (a[m_p][j]==1)
  52.     {
  53.       digitalWrite(p_ledbegin+j, LOW);
  54.     }
  55.     else
  56.     {
  57.       digitalWrite(p_ledbegin+j, HIGH);
  58.     }
  59.   }
  60.   delay(2);              

  61. }
复制代码

回复 支持 反对

使用道具 举报

发表于 2015-2-23 12:40:11 | 显示全部楼层
定义一个全局变量 count 按下一下 count++  累计到5次之后再执行 digitalWrite(led,HIGH);  按键之后要有适当的延时
回复 支持 反对

使用道具 举报

发表于 2015-2-23 13:13:04 | 显示全部楼层
胖胖子 发表于 2015-2-23 03:23
我这样写的,可是还是无作用,只要按下按钮,小等就会亮2秒,,,

int led=8;

你的按钮按下是“高”,还是“低”?
回复 支持 反对

使用道具 举报

发表于 2015-2-24 12:10:50 | 显示全部楼层
下面是用中断检测电平变化“上升沿”,五次才能亮。

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

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

[pre lang="arduino" line="1" file="1.ino"]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;
    }
}[/code]
回复 支持 反对

使用道具 举报

发表于 2015-2-26 11:00:25 | 显示全部楼层
林定祥 发表于 2015-2-23 13:13
你的按钮按下是“高”,还是“低”?

int led=8;
int button=3;

=号右边的数字代表I/O输出口的编号。
回复 支持 反对

使用道具 举报

发表于 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);
  }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 22:11 , Processed in 0.064734 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表