Arduino 卡片13自制风扇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MadeInJack/article/details/51711789

1、硬件部分

做一个小风扇。同时会接触两件新元件——继电器、直流电机。继电器,我们可以理解为是用较小的电流去控制较大电流的一种“自动开关”。在这里,继电器是用来控制电机转动的。

按下图进行连线,按钮连接到数字2。按钮一端连接5V,另一端连接GND,并用一个220Ω的电阻作为下拉电阻,以防引脚悬空干扰。继电器有6个引脚,分别标有序号。1,2引脚为继电器的输入信号,分别接Arduino的数字引脚和GND。3,4,5,6为继电器输出的控制引脚,这里只使用4,6两个引脚。我们把继电器想成一个开关,开关也只要用到两个引脚。


2、代码部分

//通过按键,可以控制电机和LED的开和关。
int buttonPin = 2;  //按钮接在2脚中断
int relayPin = 3;   //继电器接在3脚中断
int relayState = HIGH;  //继电器默认状态为HIGH
int buttonState;      //记录button的当前状态;
int lastButtonState = LOW;  //记录Button前一个状态值。
long lastDebounceTime = 0;
long debounceDelay = 50;    //去除抖动时间

void setup() {
  pinMode(buttonPin,INPUT);
  pinMode(relayPin,OUTPUT);

  digitalWrite(relayPin,relayState);  //设置继电器的初始状态
}

void loop() {
  int reading = digitalRead(buttonPin);

  // 一旦检测到数据发生变化,记录当前时间
  if(reading != lastButtonState){
    lastDebounceTime = millis();  
  }
  
  // 等待50ms,再进行一次判断,是否和当前button状态相同
  // 如果和当前状态不相同,改变button状态
  // 同时,如果button状态为高(也就是被按下),那么就改变继电器的状态
  if((millis() - lastDebounceTime) > debounceDelay){
    if(reading != buttonState){
      buttonState = reading;
      if(buttonState == HIGH){
        relayState = !relayState;
      }
    }
  }
  digitalWrite(relayPin,relayState);

  lastButtonState = reading;
}


3、核心回顾

按键去抖问题:

f(reading != lastButtonState){
    lastDebounceTime = millis();  
  }
  
  // 等待50ms,再进行一次判断,是否和当前button状态相同
  // 如果和当前状态不相同,改变button状态
  // 同时,如果button状态为高(也就是被按下),那么就改变继电器的状态
  if((millis() - lastDebounceTime) > debounceDelay){
    if(reading != buttonState){
      .......
      }
    }
  }


reading有变化之后,不是立马就采取相应的行动,而是先“按兵不动”,先看看这个信号是不是“错误信号”,所以再等待一阵,(也就是通过millis来实现这个等待过程的),发现确实是前方发过来的正确信号,然后执行相关动作。


之所以这么做的原因是,按键在被按下时,会有个抖动的过程,而不是立马由低变高,或者由高变低。所以这个过程中,可能会产生错误信号,我们通过程序中的这种方法,来解决硬件上的这个问题。

扫描二维码关注公众号,回复: 3276141 查看本文章

猜你喜欢

转载自blog.csdn.net/MadeInJack/article/details/51711789
今日推荐