5.4.14 Project 7.2 Switch On or Off the Fan

One button switches the fan on and the other button controls the speed of the fan.

1. Test Code

#define fanPin1 19    // Fan control pin 1
#define fanPin2 18    // Fan control pin 2
#define btn1 16       // Button 1 pin
#define btn2 27       // Button 2 pin

int btn_count = 0;    // Counter for button 1 presses
int btn_count2 = 0;   // Counter for button 2 presses
int speed_val = 130;  // Initial fan speed (PWM value)

void setup() {
  Serial.begin(9600);
  pinMode(btn1, INPUT);
  pinMode(btn2, INPUT);
  pinMode(fanPin1, OUTPUT);
  pinMode(fanPin2, OUTPUT);
}

void loop() {
  boolean btn1_val = digitalRead(btn1);

  // Button 1 (Power/Speed Control) handling
  if(btn1_val == 0) // If button is pressed
  {
    delay(10);  // Debounce delay
    if(btn1_val == 0) // Confirm button press
    {
      boolean btn_state = 1;
      while(btn_state == 1) // Wait for button release
      {
        boolean btn_val = digitalRead(btn1);
        if(btn_val == 1)  // If button released
        {
          btn_count++;    // Increment press counter
          Serial.println(btn_count);
          btn_state = 0;  // Exit loop
        }
      }
    }

    boolean power_state = btn_count % 2; // Toggle power state (0 or 1)

    while(power_state == 1) // While fan is on
    {
      digitalWrite(fanPin1, LOW);  // Set direction
      analogWrite(fanPin2, speed_val); // Set speed

      // Button 2 (Speed Adjustment) handling
      boolean btn2_val = digitalRead(btn2);
      if(btn2_val == 0) // If speed button pressed
      {
        delay(10); // Debounce delay
        if(btn2_val == 0) // Confirm press
        {
          boolean btn_state2 = 1;
          while(btn_state2 == 1) // Wait for release
          {
            boolean btn2_val = digitalRead(btn2);
            if(btn2_val == 1) // If released
            {
              btn_count2++; // Increment speed level
              if(btn_count2 > 3) // Cycle through 1-3
              {
                btn_count2 = 1;
              }

              // Set speed based on count
              switch(btn_count2)
              {
                case 1:
                  speed_val = 130; // Low speed
                  Serial.println(speed_val);
                  break;
                case 2:
                  speed_val = 180; // Medium speed
                  Serial.println(speed_val);
                  break;
                case 3:
                  speed_val = 230; // High speed
                  Serial.println(speed_val);
                  break;
              }
              btn_state2 = 0;
            }
          }
        }
      }

      // Check for power off
      btn1_val = digitalRead(btn1);
      if(btn1_val == 0) // If power button pressed
      {
        delay(10); // Debounce delay
        if(btn1_val == 0) // Confirm press
        {
          digitalWrite(fanPin1, LOW); // Stop fan
          analogWrite(fanPin2, 0);
          power_state = 0;  // Exit fan control loop
        }
      }
    }
  }
}

2. Test Result

Click button 1, the fan starts to rotate, click button 2, the speed can be adjusted(there are three different speeds), press the button 1 again, the fan stops.