新手-关于开关控制灯的问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6760|回复: 8

新手--关于开关控制灯的问题

[复制链接]
发表于 2012-11-14 00:03 | 显示全部楼层 |阅读模式
本帖最后由 nhj1989 于 2012-11-14 00:04 编辑

void setup() {               

  pinMode(13, OUTPUT);   
  pinMode(2,INPUT);
}

void loop() {
  if(digitalRead(2)==0){
    digitalWrite(13, HIGH);   // set the LED on
  }else{
    digitalWrite(13, LOW);    // set the LED off
  }
}

这个程序,为啥执行的时候不按开关灯也是亮的?按下开关灯会变的更亮

板子为 zduino uno

这个论坛帖子容量太小了吧。图片可以看这里
http://zhan.renren.com/codeart?g ... 78067&from=post



 楼主| 发表于 2012-11-14 23:37 | 显示全部楼层
奈何col 发表于 2012-11-14 01:04
pinMode(2,INPUT);  修改为pinMode(2,INPUT_PULLUP);

谢谢指导。昨晚我也这样尝试过了。但是发现不行,程序报错,原来我用的开发环境是1.0的。里边貌似不支持
INPUT_PULLUP这个关键字。今晚更新了1.0.2版本 已经解决问题了 3Q
发表于 2012-11-14 01:04 | 显示全部楼层
pinMode(2,INPUT);  修改为pinMode(2,INPUT_PULLUP);
发表于 2012-11-14 16:15 | 显示全部楼层
2脚处于输入状态时,对外界环境非常敏感。当按键抬起时,2脚是处于悬空状态的。也就是说,它的状态是不确定的。很容易感应到其周围的电场而发生变化。所以,需要加一个上拉电阻,也就是接一个1-10k的电阻到电源Vcc。使其在按键松开后保证处于高电平的状态。

奈何的方法是通过程序的方法,使其在芯片内部接通一个上拉电阻。原理是一样的。
发表于 2012-11-14 20:24 | 显示全部楼层
[mw_shl_code=c,true]void setup ()
{
  pinMode(2,INPUT);                 
  pinMode(13,OUTPUT);
  Serial.begin(9600);


}
void loop ()
{
    if (digitalRead(2)==HIGH&&digitalRead(13)==LOW)
  {
   digitalWrite(13,HIGH);
    Serial.print("Turn on the LED");
    while (digitalRead(2)==HIGH)
    {
    delay(1);
    }
  }
  else if  (digitalRead(2)==HIGH&&digitalRead(13)==HIGH)
  {
    digitalWrite(13,LOW);
    Serial.print("Turn off the LED");
    while (digitalRead(2)==HIGH)
    {
    delay(1);
    }
  }
}[/mw_shl_code] 加上软件消抖。
 楼主| 发表于 2012-11-14 23:39 | 显示全部楼层
炼心斋 发表于 2012-11-14 16:15
2脚处于输入状态时,对外界环境非常敏感。当按键抬起时,2脚是处于悬空状态的。也就是说,它的状态是不确定 ...

谢谢讲解啊,不过因为我没有学过电路理解有点困难~不过正计划学习 哈哈~十分感谢
 楼主| 发表于 2012-11-14 23:53 | 显示全部楼层
EthanWain 发表于 2012-11-14 20:24
[mw_shl_code=c,true]void setup ()
{
  pinMode(2,INPUT);                 

void loop ()
{
    if (digitalRead(2)==HIGH&&digitalRead(13)==LOW)//灯亮,开关状态 断开
  {
   digitalWrite(13,HIGH);//连接开关--开关状态 开 灯超亮
    Serial.print("Turn on the LED");
    while (digitalRead(2)==HIGH)//灯亮
    {
    delay(1);//灯亮,闪烁(此时的2 上的电平是不是 在高电平与低电平之间互相切换??)
    }
  }
  else if  (digitalRead(2)==HIGH&&digitalRead(13)==HIGH)//此时开关状态为开,灯闪烁亮
  {
    digitalWrite(13,LOW);//此时开关断开--灯灭
    Serial.print("Turn off the LED");
    while (digitalRead(2)==HIGH)
    {
    delay(1); //灯亮 闪烁
    }
  }



没看懂这位兄弟贴这个代码是什么意思,不过我还是认真的看了一下,这个状态小灯一直闪烁。按下开关的时候 。有时候是灯更亮了,有时候是灯灭了,我对程序加了一些注释。如果 delay 情况下 是低电平那么我分析的可能就是对的了。还请指教~新手。刚刚接触arduino 对电路电子什么的完全不理解。我是java程序员,但是不知道对学习arduino有没有啥影响~呵呵,不过 十分感谢
发表于 2012-11-15 15:12 | 显示全部楼层
。。。算了 我给加上注释吧,
[mw_shl_code=c,true]void setup ()
{
  pinMode(2,INPUT);                 
  pinMode(13,OUTPUT);
  Serial.begin(9600);


}
void loop ()
{
    if (digitalRead(2)==HIGH&&digitalRead(13)==LOW)   //同时检测开关是否按下和led是否点亮(LOW为未点亮)
  {
   digitalWrite(13,HIGH);                             //点亮led
    Serial.print("Turn on the LED");                  //串口发出字符串
    while (digitalRead(2)==HIGH)                      //消抖,检测按钮是否一直按下,如是测无限延迟,如不加此行代码按下按钮则会不停开关,松开时led状态不可控
    {
    delay(1);
    }
  }
  else if  (digitalRead(2)==HIGH&&digitalRead(13)==HIGH) //同时检测开关是否按下和led是否点亮(high为点亮)
  {
    digitalWrite(13,LOW);                                //关灯
    Serial.print("Turn off the LED");
    while (digitalRead(2)==HIGH)
    {
    delay(1);
    }
  }
}[/mw_shl_code]
次代码的作用是 按下按钮灯泡亮,再按下灯泡灭
发表于 2012-11-18 18:56 | 显示全部楼层
PIN2作为输入口,其输入阻抗大,当有小的扰动,其状态会发生改变。
1:PIN2需对地加一个10K左右的电阻。
2:按键程式,需作抗干扰处理。如检测到按键状态发发改变时,再过10mS,再确认状态。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-27 07:20 , Processed in 0.115964 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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