阿瑞 发表于 2015-4-12 14:10:55

幼浅问题请教,怎么修改成:按键点亮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);
      }
    }
}
   
               




彩色大冰棍丶 发表于 2015-4-12 15:11:42

你应该好好学学C语言的

阿瑞 发表于 2015-4-12 17:08:43

本帖最后由 阿瑞 于 2015-4-12 17:21 编辑

彩色大冰棍丶 发表于 2015-4-12 15:11 static/image/common/back.gif
你应该好好学学C语言的

学习C语言没错,本人也曾经用VB写过一些小程序,但却没有今Arduino困扰我。
请给予具体指教,或推荐哪本书曾讨论这三个相近问题,由衷感激!

阿瑞 发表于 2015-4-12 17:29:53

while(1)代表无限次重复执行while语句的循环,在网上查到了,不过很奇怪,在C语言书上并没有提到,本站的Arduino语法手册也没有相对应的说法。

tsaiwn 发表于 2015-4-12 19:16:52




(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 会跳到这

tsaiwn 发表于 2015-4-12 19:24:23


如果要用硬件处理去抖动,
可以用电容, 如下图
参考


http://www.ganssle.com/debouncing-pt2.htm

tsaiwn 发表于 2015-4-12 19:41:08

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); // 开或关
}



yhy630 发表于 2015-4-12 20:44:17

还去了解一下单片机键盘的思路吧

smching 发表于 2015-4-12 22:40:21

使用Bounce2可以去抖动
https://github.com/thomasfredericks/Bounce2

smching 发表于 2015-4-12 23:02:52

以下代码,每运行一次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 16:53:21

本帖最后由 ofourme 于 2015-4-13 18:17 编辑

if(KeySum=2);               {               digitalWrite(13,LOW);               KeySum = 0;               }

改为:

if(KeySum&1)
{
    digitalWrite(13,LOW);
}
else
{
    digitalWrite(13,1);
}

公孙林 发表于 2015-4-13 16:58:46

attachInterrupt(pbIn,stateChange,FALLING);

可以用中断

tsaiwn 发表于 2015-4-13 18:58:38

公孙林 发表于 2015-4-13 16:58 static/image/common/back.gif
attachInterrupt(pbIn,stateChange,FALLING);

可以用中断


attachInterrupt( ) 并没有解决按钮抖动的问题喔 !

彩色大冰棍丶 发表于 2015-4-15 10:03:18

阿瑞 发表于 2015-4-12 17:29 static/image/common/back.gif
while(1)代表无限次重复执行while语句的循环,在网上查到了,不过很奇怪,在C语言书上并没有提到,本站的Ar ...

1表示真   while(1)表示   循环条件一直为真,则会一直执行

wscr_wscr 发表于 2015-4-15 10:13:15

tsaiwn 发表于 2015-4-12 19:24 static/image/common/back.gif
如果要用硬件处理去抖动,
可以用电容, 如下图
参考


这个办法好啊
页: [1] 2
查看完整版本: 幼浅问题请教,怎么修改成:按键点亮LED,再按键关闭LED