// https://forum.arduino.cc/t/arduino-table-fan-with-different-speed-levels-make-your-own/1408082
const int fan(11);
const int button(10);
const int led1(9);
const int led2(8);
const int led3(7);
const int led4(6);
const int led5(5);
unsigned long prevPressTime;
bool prevButtonState(1);
int thresh1(50);
int thresh2(500);
int fanState(0);
void setup() {
// put your setup code here, to run once:
pinMode(fan, OUTPUT);
pinMode(button, INPUT_PULLUP);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
bool currentButtonState(digitalRead(button));
if ((currentButtonState == 0) && (prevButtonState == 1)) {
prevPressTime = millis();
} else if ((currentButtonState == 1) && (prevButtonState == 0)) {
unsigned long elapsedTime(millis() - prevPressTime);
if ((elapsedTime >= thresh1) && (elapsedTime < thresh2)) {
fanState += 1;
if (fanState > 5) {
fanState = 1;
}
} else if (elapsedTime >= thresh2) {
if (fanState > 0) {
fanState = 0;
} else {
fanState = 1;
}
}
}
prevButtonState = currentButtonState;
int fanVal(map(fanState, 0, 5, 0, 255));
analogWrite(fan, fanVal);
if (fanState == 0) {
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
} else if (fanState == 1) {
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
} else if (fanState == 2) {
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
} else if (fanState == 3) {
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
} else if (fanState == 4) {
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, LOW);
} else if (fanState == 5) {
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
}
}