Arduino UNO R3控制风扇小实验

接线的时候注意按照原接线图,一接上风扇就会转动,按键开关并没有起到任何作用;后面仔细检查了一下,发现不是代码的问题;而是按键开关哪里的接线有问题;数字信号控制口的2引脚那跟线不应该接按键开关的GND那个出接口,要换到高电平的那个入接口;最后观察到的现象就是开始风扇转动,按键开关按下风扇停止转动;再按,风扇重新开始转动*/

//初级http://www.dfrobot.com.cn/community/thread-2535-1-1.html

//实现开关控制风扇/*动作描述:检测开关状态是否发生变化,有的话改变继电器的状态每次进入loop,就会读取一次按键状态值,50ms前后按键状态不一致,则改变relay 的值所以需要一个btstate暂时存储50ms以前的数值用来做比较需要lastBtState 来存储上一次读取的按键状态,用来和当前读取的值作比较;

1.判断当前读取状态和上一次读取是否一致,不一致则更新上一个状态,同时记录当前时间;

2.判断时间是否过了50ms,是的话,检测当前读取的按键状态和上一个50ms状态是否相同,如果相同,则不做任何处理,如果不相同,则需要更新上一个50ms状态值,然后继续判断是否是上升沿电流改变,是的话才更新继电器状态;

int button = 3;
int relay = 2;
int cnt = 0;//计时器,记录按键开关状态发生变化那一时刻的时间
int delayTime = 50;//50ms再次检测开关状态,消除抖动的影响
int relayState = LOW;
int lastBtState = LOW;//相对当前读取到的按键的上一个状态
int btstate;//一个暂时存储50MS以前的按键状态

void setup() {
  // put your setup code here, to run once:
  pinMode(button,INPUT);
  pinMode(relay,OUTPUT);
  digitalWrite(relay,relayState);
}

void loop() {
  // put your main code here, to run repeatedly:
    int curState = digitalRead(button);
    if(curState != lastBtState){
      cnt = millis();
      //更新之前的按键状态;这个地方要特别注意,上一个状态更新是最新读取到的那个数值而不是btstate;很容易出错地
     lastBtState = curState;
    }
    if(millis() - cnt > 50)//消除抖动影响
    {
      if(curState != btstate)
      {
        //更新当前状态
        btstate = curState;
        if(btstate == HIGH){
          //上升沿,也就是说开关状态不仅改变了,而且是0->1的上升沿变化,只有符合这种条件的时候才改变relay的状态
          relayState = !relayState;
        }
      }
    }
  
     digitalWrite(relay,relayState);
    

   
}


你可能感兴趣的:(Arduino学习)