极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: yqfans

小白求助~ 按键控制LED,如何按一下松开,亮;按一下松开,闪烁;再按一下松开,灭。

[复制链接]
发表于 2015-2-26 14:35:32 | 显示全部楼层
laofuz1024 发表于 2015-2-26 04:04
这些是我自己写的,试过,能用了!没有闪动

不过你要注意,设置 中断的引脚,如果是UNO板,只有 引脚 2和 ...


你这个sketch有问题吗?
我估计27行后的所有代码都不能正常操作。

试一下,在27行后,置入serial.println("test");
你会发觉当sum=2时,serial.println("test")跑得特别慢(慢了410毫秒)。
至于sum=1和sum=3时,也需等待10毫秒
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-26 14:59:04 | 显示全部楼层
smching 发表于 2015-2-26 12:14
请删除第26行 val=digitalRead(inpin);
第27行 if(val==HIGH) 更换成 if(value==HIGH)

按你说的,改了,删除26行的意思是用Bounce2.h来控制按键,就不用读取相关I/o口电压状态了?
但改了以后,程序还是原样,不听使唤的
回复 支持 反对

使用道具 举报

发表于 2015-2-26 16:12:19 | 显示全部楼层
yqfans 发表于 2015-2-26 14:59
按你说的,改了,删除26行的意思是用Bounce2.h来控制按键,就不用读取相关I/o口电压状态了?
但改了以后 ...

第15行pinMode(inpin,INPUT_PULLUP);已经定义为INPUT_PULLUP,没有按下键时,inpin一直处在HIGH状态。
因此第27行if(val==HIGH)必须更换成f(val==LOW)
第19行pinMode(inpin,INPUT);可以删除,bounce函数已经帮你定义了
回复 支持 反对

使用道具 举报

发表于 2015-2-26 16:40:58 | 显示全部楼层
赞一个  您的帖子小于 10 个字符的限制
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-26 19:21:18 | 显示全部楼层
smching 发表于 2015-2-26 16:12
第15行pinMode(inpin,INPUT_PULLUP);已经定义为INPUT_PULLUP,没有按下键时,inpin一直处在HIGH状态。
因 ...

我改成 if(val==LOW) 了,但是效果是没按就一直亮着,按下开关,灯灭;
回复 支持 反对

使用道具 举报

发表于 2015-2-26 23:25:57 | 显示全部楼层
yqfans 发表于 2015-2-26 19:21
我改成 if(val==LOW) 了,但是效果是没按就一直亮着,按下开关,灯灭;

val已经没有用了,应该是if(value==HIGH)
回复 支持 反对

使用道具 举报

发表于 2015-2-27 02:32:03 | 显示全部楼层
smching 发表于 2015-2-26 14:24
AtMega328(Arduino UNO)外部触发中断只有两个,就是D2和D3。
这里列出不同的Arduino使用不同的引脚触发中 ...

哦,但是我还是不明白

Timer触发中断,这是什么来的?
Timer是什么东西?


为什么又有三个:Timer0, Timer1, Timer2
回复 支持 反对

使用道具 举报

发表于 2015-2-27 02:36:09 | 显示全部楼层
smching 发表于 2015-2-26 14:35
你这个sketch有问题吗?
我估计27行后的所有代码都不能正常操作。

操作肯定是正常的,要不怎么实现按键控制三种状态呢

但是我没注意这个时间的问题,现在电脑系统有点问题,不能再试试,

要谢谢你,提到这个,自己没仔细想到


能不能帮我看看关于74HC595芯片的问题呢?
http://www.geek-workshop.com/thread-12735-1-1.html

先谢谢了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-27 03:40:16 | 显示全部楼层
laofuz1024 发表于 2015-2-26 04:04
这些是我自己写的,试过,能用了!没有闪动

不过你要注意,设置 中断的引脚,如果是UNO板,只有 引脚 2和 ...

确实牛!不过我测试的效果还是12323131323...等乱跳的状态,感觉和我想要的效果123循环已经很接近了,我想问这是按钮抖动的问题么?要调用那个 Bounce2.h> 的文件么,就是用来防止开关抖动的?还有我发现了39行, if(sum>=4) sum=1;  这个应该是 if(sum>=4) {sum=1;} 这样加中括号才行吧?还是 if 的语句也可以这样写?  
回复 支持 反对

使用道具 举报

发表于 2015-2-27 09:49:10 | 显示全部楼层
yqfans 发表于 2015-2-27 03:40
确实牛!不过我测试的效果还是12323131323...等乱跳的状态,感觉和我想要的效果123循环已经很接近了,我想 ...

在setup()里,增加debouncer.interval()的值
debouncer.interval(10); // interval in ms
回复 支持 反对

使用道具 举报

发表于 2015-3-1 14:38:31 | 显示全部楼层
yqfans 发表于 2015-2-27 03:40
确实牛!不过我测试的效果还是12323131323...等乱跳的状态,感觉和我想要的效果123循环已经很接近了,我想 ...

那个bounce2.h的文件,英文的,看不懂,就不会用了

我试的时候,刚开始是有抖动的,但是后来加了 millis() 那些防抖动的逻辑之后就没见过了,不知道是不是我试的不够多

至于 if 语句,if(...)后面是跟代码块,这个代码块可以是一条语句,也可以是多条语句,如果是多条语句,那就必须用{}来括起来,要不然就相当于只有第一条语句是 if() 这个结构中的,后面的不属于 if() 逻辑了!!

也就是说,括号里面如果只有一条语句,那用不用这个大括号都是一样的,如果有多条语句,就必须用大括号! 只是有时候,为了结构美观和代码的可读性,一条语句也加这个大括号
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-3 00:45:38 | 显示全部楼层
本帖最后由 yqfans 于 2015-3-3 00:46 编辑
laofuz1024 发表于 2015-3-1 14:38
那个bounce2.h的文件,英文的,看不懂,就不会用了

我试的时候,刚开始是有抖动的,但是后来加了 mill ...


1,确实是不受控制的亮闪灭3种状态的切换;我也看来看去,不知道哪儿的问题,我试图往unsigned long Millis=millis(); 这句括号中加上数字,变成(10)这样,程序就通不过了,不知道怎么改。。。
2,谢谢大神给我讲课,关于if语句的格式,我看懂了,我是程序小白,学习了。
回复 支持 反对

使用道具 举报

发表于 2015-3-3 01:10:21 | 显示全部楼层
yqfans 发表于 2015-3-3 00:45
1,确实是不受控制的亮闪灭3种状态的切换;我也看来看去,不知道哪儿的问题,我试图往unsigned long Mi ...

你用我的程序,也是不受控制吗?奇怪了,我自己就行呢,亲自试过才发上来的

millis() 函数,功能就是 取得 机器开机的时长,好像是微秒为单位,是固定的,你在中间加参数,肯定不行

有时候程序自己改变状态,间隔非常短,就用 millis() 这个函数来取得上次状态改变的时间和这次的时间,间隔太短就算是机器的问题所以就不去理会(人来按按钮,不可能间隔这么小),这个的原因,我没有深入研究,忘了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-3 12:59:17 来自手机 | 显示全部楼层
laofuz1024 发表于 2015-3-3 01:10
你用我的程序,也是不受控制吗?奇怪了,我自己就行呢,亲自试过才发上来的

millis() 函数,功能就是  ...

确实是你发的那段程序,板子是uno r3,
硬件连接就如最开始的图
回复 支持 反对

使用道具 举报

发表于 2015-3-3 20:12:07 | 显示全部楼层


找了只按键,试了一下。很成功呢。
按键没有接电阻,直接用Uno的内部上拉电阻。
亦没有接LED,就用Uno上D13的LED吧。
LED的闪动,没有用delay()功能做计时。
取而代之,采用了millis()功能做计时,从而避免了漏读按键的问题。
按键的抖动,就简单的用了delay()功能去处理。效果还不错呢。

const int buttonPin = 12;       //button pin number
const int ledPin =  13;         //LED pin number
int buttonState = 3;            //button state  1,2,3
unsigned long currentMillis;    //record the current time for blinking
long previousMillis = 0;        //store the last time LED was updated
long interval = 1000;           //interval at which to blink (milliseconds)
/////////////////////////////////////////////////////////////////////////////////////////
void setup()
{
  pinMode(ledPin, OUTPUT);      
  pinMode(buttonPin, INPUT);   
  digitalWrite(buttonPin, HIGH); //use internal pull up resistor
}////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
void loop()
{
if (digitalRead(buttonPin) == LOW)   //Not pressed - HIGH; Pressed - LOW
   {  
    buttonState++;
    if (buttonState > 3) buttonState = 1;  //button State from 1 to 3
    //  
    delay(450);             /////handle debouncing//////////////
   }// end if digitalRead(buttonPin)
///////////////////////////////////
switch (buttonState)
{
  case 1:
         digitalWrite(ledPin, HIGH);
         break;
  case 2:
         currentMillis = millis();                           //start the timer
         if (currentMillis - previousMillis > interval)      //timer moved forward by the preset interval
           {
            previousMillis = currentMillis;   
            digitalWrite( ledPin, digitalRead( ledPin ) ^ 1 );   //read the state of the Led, reverse it and turn it on or off accordingly
           }
         break;
  case 3:
         digitalWrite(ledPin, LOW);  
         break;
}//end switch        
}/////end loop
/////////////////////////////////////////////////////////////////////////////

试试看{:soso_e100:}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 21:40 , Processed in 0.048449 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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