求助! 一个按钮累计按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 static/image/common/back.gif
自己一步步学习吧,否则就没有意义了。建议第一步先按一下能点亮,第二步按五下点亮,第三步在实现设想的功 ...
按一下亮一下LED是可以的,但是我想要按N 次以后才亮灯...卡这里好长时间了 提示,设置一个全局变量,对按键数进行计数。 再根据计数控制灯。 胖胖子 发表于 2015-2-22 21:05 static/image/common/back.gif
按一下亮一下LED是可以的,但是我想要按N 次以后才亮灯...卡这里好长时间了
提示一下,原来检测到按钮就电灯,现在检测到按钮让计数变量+1,再按一次再加一,只到判测到计数变量大于5才电灯,并将计数变量清0.…… 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: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);
}
定义一个全局变量 count 按下一下 count++累计到5次之后再执行 digitalWrite(led,HIGH);按键之后要有适当的延时 胖胖子 发表于 2015-2-23 03:23 static/image/common/back.gif
我这样写的,可是还是无作用,只要按下按钮,小等就会亮2秒,,,
int led=8;
你的按钮按下是“高”,还是“低”? 下面是用中断检测电平变化“上升沿”,五次才能亮。
你的 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;
}
} 林定祥 发表于 2015-2-23 13:13 static/image/common/back.gif
你的按钮按下是“高”,还是“低”?
int led=8;
int button=3;
=号右边的数字代表I/O输出口的编号。 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]