Novak Conversions Jeep Wrangler TJ engine mounts

Cooling fan upgrade comparison: Explorer 11-blade fan and HD clutch versus SPAL 19" 850-watt electric brushless fan

The question that comes to mind for me is if 8 oz of duracool mixed with the atmosphere volume in a jeep would put it outside the upper/lower explosive limits for those gases in the event of an evaporator leak?

How about the same for the volume of air in the hvac case?

Or a leak spraying onto an ignition source in the engine bay?

Speaking of flammable refrigerants, @freedom_in_4low how is the transition to r32/1234 mixes going for you? What extra safeguards and costs are happening? I have till the end of this year to move 100% to the new refrigerant for new installs
 
The question that comes to mind for me is if 8 oz of duracool mixed with the atmosphere volume in a jeep would put it outside the upper/lower explosive limits for those gases in the event of an evaporator leak?

How about the same for the volume of air in the hvac case?

Or a leak spraying onto an ignition source in the engine bay?

Speaking of flammable refrigerants, @freedom_in_4low how is the transition to r32/1234 mixes going for you? What extra safeguards and costs are happening? I have till the end of this year to move 100% to the new refrigerant for new installs

If you had a 100% leak in the evaporator with no airflow, it would put the cabin well above the UEL.

However, it would have to occur with no airflow whatsoever. I did the math a while back and of you had the fan on medium speed, it would all have to enter the cabin in less than 8 minutes or less to reach LEL based on the dilution rate from the incoming air. Which is highly unlikely, as it would probably leak out before you ever turned it on, as the pressure gets lower in the evaporator once AC is engaged, not higher.

Even if you're in the habit of getting into road rage shootouts, odds are that leak/puncture will happen at the condenser and not the evaporator.

A single can of brake cleaner has more than double the flammable content than the charge of refrigerant here.

There is certainly a slight increase in risk, but I consider it minimal.
 
  • Like
Reactions: Rickyd
And that is risk acceptance. Accidents do happen. We also don't drive with a can of brake cleaner just inside the grill of our vehicle.

It is like choosing to install a disconnect switch in the cable that goes from your winch to your battery. The risk of a short happening during an accident is so low most people don't install a switch, but there are people who do install the switch, because what if.
 
The question that comes to mind for me is if 8 oz of duracool mixed with the atmosphere volume in a jeep would put it outside the upper/lower explosive limits for those gases in the event of an evaporator leak?

I think it would be within the flammability limit if you dispersed 8oz into the cabin ane gave it time to diffuse, so by doing this, a person is making a bet regarding the odds that an ignition source coincides with that condition.

How about the same for the volume of air in the hvac case?

The entire 8oz would be above the upper flammability limit in that volume, but there would be a given time period during the progress of the leak where it would be within the limits.

Or a leak spraying onto an ignition source in the engine bay?

Again, there could be an instant in time where the concentration meets the conditions for ignition simultaneously with the existence of an ignition source, but predicting the odds of that is difficult.

I don't know what the regulations are for automotive, but in commercial refrigeration, anything under 150g (a bit over 6oz) total charge is considered small enough to be free if any additional safeguards, and we'd be just over that. Above 150g it starts requiring things like minimum room size and maximum vibration amplitudes (to avoid causing leaks).

I would feel pretty safe with it in my particular Jeep but I might feel different if I had a hard top.

Speaking of flammable refrigerants, @freedom_in_4low how is the transition to r32/1234 mixes going for you? What extra safeguards and costs are happening? I have till the end of this year to move 100% to the new refrigerant for new installs

It's definitely more complicated but we're getting by. The guy that handles regulatory compliance (not me) just spends more time on it than he used to. UL and ASHRAE both have their respective rule sets that have to be followed and since room space comes into play, it gets messier for us because we don't necessarily know what the equipment is going into if it's something that goes indoors so whether it falls under the charge limit or requires a leak sensor and extra controls to force ventilation can vary between otherwise identical pieces of equipment. It's easier when it's a packaged air cooler chiller that is always going to be outdoors.
 
  • Like
Reactions: Rickyd and Wildman
I think it would be within the flammability limit if you dispersed 8oz into the cabin ane gave it time to diffuse, so by doing this, a person is making a bet regarding the odds that an ignition source coincides with that condition.



The entire 8oz would be above the upper flammability limit in that volume, but there would be a given time period during the progress of the leak where it would be within the limits.



Again, there could be an instant in time where the concentration meets the conditions for ignition simultaneously with the existence of an ignition source, but predicting the odds of that is difficult.

I don't know what the regulations are for automotive, but in commercial refrigeration, anything under 150g (a bit over 6oz) total charge is considered small enough to be free if any additional safeguards, and we'd be just over that. Above 150g it starts requiring things like minimum room size and maximum vibration amplitudes (to avoid causing leaks).

I would feel pretty safe with it in my particular Jeep but I might feel different if I had a hard top.



It's definitely more complicated but we're getting by. The guy that handles regulatory compliance (not me) just spends more time on it than he used to. UL and ASHRAE both have their respective rule sets that have to be followed and since room space comes into play, it gets messier for us because we don't necessarily know what the equipment is going into if it's something that goes indoors so whether it falls under the charge limit or requires a leak sensor and extra controls to force ventilation can vary between otherwise identical pieces of equipment. It's easier when it's a packaged air cooler chiller that is always going to be outdoors.

Yep,system size and space make for different regulations. If I remember right from the last class I took space is only calculated up to a certain height regardless of the actual ceiling height past that. At least for some of the commercial refrigeration I do.
 
  • Like
Reactions: freedom_in_4low
What problem that I don't have will this fix? :unsure:
These are reasons I would consider OP's work. (FYI I'm not joking I just have peculiar values sometimes)
  • Mech fans are loud
  • Don't want to drill holes in stock shroud to raise up for clearance after MML
  • Don't want to buy spare radiator shroud just to drill holes in for clearance after MML (to keep stock shroud on the wall as OEM factory original show part, of course) - it's like $80 for a plastic circle seriously
  • Making custom shroud would require TIG which I'd need to learn and by the time I'm done I'll have a nice radiator shroud but still hear the mech fan and my wife will be upset I spent all that time in the garage to preserve a plastic fan shroud
 
  • Haha
Reactions: JMT
Don't want to drill holes in stock shroud to raise up for clearance after MML

The MML is meant to match the BL height enough so you don’t have to relocate the shroud. And you won’t have to worry about a mechanical fan aligning from the engine to the shroud since there won’t be a mechanical fan.

The Camaro fan is cut from the Camaro shroud, and then sits inside the opening of the TJ shroud…you attach the fan to the TJ shroud with fasteners after drilling holes into the stock shroud.
 
The MML is meant to match the BL height enough so you don’t have to relocate the shroud. And you won’t have to worry about a mechanical fan aligning from the engine to the shroud since there won’t be a mechanical fan.

The Camaro fan is cut from the Camaro shroud, and then sits inside the opening of the TJ shroud…you attach the fan to the TJ shroud with fasteners after drilling holes into the stock shroud.

Maybe I missed something in this thread. In my case I have a MML but no BL. No desire or need for it either. Except now I have a problem - mech fan hits the shroud. So I thought why not just go electric fan. Personally not sure I'd bother with the shroud unless you put the fan in the opening of the stock TJ shroud, which is a novel concept - most I've seen involve fabricating a custom shroud or drilling holes in the stock one... and actually I don't see how that would even work either unless you cut out a section to clearance for the upper rad hose.

This thread is possibly the most useful and informative discussion on the topic, by the way, so thank you all for a lot of concrete information. Of course, it was easier to make a decision when it seemed almost everyone is firmly anti-electric fan :)
 
The MML is meant to match the BL height enough so you don’t have to relocate the shroud. And you won’t have to worry about a mechanical fan aligning from the engine to the shroud since there won’t be a mechanical fan.

That was true with just a BL and MML, but once I added a mild tuck the fan got lower and started hitting the shroud, so I ended up having to relocate it.
 
That was true with just a BL and MML, but once I added a mild tuck the fan got lower and started hitting the shroud, so I ended up having to relocate it.

I didn't have to do that with the Savvy TT, but it doesn't surprise me one bit.

My statement was focused more on him having a MML. If he doesn’t need the MML, I’d pull it or adjust the shroud and move on.

That is, unless he needs better fan performance with the AC on at lower speeds or idle.
 
Last edited:
Maybe I missed something in this thread. In my case I have a MML but no BL. No desire or need for it either. Except now I have a problem - mech fan hits the shroud. So I thought why not just go electric fan. Personally not sure I'd bother with the shroud unless you put the fan in the opening of the stock TJ shroud, which is a novel concept - most I've seen involve fabricating a custom shroud or drilling holes in the stock one... and actually I don't see how that would even work either unless you cut out a section to clearance for the upper rad hose.

This thread is possibly the most useful and informative discussion on the topic, by the way, so thank you all for a lot of concrete information. Of course, it was easier to make a decision when it seemed almost everyone is firmly anti-electric fan :)

Man, I had just a MML once. So easy to notch the top for the radiator hose and drill a few holes in the shroud. Cost zero dollars and 1 hour.
 
That was true with just a BL and MML, but once I added a mild tuck the fan got lower and started hitting the shroud, so I ended up having to relocate it.

A 1.5" MML perfectly centered the fan in the shroud following a tuck install in my case. (Literally just a 1" MML with some 1/2" aluminum spacers underneath)
 
Why did you do the MML?

Same question for @JMT

That was 2017. It was part of my early incrementalism to resolve vibes at 2.5” lift so I didn’t have to get an SYE, rear arms, and a DC.
 
Man, I had just a MML once. So easy to notch the top for the radiator hose and drill a few holes in the shroud. Cost zero dollars and 1 hour.

What year model did you have that on? I did the same on my 99 but on my 06 I swear the bell housing was so close to the bottom of the firewall that it wouldn't have worked.
Why did you do the MML?

Same question for @JMT

You didn't ask me but on my 06 I only did it to avoid chopping up the shroud when I did my BL. On my 99 it was to reduce the amount of tc drop I needed to avoid the rear shaft vibrating.
 
What year model did you have that on? I did the same on my 99 but on my 06 I swear the bell housing was so close to the bottom of the firewall that it wouldn't have worked.

That was an ‘05. I never even looked to see if it was touching. I was a noob of noobs. Eventually I did get a BL.
 
Swap the controller out for an Arduino. This is probably the best option in terms of getting things to work as intended, but my C++ and Arduino skills are currently just enough to make me dangerous with a 3D printer, and building a program from scratch would be quite the undertaking for me.

Hello, everyone. I manage to swap the controller with an arduino. I will post some information but it’s working great. The most important is having fully control on fan speeds.
 
Hello, everyone. I manage to swap the controller with an arduino. I will post some information but it’s working great. The most important is having fully control on fan speeds.
I did a recap using Google AI. This is the tool I used for coding and do research since I am not an expert at coding.I used an Arduino R4 wifi, same NTC controller, a fixed resistor for voltage divider (440 ohms) and this MOSFET https://www.amazon.com/Anmbest-High...-Brightness/dp/B07NWD8W26/?tag=wranglerorg-20



1. The Hardware Setup:

Here's a quick rundown of the components I used:

  • Microcontroller: Arduino UNO R4 WiFi (the brains of the operation!)
  • Temperature Sensor: An NTC Thermistor (standard engine temperature sensor for cars).
  • Voltage Divider: A simple resistor (R1) in series with the thermistor to convert resistance changes into voltage changes, readable by the Arduino's Analog-to-Digital Converter (ADC).
  • PWM Fan Control Module: A robust module capable of handling the radiator fan's high current draw, controlled by a PWM signal from the Arduino.
  • Radiator Fan: A 12V high-capacity electric fan (the one I'm controlling).
  • Power Supply: A dedicated 12V power source for the fan (ensuring it gets enough juice).
  • Measurement Tools: A digital multimeter (for initial calibration checks) and a clamp meter (essential for real-world current draw validation).
The wiring is straightforward: the thermistor voltage divider goes to an analog input pin on the Arduino, and a PWM output pin from the Arduino connects to the fan control module's input. The fan module then connects directly to the 12V fan and its dedicated power supply.


2. The Brains: Arduino Code Logic (Simplified)

The core of the system lies in the Arduino code. It continuously monitors the engine temperature and adjusts the fan speed using a Pulse Width Modulation (PWM) signal.

Here's a simplified explanation of the key logic in my loop():

  1. Read Sensor: The Arduino reads the analog voltage from the thermistor's voltage divider.
  2. Calculate Resistance: This voltage is converted back into the thermistor's resistance (R_thermistor).
  3. Calculate Temperature: The R_thermistor value is then converted into a temperature reading (in Fahrenheit or Celsius) using the Steinhart-Hart equation or a lookup table.
  4. Map Temperature to Fan Speed (PWM):This is the crucial part. I've defined specific temperature (resistance) thresholds and corresponding fan speeds (PWM duty cycles):
    • Below 660 Ohms (~139°F): Fan runs at a low 38 PWM (15% duty cycle). This is a baseline "always-on" for airflow.
    • Between 660 Ohms and 270 Ohms (~139°F to ~188°F): The fan linearly ramps up its speed from 38 PWM to 166 PWM (65% duty cycle). This is handled by a map() function: fanPWM = map(R_thermistor, 660, 270, 38, 166);
    • (Optional/Future): Beyond 270 Ohms (e.g., if engine gets even hotter down to 220 Ohms / ~199°F), the fan can ramp further up to 191 PWM (75% duty cycle).
  5. Control Fan: The calculated fanPWM value is then sent to the fan control module using analogWrite().
This piecewise linear approach allows for fine-tuned control across different temperature ranges.


3. The Real-World Behavior: Test Results!

I conducted tests under two very different ambient temperature conditions:

Scenario 1: Controlled Test (Ambient Temp: 75°F)

  • Engine Temperature: During this test, the engine never got hot enough to drop below the 660 Ohm (~139°F)threshold.
  • Fan Behavior: As expected, the fan correctly remained at its 38 PWM (15% duty cycle) baseline. According to my reference table (similar to the one in the attached image), this corresponds to approximately 851 RPM.
  • Finding: This validates the system's idle state and confirms it doesn't over-cool when not needed.
Scenario 2: Hot Climate Test (Ambient Temp: 101°F

This is where the system really shined!

  • Engine Temperature Rise: Due to the extremely hot ambient conditions, the engine temperature steadily climbed. My Calculated Ohms readings consistently dropped, moving from the 500s all the way down into the low 300s (e.g., 290-320 Ohms), just above my 270 Ohm target.
  • Fan Responsiveness: The fan system detected this rising engine temperature perfectly! As soon as the Calculated Ohms dropped below 660, the fan's PWM signal smoothly and continuously ramped up.
  • Observed Fan Speed (PWM): We saw the PWM values climb progressively, reaching into the 150s (up to 160 PWM!). This clearly shows the map() function actively working as designed.
  • Estimated Fan RPMs: Based on my reference table (which maps Ohms to Fan RPM), this translates to the fan operating from its baseline of ~851 RPM and reaching as high as approximately 1500 to 1850 RPM at the hottest temperatures observed (as the Ohms approached 290).
  • Validation: This test unequivocally validates the functionality of the first linear fan ramp segment in a real-world, high-stress scenario. The fan correctly and dynamically increased its cooling capacity to manage the engine's rising temperature, even under challenging ambient conditions.

Final Thoughts & Next Steps:

I'm incredibly pleased with the behavior of this system. It consistently responded to engine temperature changes, ramping up the fan speed exactly as programmed. It proves that the hardware setup and the Arduino code logic are working beautifully together.

My next step is to push the engine temperature further (perhaps with a longer drive or more load) to ensure it reaches the 270 Ohms (~188°F) threshold. At that exact point, I expect the PWM to hit 166 (65% duty cycle), and I will be taking a clamp meter amperage reading to validate the fan's current draw against my target of ~27 Amps.

Has anyone else built similar systems? Any insights or suggestions for further testing or improvements would be greatly appreciated!
 
  • Like
Reactions: macleanflood
I did a recap using Google AI. This is the tool I used for coding and do research since I am not an expert at coding.I used an Arduino R4 wifi, same NTC controller, a fixed resistor for voltage divider (440 ohms) and this MOSFET https://www.amazon.com/Anmbest-High...-Brightness/dp/B07NWD8W26/?tag=wranglerorg-20



1. The Hardware Setup:

Here's a quick rundown of the components I used:

  • Microcontroller: Arduino UNO R4 WiFi (the brains of the operation!)
  • Temperature Sensor: An NTC Thermistor (standard engine temperature sensor for cars).
  • Voltage Divider: A simple resistor (R1) in series with the thermistor to convert resistance changes into voltage changes, readable by the Arduino's Analog-to-Digital Converter (ADC).
  • PWM Fan Control Module: A robust module capable of handling the radiator fan's high current draw, controlled by a PWM signal from the Arduino.
  • Radiator Fan: A 12V high-capacity electric fan (the one I'm controlling).
  • Power Supply: A dedicated 12V power source for the fan (ensuring it gets enough juice).
  • Measurement Tools: A digital multimeter (for initial calibration checks) and a clamp meter (essential for real-world current draw validation).
The wiring is straightforward: the thermistor voltage divider goes to an analog input pin on the Arduino, and a PWM output pin from the Arduino connects to the fan control module's input. The fan module then connects directly to the 12V fan and its dedicated power supply.


2. The Brains: Arduino Code Logic (Simplified)

The core of the system lies in the Arduino code. It continuously monitors the engine temperature and adjusts the fan speed using a Pulse Width Modulation (PWM) signal.

Here's a simplified explanation of the key logic in my loop():

  1. Read Sensor: The Arduino reads the analog voltage from the thermistor's voltage divider.
  2. Calculate Resistance: This voltage is converted back into the thermistor's resistance (R_thermistor).
  3. Calculate Temperature: The R_thermistor value is then converted into a temperature reading (in Fahrenheit or Celsius) using the Steinhart-Hart equation or a lookup table.
  4. Map Temperature to Fan Speed (PWM):This is the crucial part. I've defined specific temperature (resistance) thresholds and corresponding fan speeds (PWM duty cycles):
    • Below 660 Ohms (~139°F): Fan runs at a low 38 PWM (15% duty cycle). This is a baseline "always-on" for airflow.
    • Between 660 Ohms and 270 Ohms (~139°F to ~188°F): The fan linearly ramps up its speed from 38 PWM to 166 PWM (65% duty cycle). This is handled by a map() function: fanPWM = map(R_thermistor, 660, 270, 38, 166);
    • (Optional/Future): Beyond 270 Ohms (e.g., if engine gets even hotter down to 220 Ohms / ~199°F), the fan can ramp further up to 191 PWM (75% duty cycle).
  5. Control Fan: The calculated fanPWM value is then sent to the fan control module using analogWrite().
This piecewise linear approach allows for fine-tuned control across different temperature ranges.


3. The Real-World Behavior: Test Results!

I conducted tests under two very different ambient temperature conditions:

Scenario 1: Controlled Test (Ambient Temp: 75°F)

  • Engine Temperature: During this test, the engine never got hot enough to drop below the 660 Ohm (~139°F)threshold.
  • Fan Behavior: As expected, the fan correctly remained at its 38 PWM (15% duty cycle) baseline. According to my reference table (similar to the one in the attached image), this corresponds to approximately 851 RPM.
  • Finding: This validates the system's idle state and confirms it doesn't over-cool when not needed.
Scenario 2: Hot Climate Test (Ambient Temp: 101°F

This is where the system really shined!

  • Engine Temperature Rise: Due to the extremely hot ambient conditions, the engine temperature steadily climbed. My Calculated Ohms readings consistently dropped, moving from the 500s all the way down into the low 300s (e.g., 290-320 Ohms), just above my 270 Ohm target.
  • Fan Responsiveness: The fan system detected this rising engine temperature perfectly! As soon as the Calculated Ohms dropped below 660, the fan's PWM signal smoothly and continuously ramped up.
  • Observed Fan Speed (PWM): We saw the PWM values climb progressively, reaching into the 150s (up to 160 PWM!). This clearly shows the map() function actively working as designed.
  • Estimated Fan RPMs: Based on my reference table (which maps Ohms to Fan RPM), this translates to the fan operating from its baseline of ~851 RPM and reaching as high as approximately 1500 to 1850 RPM at the hottest temperatures observed (as the Ohms approached 290).
  • Validation: This test unequivocally validates the functionality of the first linear fan ramp segment in a real-world, high-stress scenario. The fan correctly and dynamically increased its cooling capacity to manage the engine's rising temperature, even under challenging ambient conditions.

Final Thoughts & Next Steps:

I'm incredibly pleased with the behavior of this system. It consistently responded to engine temperature changes, ramping up the fan speed exactly as programmed. It proves that the hardware setup and the Arduino code logic are working beautifully together.

My next step is to push the engine temperature further (perhaps with a longer drive or more load) to ensure it reaches the 270 Ohms (~188°F) threshold. At that exact point, I expect the PWM to hit 166 (65% duty cycle), and I will be taking a clamp meter amperage reading to validate the fan's current draw against my target of ~27 Amps.

Has anyone else built similar systems? Any insights or suggestions for further testing or improvements would be greatly appreciated!

All this was accomplished with the information already provided on this post of course.
 
here is the code for reference

// —- Pin Definitions —-
const int FAN_PWM_PIN = 9; // Digital pin for fan PWM control
const int NTC_ANALOG_PIN = A1; // Analog pin for NTC thermistor input
// —- Fan Speed Parameters —-
const int PWM_MIN_SPEED = 38; // 15% duty cycle (base speed)
const int PWM_MAX_OPERATIONAL_SPEED = 166; // 65% duty cycle (targets ~27 Amps at ~187.6F)
const int PWM_EMERGENCY_MAX_SPEED = 191; // 75% duty cycle (new absolute max speed)
// —- NTC Resistance Thresholds for Fan Control (Derived from YOUR PROVIDED PICTURE TABLE) —-
// Fan will be at min speed (15%) when resistance is at or above this value (~138.9F)
const float R_FAN_START_RAMP_THRESHOLD = 660.0; // Ohms (corresponds to approx 138.9F)
// Fan will reach PWM_MAX_OPERATIONAL_SPEED (65%) when resistance is at or below this value (~187.6F)
const float R_FAN_MAX_CAPACITY_THRESHOLD = 270.0; // Ohms (corresponds to approx 187.6F)
// Fan will reach PWM_EMERGENCY_MAX_SPEED (75%) when resistance is at or below this value (~199.4F)
const float R_FAN_EMERGENCY_MAX_THRESHOLD = 220.0; // Ohms (corresponds to approx 199.4F)
// —- NTC Thermistor Voltage Divider Parameters —-
// IMPORTANT: This value MUST match the actual total resistance of the fixed resistor(s) you use.
const float R_FIXED = 435.0; // Resistance of the fixed resistor in Ohms
// —- Setup Function —-
void setup() {
Serial.begin(9600); // Initialize serial communication for debugging
pinMode(FAN_PWM_PIN, OUTPUT); // Set the fan control pin as an output
// Set the fan to its initial lowest speed (15% duty cycle) on startup
analogWrite(FAN_PWM_PIN, PWM_MIN_SPEED);
Serial.println("—————————————————————————");
Serial.println("Fan Control: Radiator Outlet Optimized (Multi-Segment)");
Serial.println(" - NTC Analog Pin: A1");
Serial.println(" - R_FIXED: 435 Ohms");
Serial.println("—————————————————————————");
Serial.println("Fan Logic:");
Serial.println(" - 15% speed below ~138.9F (Ohms >= 660)");
Serial.println(" - Ramps 15% to 65% from ~138.9F to ~187.6F (660 Ohms down to 270 Ohms) to target ~27 Amps.");
Serial.println(" - Ramps 65% to 75% from ~187.6F to ~199.4F (270 Ohms down to 220 Ohms) for hotter temps.");
Serial.println(" - 75% speed at or above ~199.4F (Ohms <= 220) as absolute max.");
Serial.println("—————————————————————————");
Serial.println("Raw ADC | Calculated Ohms | Current Fan Speed (PWM Value)");
Serial.println("—————————————————————————");
}
// —- Main Loop Function —-
void loop() {
// Read the raw analog value from the NTC thermistor
int ntcRawADC = analogRead(NTC_ANALOG_PIN);
// Calculate NTC thermistor resistance using the corrected voltage divider formula
float rThermistor;
if (ntcRawADC == 0) { // Avoid division by zero if ADC reads 0
rThermistor = 1000000.0; // Very large value for open circuit / extremely high resistance
} else if (ntcRawADC == 1023) { // If ADC reads max (implies NTC is shorted / extremely low resistance)
rThermistor = 0.0; // Very small value
} else {
rThermistor = R_FIXED / ((1023.0 / ntcRawADC) - 1.0); // Corrected formula
}
int currentFanPWM = PWM_MIN_SPEED; // Default to lowest speed (fan always on)
// Implement the new fan control logic based on NTC resistance and temperature zones
if (rThermistor >= R_FAN_START_RAMP_THRESHOLD) {
// ZONE 1: Temperature below ~138.9F (Ohms >= 660). Fan runs at base speed (15%).
currentFanPWM = PWM_MIN_SPEED;
} else if (rThermistor > R_FAN_MAX_CAPACITY_THRESHOLD) {
// ZONE 2: Temperature between ~138.9F (660 Ohms) and ~187.6F (270 Ohms).
// Linear ramp from 15% to 65% capacity.
currentFanPWM = map(rThermistor, R_FAN_MAX_CAPACITY_THRESHOLD, R_FAN_START_RAMP_THRESHOLD, PWM_MAX_OPERATIONAL_SPEED, PWM_MIN_SPEED);
} else if (rThermistor > R_FAN_EMERGENCY_MAX_THRESHOLD) {
// ZONE 3: Emergency Ramp. Temperature between ~187.6F (270 Ohms) and ~199.4F (220 Ohms).
// Linear ramp from 65% to 75% capacity.
currentFanPWM = map(rThermistor, R_FAN_EMERGENCY_MAX_THRESHOLD, R_FAN_MAX_CAPACITY_THRESHOLD, PWM_EMERGENCY_MAX_SPEED, PWM_MAX_OPERATIONAL_SPEED);
} else {
// ZONE 4: Emergency Max Speed. Temperature at or above ~199.4F (Ohms <= 220).
// Fan runs at 75% capacity.
currentFanPWM = PWM_EMERGENCY_MAX_SPEED;
}
// Ensure the calculated PWM value stays within valid limits (0-255)
currentFanPWM = constrain(currentFanPWM, 0, 255);
// Apply the calculated PWM to the fan
analogWrite(FAN_PWM_PIN, currentFanPWM);
// Print values to Serial Monitor for debugging
Serial.print(ntcRawADC);
Serial.print(" | ");
Serial.print(rThermistor, 1); // Print resistance with 1 decimal place
Serial.print(" Ohms | ");
Serial.println(currentFanPWM);
delay(1000); // Read and print every 1 second
}
 
  • USA Proud
Reactions: D's Jeep Wrld
Novak Conversions Jeep Wrangler TJ engine mounts