【Arduino】Simple fan with speed control and oscillating function

【Arduino】Simple fan with speed control and oscillating function

Imagine that you’re enjoying the breeze made from yourself in the blistering Summer. Couldn’t be better! Just with three handy gadgets, you can make a simple fan with speed control and oscillating function.

Materials:

one DC motor

one servo

one rotary encoder module

circuit diagram:

Working principle:

when we rotate the rotary encoder, we get a digital quantity. By rotating left and right, this digital quantity can be increased or decreased. We read this digital quantity and convert it into three gears of the fan. The module also has a button, when it is pressed, the oscillating function will be turned on until the next time it is pressed.

Experimental code:

/***********************************************************

File name: _26_DCMotorModule.ino

Description: The state of DC motor includes its forward, reverse,

             acceleration, deceleration and stop. And you will

             see the data on the serial monitor

Website: www.adeept.com

E-mail: support@adeept.com

Author: Tom

Date: 2017/03/18

***********************************************************/

#include<Servo.h>



const int DC_APin = 10;                       //DC motor module A pin connected to digital 11 pin

const int DC_BPin = 11;                       //DC motor module B pin connected to digital 10 pin

int DCmotorspeed = 60;                      //motor speed  0~255



const int APin= 2; //Set the digital 2 to A pin

const int BPin= 3; //Set the digital 3 to B pin

const int SPin= 4 ;//Set the digital 4 to S pin

int i=1;

int encoderVal = 0;

int angle = 90;

Servo s1;

int flag = LOW;

int flag_1 = 0;

int getRotaryEncoder(void)

{

  static int oldA = HIGH; //set the oldA as HIGH

  static int oldB = HIGH; //set the oldB as HIGH

  int result = 0;

  int newA = digitalRead(APin); //read the value of APin to newA

  int newB = digitalRead(BPin); //read the value of BPin to newB

  if (newA != oldA || newB != oldB)//if the value of APin or the BPin has changed

  {

    if (oldA == HIGH && newA == LOW)// something has changed

    {

      result = (oldB * 2 - 1);

    }

  }

  oldA = newA;

  oldB = newB;

  return result;

}



void clockwise(int Speed)                   //the function to drive motor rotate clockwise

{

  analogWrite(DC_APin,Speed);                  //set the speed of motor

  analogWrite(DC_BPin,0);                      //stop the B pin of motor

}

void counterclockwise(int Speed)            //the function to drive motor rotate counterclockwise

{

  analogWrite(DC_APin,0);                      //stop the A pin of motor

  analogWrite(DC_BPin,Speed);                  //set the speed of motor

}



void setup()

{

  pinMode(DC_APin,OUTPUT);                    //initialize the A pin as output

  pinMode(DC_BPin,OUTPUT);                    //initialize the B pin as output

  pinMode(APin, INPUT);//initialize the A pin as input

  pinMode(BPin, INPUT);//initialize the B pin as input

  pinMode(SPin, INPUT);//initialize the S pin as input



 s1.attach(A4);

  s1.write(angle);



  analogWrite(DC_APin,0);

  analogWrite(DC_BPin,0);

  Serial.begin(115200);                      //opens serial port, sets data rate to 9600 bps

}

int j;

void loop()

{

  int change = getRotaryEncoder();



  encoderVal = encoderVal - change;



  if(encoderVal>=72){

    encoderVal = 72;

    }

  if(encoderVal<=0){

    encoderVal = 0;

    DCmotorspeed = 0;

    }



   if(encoderVal>0&&encoderVal<24)

   DCmotorspeed = 60;



  if(encoderVal>24&&encoderVal<48)

     DCmotorspeed = 80;



  if(encoderVal>48&&encoderVal<72)

     DCmotorspeed = 120;



  if(digitalRead(SPin) == LOW)

    flag = !flag;



  if(i!=encoderVal){

    Serial.write(encoderVal);

    i = encoderVal;

 }

   counterclockwise(DCmotorspeed);

   s1.write(angle);

   j++;

   if(flag &&j > 500)

   {

      j = 0;

      if(flag_1 == 0)

      {

        angle +=3;

      }

      else

      {

        angle -=3;

      }

      if(angle > 150)

      {

        flag_1 = 1;

      }

       if(angle < 30)

      {

        flag_1 = 0;

      }

      Serial.print(angle);

   }

}

One Reply to “【Arduino】Simple fan with speed control and oscillating function”

  1. Here at Leslie’s Pugsland Breeder, Our beautiful fawn pug has given birth to 4 healthy Pug puppies.
    She is our beloved family dog and this is her 1st litter.
    Both mum and dad are AKC registered with 5 gen pedigree certificate. Both from Top Champion bloodlines.Mum and Dad can be seen. Puppies have been wormed weeks 2,4,6,8 and will have had a flea preventative treatment before leaving us.
    They will have their vet check, 1st vaccinations and microchip.
    To view all available puppies and recent pictures, Search us in google as LESLIE’S PUGSLAND BREEDER or click on our website link bellow : https://pugslandbreeder.company.com/

    Pug Puppies for sale | pug for sale near me | pug puppy for sale | pug puppy | pug for sale | pug puppies for sale in va | black pug puppies for sale

Leave a Reply