极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 111826|回复: 49

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

[复制链接]
发表于 2015-2-22 03:38:05 | 显示全部楼层 |阅读模式
本帖最后由 yqfans 于 2015-2-22 03:40 编辑

我在做【按键控制LED实验】,如下:

程序如下:

int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val

void setup()
{
pinMode(ledpin,OUTPUT);//定义小灯接口为输出接口
pinMode(inpin,INPUT);//定义按键接口为输入接口
}

void loop()
{
val=digitalRead(inpin);//  读取数字7 口电平值赋给val
if(val==LOW)//    检测按键是否按下,按键按下时小灯亮起
{ digitalWrite(ledpin,LOW);}
else
{ digitalWrite(ledpin,HIGH);}
}


————————————————————————————分割线

这个实验确实很简单,按着开关按钮别松开,为高电平,LED灯亮;松开按钮,为低电平,LED灯灭。

但现在问题来了,我想如何实现,按一下开关松开后,LED灯亮了;在按一下松开后,LED灯闪烁;在按下松开,LED灯灭了。如此循环。。。

因为生活中很多控制LED灯的开关都是这样的,这样只用一个按钮就解决了LED灯的开,状态切换和关闭三种状态,很方便。

希望知道的大神们指点下 ^_^


连接图如下:

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2015-2-22 03:42:35 | 显示全部楼层
{:soso_e160:}{:soso_e160:}{:soso_e160:}{:soso_e160:}{:soso_e160:}{:soso_e160:}{:soso_e160:}{:soso_e160:}  坐等朋友们来讨论
回复 支持 反对

使用道具 举报

发表于 2015-2-22 08:42:26 | 显示全部楼层
设置一个变量,记录当前的状态,例如 0灭 1亮 2闪烁。
每按一次循环换一个。0->1->2->0
程序需要的修改还有要处理键的抖动。和每次一变的处理,
需求很好,自己弄一弄。
回复 支持 反对

使用道具 举报

发表于 2015-2-22 13:51:26 | 显示全部楼层
初学者的话简单一点  可以定义一个变量 val  if(inpin==HIGH){val+=50} 然后对应的 0<val<=50   这样控制 你想要的三个模式   
回复 支持 反对

使用道具 举报

发表于 2015-2-22 19:17:40 | 显示全部楼层
最简单的办法
设置一个变量,控制灯的状态是亮还是闪还是灭

先是判断status的状态
然后决定闪烁还是亮或是灭,但这样不好,在过条语句过程中按按键,可能会没反应

我觉得,能做成 中断   ,那就好了!

loop()函数先判断  状态  是亮还是闪还是灭,中断函数根据当前状态的来改变状态控制变量的值
回复 支持 反对

使用道具 举报

发表于 2015-2-22 22:48:15 | 显示全部楼层
本帖最后由 smching 于 2015-2-22 22:51 编辑

void loop() {
  if (按开关)  {
    status=status+1;
  }

  if (status=4) {
      status =1;
   }

   switch (status) {
      case 1: 灯亮;
      case 2: 闪烁;
      case 3: 灯灭;
   }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-23 01:55:32 | 显示全部楼层
smching 发表于 2015-2-22 22:48
void loop() {
  if (按开关)  {
    status=status+1;


int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val

void setup()
{
pinMode(ledpin,OUTPUT);//定义小灯接口为输出接口
pinMode(inpin,INPUT);//定义按键接口为输入接口
}

void loop()
{
val=digitalRead(inpin);//读取数字7 口电平值赋给val
if(val==HIGH)   {  //检测按键是否按下,
   
    status=status+1;
    }
   
if(status=4) {
      status =1;
    }
switch (status) {
     case 1:  {digitalWrite(ledpin,HIGH);}
               
     case 2:  {digitalWrite(ledPin, HIGH); //点亮小灯
                    delay(1000); //延时1 秒
                    digitalWrite(ledPin, LOW); //熄灭小灯
                    delay(1000); // 延时1 秒
                  }     
     
      case 3: {digitalWrite(ledpin,LOW);}
     }
}

——————————————————————————分割线

按你的方法修改了之前的程序,但就是通不过!
我对这个status 也不明白怎么用,也不知道哪里的格式什么的写错了,发上报错图看看:

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-23 02:06:30 | 显示全部楼层
laofuz1024 发表于 2015-2-22 19:17
最简单的办法
设置一个变量,控制灯的状态是亮还是闪还是灭


int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val
void setup()
{
pinMode(ledpin,OUTPUT);//定义小灯接口为输出接口
pinMode(inpin,INPUT);//定义按键接口为输入接口
}
void loop()
{
val=digitalRead(inpin);//读取数字7 口电平值赋给val
if(val==HIGH)   {  //检测按键是否按下
   
     int a=a+1;
     }
   
    if(a=4) { a=1;}

    if ( a=1 ) {digitalWrite(ledpin,HIGH);}

    if ( a=2 ) {
               digitalWrite(ledPin, HIGH); //点亮小灯
               delay(1000); //延时1 秒
               digitalWrite(ledPin, LOW); //熄灭小灯
               delay(1000); // 延时1 秒
               }

    if ( a=3 ) {digitalWrite(ledpin,LOW);}
     
}

————————————————————————————————
自己写的上面程序,但也无法通过,不知道错在哪了,改半天,检查了半天也无果,之前也基本没有C语言的底子,无奈发上报错图。。。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2015-2-23 09:26:49 | 显示全部楼层
本帖最后由 smching 于 2015-2-23 09:34 编辑
yqfans 发表于 2015-2-23 02:06
int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val

a还没定义。必须定义int a
ledpin和ledPin是有区别的。
if(a=4)必须更改为 if(a==4)
回复 支持 反对

使用道具 举报

发表于 2015-2-23 09:32:39 | 显示全部楼层
yqfans 发表于 2015-2-23 02:06
int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val

问题解决后,记得使用debounce,不然按键一下将会触发几次事件。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-23 15:51:20 | 显示全部楼层
smching 发表于 2015-2-23 09:26
a还没定义。必须定义int a
ledpin和ledPin是有区别的。
if(a=4)必须更改为 if(a==4)


int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val
int a;

void setup()
{
pinMode(ledpin,OUTPUT);//定义小灯接口为输出接口
pinMode(inpin,INPUT);//定义按键接口为输入接口
}
void loop()
{
val=digitalRead(inpin);//读取数字7 口电平值赋给val
if(val==HIGH)   {  //检测按键是否按下,按键按下时小灯亮起
                 a=a+1;
                }
   
if(a==4){
            a=1;
           }

    if ( a==1 ) {
               digitalWrite(ledpin,HIGH);
                }
    if ( a==2 ) {
               digitalWrite(ledpin, HIGH); //点亮小灯
               delay(1000); //延时1 秒
               digitalWrite(ledpin, LOW); //熄灭小灯
               delay(1000); // 延时1 秒
               }
    if ( a==3 ) {
               digitalWrite(ledpin,LOW);
                }
     
}

——————————————————————————————
改后的程序,还是无法通过,int a 我放在前面了,(这个不能在后面直接用成 int a=a+1 么?我之前就是这用的)。 大小写的问题我改了,都改成小写了,谢谢比我细心啊。a=4改成了a==4了,这个我看了我们网站上关于 if 条件判断语句的知识,知道用“==”才能表示判断,而用“=”就成了赋值。
但是还是无法通过,看报错去查了好像是格式的问题,但我看了格式也没检查去问题,报错图如下:

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2015-2-23 23:52:19 | 显示全部楼层
yqfans 发表于 2015-2-23 02:06
int ledpin=11;//定义数字11 接口
int inpin=7;//定义数字7 接口
int val;//定义变量val

语法上的问题,就如楼上所说

但是这样写的话,当闪烁的时候,闪烁的那两秒钟按开关,不知道能不能接收得到

所以我觉得还是用中断最好
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-24 00:00:58 | 显示全部楼层
本帖最后由 yqfans 于 2015-2-24 00:02 编辑
laofuz1024 发表于 2015-2-23 23:52
语法上的问题,就如楼上所说

但是这样写的话,当闪烁的时候,闪烁的那两秒钟按开关,不知道能不能接收 ...


中断?。。。不会写啊,能举例说明不?我没有C语言基础,还有重要的一点就是上面的程序还没有通过,一直卡在那里
回复 支持 反对

使用道具 举报

发表于 2015-2-24 00:09:41 | 显示全部楼层
本帖最后由 laofuz1024 于 2015-2-24 00:11 编辑
yqfans 发表于 2015-2-24 00:00
中断?。。。不会写啊,能举例说明不?我没有C语言基础,还有重要的一点就是上面的程序还没有通过,一 ...


中断的知识,论坛里有好教程

http://www.geek-workshop.com/thread-1983-1-1.html

至于 你的代码,是不是你用别的软件写的,复制进编译器的,里面有些字符有问题,

你删了那行再重新输入试试

是 if 语句那个括号,用的不是英文半角输入下的括号,是用到中文输入状态下的括号了吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-24 00:55:45 | 显示全部楼层
laofuz1024 发表于 2015-2-24 00:09
中断的知识,论坛里有好教程

http://www.geek-workshop.com/thread-1983-1-1.html

对!程序通过了!太谢谢了,是括号的问题,那句应该是我不知道从那里复制的括号。
程序写入了,但是效果没出现,一开始灯是灭的,然后我按了一次按钮,灯一直在闪烁。。。。。然后再怎么按都没反应了,应该是你说的没有中断的问题吧,我去研究研究,完了再修改下我的程序。
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 01:10 , Processed in 0.042102 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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