arduino用按钮控制灯光亮灭

了解按钮

要实现用按钮点灯,首先我们要先来了解一下按钮。
去淘宝搜了一圈,市面上的按钮大多都是这样子的

arduino用按钮控制灯光亮灭_第1张图片
他们的封装(内部结构)是这样子的:
arduino用按钮控制灯光亮灭_第2张图片
arduino用按钮控制灯光亮灭_第3张图片
也就是说,按钮的内部结构是有两头没连接的(如上图①②和③④没连接在一起),当按钮按下,①②就会接通③④。
我用一张图来做个比喻:
没按下时arduino用按钮控制灯光亮灭_第4张图片
按钮两端电流互不干扰(一般是横面同一种电流)

当按钮按下时:

arduino用按钮控制灯光亮灭_第5张图片

发光二极管

我们的灯光用的是普通的发光二极管,也就是所谓的LED灯
arduino用按钮控制灯光亮灭_第6张图片
arduino用按钮控制灯光亮灭_第7张图片
发光二极管网上的资料很多,随便一搜一大把,在这里不做过多介绍,不懂留言,或者私信,我给你手摸手教学,嘿嘿嘿

根据上图,送大家一句口诀:
长正短负,负胖正瘦。

arduino编程和接线

我没有找到我的LED灯,只有贴片的了,所以我用了arduino UNO R3的板载LED灯(13号引脚)
如果用led灯的话,接线是这样子的
arduino用按钮控制灯光亮灭_第8张图片

PS:(为什么上图会加了个电阻?)
Led灯的阻值会随着它两端电压的变化而改变,一般来说,如果直接将Led灯的正极接在Arduino的+5V,负极接在Arduino的GND,这个Led灯会直接烧坏。不过如果直接以Arduino的输出接口接Led灯的正极,在输出高电平点亮Led灯时倒不会烧坏,但是此时流过Led灯的电流已经达到了60mA以上,超过了Arduino输出端口的最大输出电流,长时间工作可能会损坏Arduinio板。所以接Led灯时最好要串联一个220欧姆左右的电阻,这样可以使流过Led灯的电流降到10mA左右。
LED 额定工作电压1.8V,额定工作电流10mA,由R=(5-1.8V)/10mA=20欧

LED的接线是:
短脚接GND
长脚接P13
按钮的接线是 一只脚接GND 一只脚接P6

代码:

void setup(){
  pinMode(6, INPUT);  //P6模式是输出
  digitalWrite(6,HIGH);  //P6输出高电平
  pinMode(13, OUTPUT);  //P13输出高电平
}
void loop(){
  if (digitalRead(6) == LOW)   //如果P6等于低电平(GND)
  {
    digitalWrite(13,HIGH);     //十三号引脚亮灯
  } else {
    digitalWrite(13,LOW);     //十三号引脚灭灯
  }
}

效果如下:

arduino按钮点灯(开源)

debug–消抖

用上面的代码,效果就是按下按钮,板载LED灯和你连接十三号引脚的灯就会亮

但是这样子并不好,有时候明明没有按下,你的灯会突然亮一下,这是为什么呢?
这是因为你的按钮会抖动,会突然接触上那么0.01秒,那么你的单片机也会识别到,认为是低电平了应该亮一下灯了,我们管他叫debug,那咋办勒?

那我们让他不在0.01秒识别不就没事了?
看了很多文章,一般的识别时间是20毫秒一次,也就是说,我识别你是低电平,好,那我等20毫秒,我怕你是突然抖动,耍我玩的,20毫秒后,诶,你还真是低电平,那我才给你开灯。

实现代码如下:

void setup(){
  pinMode(6, INPUT);
  digitalWrite(6,HIGH);
  pinMode(13, OUTPUT);
}
void loop(){
  if (digitalRead(6) == LOW) {
    delay(20);                          //20ms消抖
    if (digitalRead(6) == LOW) {
      digitalWrite(13,HIGH);
    }
  }
  if (digitalRead(6) == HIGH) {
    delay(20);                                 //消抖
    if (digitalRead(6) == HIGH) {
      digitalWrite(13,LOW);
    }
  }
}

这时候又有人来询问(刁难)我了

哎呀,你这个怎么要一直按着才能亮灯呀,好麻烦呀,能不能按一下就亮,按一下就灭呀,你该不会不行吧?????????????????????????????????????????????????????????????????????????????????????????????????
arduino用按钮控制灯光亮灭_第9张图片
我掉了整整两根头发,日思夜想,想了整整10秒钟,敲动键盘,啪啪啪,几秒钟就弄好了,代码如下:

volatile boolean LED;        //做个布尔类型变量 LED   布尔类型只有0和1  也就是真和假

void setup(){
  LED = 0;
  pinMode(6, INPUT);
  pinMode(13, OUTPUT);
}

void loop(){
  if (digitalRead(6) == LOW) {
    delay(50);                 //我这里抖的厉害(本人老帕金森)所以抖动延时到了50ms
    if (digitalRead(6) == LOW) {
      LED = !LED;                   //0不等于0=1    1不等于1=0
      digitalWrite(13,LED);          //LED=0或者1  就亮灭
	  while(digitalRead(6) == LOW)//如果6号引脚一直是低电平,则卡在这里不出去,这样子直到松开才能继续运气其他函数
    }
  }
}

这个时候又刁民,啊不,可爱的网友出来说了:“怎么那么复杂呀?有没有简单一点的呀?你该不会不行吧?巴拉巴拉吧啦吧啦…”

arduino用按钮控制灯光亮灭_第10张图片

void setup(){
  pinMode(6, INPUT);
  pinMode(13, OUTPUT);
}

void loop(){
  if (digitalRead(6) == LOW) {
    delay(200);     //帕金森  懂得都懂
    if (digitalRead(6) == LOW)   //按够0.2秒后
    {
      digitalWrite(13,(!digitalRead(13)));   //13号引脚不等于13号引脚    亮不等于亮 = 灭  灭不等于灭  = 亮
		while(digitalRead(6) == LOW)	//松开跳出死循环
		{
		}
    }

  }

}

好了,本章完事,本人去护发去了
arduino用按钮控制灯光亮灭_第11张图片

你可能感兴趣的:(笔记,单片机,arduino,物联网,c语言)