Hey yall, I am running a fan using an esp32 chip. I am properly able to get the fan speed by using an interrupt to count the number of ticks on the falling edge, and from that, I use a calculation to determine the speed of the fan at a given moment. It works well, however, I get random spontaneous noise after it runs and stops because the fan will send false falling edges pulses when voltage isn't sent to the fan. The calculations are done every 0.1 seconds and printed out to Serial.
I can give code, however, I don't think it is necessary. I basically grabbed the algorithm from this website if you're curious about the algorithm: Arduino Projects
This is the task that does the calculating:
// interrupt that counts the number of pulses from fan
void IRAM_ATTR fanPulseIn() {
NumberOfPulses++;
}
void calcFanSpeed(void * parameter) {
while(1) {
noInterrupts();
if(NumberOfPulses < 3) NumberOfPulses=0; // Fan still outputs 1 or 2 pulses each second even when stopped
fanRPM = (NumberOfPulses + LastReading) / 2*30000 / (millis() - TimeStamp);
LastReading=NumberOfPulses;
NumberOfPulses=0;
TimeStamp=millis();
interrupts();
if(fanRPM > 4600) fanRPM = 0; // fan should never go above ~4300
delay(100); // task should run every 0.1 seconds
}
}
Below is an example serial output of the fan speed, printed every 0.1 seconds. The ones in bold are the ones that is random noise.
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 300
Fan Speed: 900
Fan Speed: 1200
Fan Speed: 1200
Fan Speed: 1500
Fan Speed: 1800
Fan Speed: 1800
Fan Speed: 2100
Fan Speed: 2100
Fan Speed: 2400
Fan Speed: 2400
Fan Speed: 3000
Fan Speed: 4200
Fan Speed: 4200
Fan Speed: 3000
Fan Speed: 1800
Fan Speed: 900
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
**Fan Speed: 1500**
**Fan Speed: 2100**
**Fan Speed: 300**
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 600
Fan Speed: 600
Fan Speed: 300
Fan Speed: 900
Fan Speed: 900
Fan Speed: 1200
Fan Speed: 1200
Fan Speed: 1500
Fan Speed: 1500
Fan Speed: 1500
Fan Speed: 1800
Fan Speed: 1800
Fan Speed: 2100
Fan Speed: 2100
Fan Speed: 2400
Fan Speed: 2400
Fan Speed: 2700
Fan Speed: 2700
Fan Speed: 3000
Fan Speed: 2700
Fan Speed: 2400
Fan Speed: 2400
Fan Speed: 3300
Fan Speed: 4200
Fan Speed: 4200
Fan Speed: 3000
Fan Speed: 1800
Fan Speed: 600
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
**Fan Speed: 1500**
**Fan Speed: 1500**
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
Fan Speed: 0
The bolded section is what needs to be zeroed out. My idea was to grab the 3 latest values of fan speed and average them out, where if there is a zero, it will ignore the values. This will ignore real values though.
Another idea was to compare the fan speed values and zero out the ones with higher values.
But these all seem to give me some undesireable side-effects. Does anyone have any recommendation on how I should tackle this?