幼浅问题请教,怎么修改成:按键点亮LED,再按键关闭LED
本人刚开始学习Arduino,照着一些例子做没难度,但稍微修改一下就遇到问题了,可能比较肤浅,还望诸位能给予指教!这段代码是《Arduino开发实战指南》书中的一段,我想改成按下键一次点亮LED,再按下键一次关闭LED。
在digitalWrite(13,LOW);上加入:
if(KeySum=2);
{
digitalWrite(13,LOW);
KeySum = 0;
}
但这样行不通,是什么原因?
另外while(1)怎么理解?(1)的意思书中都没有说明,是代表真吗?就是不用计算判断,必须进入下面的循环语句吗?
delay(50);这样判断按键的闭合与断开的抖动是否就可以了?还是有更好的方法?
《Arduino开发实战指南》书中的一段代码
------------------------------------------------
/*
数字I/O口实验
按键2,按键按下时,13脚LED点亮,同时向串口发送合计按键次数
当松开按键时,LED熄灭。
*/
//记录按键次数
int KeySum = 0;
void setup()
{
Serial.begin(9600);
pinMode(13,OUTPUT);
pinMode(2,INPUT_PULLUP);
}
void loop()
{
if(LOW==digitalRead(2))
{
delay(50);
if(LOW==digitalRead(2))
{
digitalWrite(13,HIGH);
KeySum++;
Serial.print(KeySum,DEC); //DEC:十进制,以ASCII文本打印到串口输出
while(1)
{
if(HIGH==digitalRead(2))
{
delay(50);
if(HIGH==digitalRead(2))
break; //break用于退出while循环
}
}
digitalWrite(13,LOW);
}
}
}
你应该好好学学C语言的 本帖最后由 阿瑞 于 2015-4-12 17:21 编辑
彩色大冰棍丶 发表于 2015-4-12 15:11 static/image/common/back.gif
你应该好好学学C语言的
学习C语言没错,本人也曾经用VB写过一些小程序,但却没有今Arduino困扰我。
请给予具体指教,或推荐哪本书曾讨论这三个相近问题,由衷感激! while(1)代表无限次重复执行while语句的循环,在网上查到了,不过很奇怪,在C语言书上并没有提到,本站的Arduino语法手册也没有相对应的说法。
(1)你的问题在没有做”去抖动处理”
"delay(50);这样判断按键的闭合与断开的抖动.."
Yes !
这是最简单方法!
更好的方法请自己在本论坛搜寻 “去抖”, 或用百度搜寻 “Arduino 去抖”
(2)Arduino 用 C/C++ 混和,
所有 C/C++ 语法 99.99% 都可以用,
while(38) {
//..
}
表示这 Loop 永不停止, 只要 while ( 不是 0 ) { } 都是
这与以下相同:
for( ;; ) {
//..
}
永不停止那不是无法停止啰 ?
错 ! 因你可以这样:
while(38) {
//..
if(吃饱了 || 很不爽) break; // || 表示 or (或者)
}
// Loop 内的break 会跳到这
同样用 for Loop 也是:
for( ;; ) {
//..
if(吃饱了 || 很不爽) break; // || 表示 or (或者)
}
// Loop 内的break 会跳到这
如果要用硬件处理去抖动,
可以用电容, 如下图
参考
http://www.ganssle.com/debouncing-pt2.htm
Try this:
// Toggle Switch 压放式开关 – by [email protected]
// 开关接 Pin 8, LED 灯接 Pin 9
int sPin = 8;// 只可以读取 0 LOWor 1 HIGH
int ledPin = 9; //改 13 即为内建的黄灯
int sVal = 0; // 读取传感器得到的值 sensorValue
int oldVal;
int bounce = 168; // 去抖动, 间隔时间大约 0.168 秒; 自己调整 !
long prevTime = 0; // previous time we read
int light = LOW; // 关灯 light = 0;
void setup() {
pinMode(sPin, INPUT); // 读取开关
pinMode(ledPin, OUTPUT);
pinMode(13, OUTPUT); digitalWrite(13, 0);// 关掉 pin 13的 LED
digitalWrite(ledPin, light); // 关掉LED
Serial.begin(9600);
oldVal = digitalRead(sPin);// 0 ~ 1
prevTime = millis( );// 读取执行到现在的时间
}
void onOff( ); // toggle 开关灯; 先宣告等下再写内容
void loop( ) {
sVal = digitalRead(sPin);// 0 ~ 1
if(sVal == oldVal) return;
if(millis( ) - prevTime < bounce) return;
oldVal = sVal;
if(sVal){// 不是 0 LOW
onOff( );
prevTime = millis( );
}
delay(18); // up to you :-)
Serial.println(sVal);
}
void onOff( ) {
light = ! light;// 或 light = 1 - light;
digitalWrite(ledPin, light); // 开或关
}
还去了解一下单片机键盘的思路吧 使用Bounce2可以去抖动
https://github.com/thomasfredericks/Bounce2 以下代码,每运行一次loop,就会切换led的输出。把loop更换成按键触发,将会形成按键一下点亮LED,再按键按一下关闭LED了。
int led = 13;
int state = 0;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, (state) ? HIGH : LOW);
state = !state;
delay(1000);
}
. 本帖最后由 ofourme 于 2015-4-13 18:17 编辑
if(KeySum=2); { digitalWrite(13,LOW); KeySum = 0; }
改为:
if(KeySum&1)
{
digitalWrite(13,LOW);
}
else
{
digitalWrite(13,1);
} attachInterrupt(pbIn,stateChange,FALLING);
可以用中断 公孙林 发表于 2015-4-13 16:58 static/image/common/back.gif
attachInterrupt(pbIn,stateChange,FALLING);
可以用中断
attachInterrupt( ) 并没有解决按钮抖动的问题喔 ! 阿瑞 发表于 2015-4-12 17:29 static/image/common/back.gif
while(1)代表无限次重复执行while语句的循环,在网上查到了,不过很奇怪,在C语言书上并没有提到,本站的Ar ...
1表示真 while(1)表示 循环条件一直为真,则会一直执行 tsaiwn 发表于 2015-4-12 19:24 static/image/common/back.gif
如果要用硬件处理去抖动,
可以用电容, 如下图
参考
这个办法好啊
页:
[1]
2