会飞的狼之华仔 发表于 2016-7-22 20:49:40

用一个开关控制LED

/*
* 开关按一下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;
}

wolfcolorful 发表于 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 static/image/common/back.gif
实际上就两件事,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;
}
页: [1]
查看完整版本: 用一个开关控制LED