arduino通过开关控制led灯代码理解(适合所有开关类型)

方法一

const int LED=13;    //声明变量 LED灯接在13针脚;
const int BUTTON=7;  //声明变量,按钮接在第7针脚;
int val=0; //声明变量,用来存储按钮返回值HIGH或者LOW;
int val_old=0;//声明变量,存储上一次按钮返回值;比对val和val_old的值,来判断按钮是按下还是抬起
			 //val==LOW && val_old==HIGHT 抬起状态;val==HIGH && val_old==LOW 按下状态;
int state=0;//0 off,1 on 声明变量,起到中转的作用,小技巧;
void setup() //初始化;
{
  pinMode(LED,OUTPUT); //定义LED灯输入模式;
  pinMode(BUTTON,INPUT);//定义BUTTON为输出模式;
}

void loop()
 {
  val=digitalRead(BUTTON);//读取数字针脚的值;
	  if((val==HIGH) && (val_old==LOW))//比较前一次和现在的按钮返回的值,
	                                   //只有现在按下按钮这个状态下,才改变state的值
  {
    state=1-state;
  }
  if((val==LOW && val_old==HIGH)) //去抖的作用,一般10-15ms;
    {
      delay(10);
    }
  val_old=val;//把现在按钮返回的值赋予val_old;
  if(state==1)//控制灯开关;
    {
      digitalWrite(LED,HIGH);
    }
   else
   {
     digitalWrite(LED,LOW);
   }

}

这里写图片描述
方法二(使用了内部上拉电阻)

// 按键控制LED灯开关,使用内部上拉电阻;
const int LED = 13;
const int BUTTON = 7;
boolean state = false;//声明led灯的状态,默认是关的;

void setup
{
	pinMode(LED,OUTPUT);
	pinMode(BUTTON,INPUT_PULLUP);//按钮接内部上拉电阻;
}
void loop
{
	while(digitalRead(BUTTON) == HIGH){}//模拟:等待开关被按下;
										//因为使用了上拉电阻,未按下
										//之前,按钮一直保持着高电平。
										//直到按钮被按下,条件为假,跳出
										//循环,执行下边的语句。
	if(state = true)//判断:如果灯的状态是亮,则熄灭它,然后将状态
					//标记为灭(使用了取反的技巧);否则,如果灯的
					//状态是灭的,则点亮它,然后将状态标记为亮(使用取反);
	{
		digitalWrite(LED,LOW);
		state = !state;//标记灯的当前状态
	}
	else
	{
		digitalWrite(LED,HIGH);
		state = !state;//标记灯的当前状态
	}
	delay(500);
}

这里写图片描述
方法三:这个比较好理解(引自 赵英杰老师教材)

const byte LED = 13;
const byte SW = 8;
boolean lastState = LOW;//记录上次的开关状态,初始化为LOW
boolean toggle = LOW;//输出给LED的信号,初始化为LOW
byte click = 0;开关信号的改变次数,初始化为0

void setup() {
  pinMode(LED,OUTPUT);
  pinMode(SW,INPUT);
  lastState = digitalRead(SW);//读取开关的初始值
}

void loop() {
  boolean b1 = digitalRead(SW);//读取目前的开关状态

  if(b1 != lastState)//如果与以前的开关至不同
  {
    delay(20);//去震动
   boolean  b2 = digitalRead(SW);//再读取一次开关状态

    if(b2 == b1)//确认两次开关状态是否一致
    {
      lastState = b1;//存储开关状态
      click++;//次数累计
      }
    }
if(click == 2)//如果开关状态改变2次
{
  click = 0;//归零
  toggle = !toggle;//取相反值
  digitalWrite(LED,toggle);  
  }
}

在这里插入图片描述
方法四:中断函数attachInterrupt(推荐)
采用一个按钮控制,当按下按钮并松手时,led灯亮;当再次按下按钮并松手时,led灯灭。
比较上次写的判断语句,这次我们使用中断函数(attachInterrupt),使代码更简洁易懂。
中断函数(attachInterrupt):attachInterrupt(interrupt,function,mode)
interrupt:中断源(在Arduino中,中断源可选值为0或1,一般分别对应2号和3号引脚)
function:需要中断的函数名
mode:LOW(低电平触发)、CHANGE(变化时触发)、RISING(低电平变为高电平触发)、FALLING(高电平变为低电平触发)
注意:在写代码时,interrupt处要写成0或1,不能写成2或3

#define led 13
#define button 0
int state = LOW;
void setup() {
  // put your setup code here, to run once:
  pinMode(led, OUTPUT);
  attachInterrupt(button, use, RISING);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(led, state);
}
void use() {
  state = !state;
}
  • 30
    点赞
  • 187
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值