laofuz1024 发表于 2015-2-26 04:04 static/image/common/back.gif
这些是我自己写的,试过,能用了!没有闪动
不过你要注意,设置 中断的引脚,如果是UNO板,只有 引脚 2和 ...
你这个sketch有问题吗?
我估计27行后的所有代码都不能正常操作。
试一下,在27行后,置入serial.println("test");
你会发觉当sum=2时,serial.println("test")跑得特别慢(慢了410毫秒)。
至于sum=1和sum=3时,也需等待10毫秒
smching 发表于 2015-2-26 12:14 static/image/common/back.gif
请删除第26行 val=digitalRead(inpin);
第27行 if(val==HIGH) 更换成 if(value==HIGH)
按你说的,改了,删除26行的意思是用Bounce2.h来控制按键,就不用读取相关I/o口电压状态了?
但改了以后,程序还是原样,不听使唤的:L
yqfans 发表于 2015-2-26 14:59 static/image/common/back.gif
按你说的,改了,删除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函数已经帮你定义了
赞一个您的帖子小于 10 个字符的限制
smching 发表于 2015-2-26 16:12 static/image/common/back.gif
第15行pinMode(inpin,INPUT_PULLUP);已经定义为INPUT_PULLUP,没有按下键时,inpin一直处在HIGH状态。
因 ...
我改成 if(val==LOW) 了,但是效果是没按就一直亮着,按下开关,灯灭;:L
yqfans 发表于 2015-2-26 19:21 static/image/common/back.gif
我改成 if(val==LOW) 了,但是效果是没按就一直亮着,按下开关,灯灭;
val已经没有用了,应该是if(value==HIGH)
smching 发表于 2015-2-26 14:24 static/image/common/back.gif
AtMega328(Arduino UNO)外部触发中断只有两个,就是D2和D3。
这里列出不同的Arduino使用不同的引脚触发中 ...
哦,但是我还是不明白
Timer触发中断,这是什么来的?
Timer是什么东西?
为什么又有三个:Timer0, Timer1, Timer2
smching 发表于 2015-2-26 14:35 static/image/common/back.gif
你这个sketch有问题吗?
我估计27行后的所有代码都不能正常操作。
操作肯定是正常的,要不怎么实现按键控制三种状态呢
但是我没注意这个时间的问题,现在电脑系统有点问题,不能再试试,
要谢谢你,提到这个,自己没仔细想到
能不能帮我看看关于74HC595芯片的问题呢?
http://www.geek-workshop.com/thread-12735-1-1.html
先谢谢了
laofuz1024 发表于 2015-2-26 04:04 static/image/common/back.gif
这些是我自己写的,试过,能用了!没有闪动
不过你要注意,设置 中断的引脚,如果是UNO板,只有 引脚 2和 ...
确实牛!不过我测试的效果还是12323131323...等乱跳的状态,感觉和我想要的效果123循环已经很接近了,我想问这是按钮抖动的问题么?要调用那个 Bounce2.h> 的文件么,就是用来防止开关抖动的?还有我发现了39行, if(sum>=4) sum=1;这个应该是 if(sum>=4) {sum=1;} 这样加中括号才行吧?还是 if 的语句也可以这样写?
yqfans 发表于 2015-2-27 03:40 static/image/common/back.gif
确实牛!不过我测试的效果还是12323131323...等乱跳的状态,感觉和我想要的效果123循环已经很接近了,我想 ...
在setup()里,增加debouncer.interval()的值
debouncer.interval(10); // interval in ms
yqfans 发表于 2015-2-27 03:40 static/image/common/back.gif
确实牛!不过我测试的效果还是12323131323...等乱跳的状态,感觉和我想要的效果123循环已经很接近了,我想 ...
那个bounce2.h的文件,英文的,看不懂,就不会用了
我试的时候,刚开始是有抖动的,但是后来加了 millis() 那些防抖动的逻辑之后就没见过了,不知道是不是我试的不够多
至于 if 语句,if(...)后面是跟代码块,这个代码块可以是一条语句,也可以是多条语句,如果是多条语句,那就必须用{}来括起来,要不然就相当于只有第一条语句是 if() 这个结构中的,后面的不属于 if() 逻辑了!!
也就是说,括号里面如果只有一条语句,那用不用这个大括号都是一样的,如果有多条语句,就必须用大括号! 只是有时候,为了结构美观和代码的可读性,一条语句也加这个大括号
本帖最后由 yqfans 于 2015-3-3 00:46 编辑
laofuz1024 发表于 2015-3-1 14:38 static/image/common/back.gif
那个bounce2.h的文件,英文的,看不懂,就不会用了
我试的时候,刚开始是有抖动的,但是后来加了 mill ...
1,确实是不受控制的亮闪灭3种状态的切换;我也看来看去,不知道哪儿的问题,我试图往unsigned long Millis=millis(); 这句括号中加上数字,变成(10)这样,程序就通不过了,不知道怎么改。。。
2,谢谢大神给我讲课,关于if语句的格式,我看懂了,我是程序小白,学习了。
yqfans 发表于 2015-3-3 00:45 static/image/common/back.gif
1,确实是不受控制的亮闪灭3种状态的切换;我也看来看去,不知道哪儿的问题,我试图往unsigned long Mi ...
你用我的程序,也是不受控制吗?奇怪了,我自己就行呢,亲自试过才发上来的
millis() 函数,功能就是 取得 机器开机的时长,好像是微秒为单位,是固定的,你在中间加参数,肯定不行
有时候程序自己改变状态,间隔非常短,就用 millis() 这个函数来取得上次状态改变的时间和这次的时间,间隔太短就算是机器的问题所以就不去理会(人来按按钮,不可能间隔这么小),这个的原因,我没有深入研究,忘了
laofuz1024 发表于 2015-3-3 01:10
你用我的程序,也是不受控制吗?奇怪了,我自己就行呢,亲自试过才发上来的
millis() 函数,功能就是...
确实是你发的那段程序,板子是uno r3,
硬件连接就如最开始的图
找了只按键,试了一下。很成功呢。
按键没有接电阻,直接用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 state1,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:}