极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12173|回复: 4

用一个开关控制LED

[复制链接]
发表于 2016-7-22 20:49:40 | 显示全部楼层 |阅读模式
/*
  * 开关按一下LED就亮一下,再按一下就LED就灭
  */
int ledPin=7;  //LED引脚
int buttonPin=9;  //开关引脚
int ledState=0;  //LED的初始状态
int reading;   //存取开关的状态
int old_val=0;  //开关上次的状态
int buttonState;  //开关现在的状态

void setup() {
  pinMode(ledPin,OUTPUT);
  pinMode(buttonPin,INPUT);
}

void loop() {
  reading = digitalRead(buttonPin); //读取开关的状态
    if (reading!=old_val ){   //如果和上次的状态不相同
  buttonState=reading;  
  
  if(buttonState==HIGH){
    ledState=1-ledState;
  }
}
  digitalWrite(ledPin,ledState);
  old_val = reading;
}
回复

使用道具 举报

发表于 2016-7-23 10:57:14 | 显示全部楼层
用中断会简单很多。
试试
回复 支持 反对

使用道具 举报

发表于 2016-7-23 14:33:59 | 显示全部楼层
实际上就两件事,1、按钮是否被按(或又被按),2、根据按钮被按来点亮或关闭电珠。第一个问题,可以判断是否被按(如端口电平的变化)为了抗干扰可以延迟200ms左右再判断下,两次一个电平说明真的被按了,确认被按可以使用一个变量变化(不断取反,这样可以一次开,一次关),电珠可以根据变量来设置开关。随后需要判断按钮是否电平是否有变(表示松开了),没有松开跳过上面程序。松开了再到上面程序中循环。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-23 19:03:05 | 显示全部楼层
林定祥 发表于 2016-7-23 14:33
实际上就两件事,1、按钮是否被按(或又被按),2、根据按钮被按来点亮或关闭电珠。第一个问题,可以判断是 ...

/*
  * 开关按一下LED就亮一下,再按一下就LED就灭
  */
int ledPin=7;  //LED引脚
int buttonPin=9;  //开关引脚
int ledState=0;  //LED的初始状态
int reading;   //存取开关的状态
int old_val=0;  //开关上次的状态
int buttonState;  //开关现在的状态
int debounce;
int debounceTime=200;
int x=1;
void setup() {
  Serial.begin(9600);
  pinMode(ledPin,OUTPUT);
  pinMode(buttonPin,INPUT);
  
}
void loop() {
  reading = digitalRead(buttonPin); //读取开关的状
  if(reading!=old_val){
    debounce=millis();
  }
  if((millis()-debounce>debounceTime)){
    if (reading!=old_val ){   //如果和上次的状态不相同
  buttonState=reading;
  if(buttonState==HIGH){
    ledState=1-ledState;
  }
  }
  }  
   
  digitalWrite(ledPin,ledState);
  
  old_val = reading;
}

请你帮我修改下吧,我改了后更不行了,没达到你说 的那样
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-26 09:44:59 | 显示全部楼层
最后的修改



int buttonPin=9;//按钮连接到9号引脚
  int ledPin=7; //LED连接到7号引脚
  int ledState= LOW; //led的初始状态
  int buttonState=LOW; //记录button当前的状态
  int lastButtonState=LOW;//记录button前一个状态
   long lastDebounceTime=0;
   long debounceDelay=50;//去除抖动时间
void setup() {
  pinMode(buttonPin,INPUT);
  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,ledState);//设置led的初始状态
}

void loop() {
  int reading=digitalRead(buttonPin);//读取buttonPin的状态存在reading
  //一旦检测到数据发生变化,记录当前的时间
  if(reading!=lastButtonState){
    lastDebounceTime=millis();
  }
  //等待50ms,再进行一次判断,是否和当前button状态相同
  //如果当前状态不同,改变button状态
  //同时,如果button状态为高(也就是被按下),那么就改变led的状态
  if((millis()-lastDebounceTime)>debounceDelay){
   
    if(reading!=buttonState){
      buttonState=reading;
      //lastButtonState=reading;为什么写在这里不行?一定要写在最后
      if(buttonState==HIGH){
      ledState=!ledState;
    }
    }
  }
  digitalWrite(ledPin,ledState);
  lastButtonState=reading;
}
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 21:25 , Processed in 0.034761 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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