Files
arduino/ANano_ls1tech_raw/ANano_ls1tech_raw.ino
2025-10-12 09:13:56 +02:00

96 lines
4.1 KiB
C++

// This a test program, no warranties are implied or given. fanControllerR2V3base
// Use, copy any modify this test program any way you want, at your own risk.
// Test, test, test and then test some more..
// It reads a temperature sensor and controls a Mazda PWM fan power module.
// ...Carl...
/*----------------------- User adjustable variables and preferences section ---------------------------------*/
float tempForFanStartup = 175.0; // target low temp. below this temperature, the fan will be off
float tempForFanOnFull = 210.0; // target High temp. above this temperature, the fan will be on at full power
// adjust these two to get the desired range. for example for a transmission, maybe 140 to 160
float R0 = 10000; // The base resistance of the NTC sensor used. 10K with a 3435 Beta.
float Beta = 3435; // The Beta of the sensor used. Very commonly available
float voltsForFanStartup = 1.2; // Roughly the signal voltage that triggers the mazda module's slowest speed.
// A higher voltage here will effectively increase the fans lowest speed target.
/*----------------------- end of User adjustable variables and preferences -----------------------------------*/
const int fanPwmOutPin = 12; // Arduino forces this pin to 0 or 5 volts.
const int tempSensorPin = 5; // Pin to read analog voltage from the temp sensor.
int pwmDuty; // The calculated PWM duty is stored here
float pwmMinStartupDuty; // the starting duty is stored here (mazda module starts fans at about 24 % duty)
float currTemperature; // the temperature in F is stored here
void setup() { /* ++++++++++++++++++ Setup is run once when the arduino boots ++++++++++++++++++++++++++*/
Serial.begin(115200); // set up serial port for 115200 baud (optional)
//analogReference (EXTERNAL) ; // note, this is using the 3.3 volt supply as the analog reference.
analogRead (tempSensorPin) ; // a couple of reads to give the A/D time to adjust
analogRead (tempSensorPin) ; // a couple of reads to give the A/D time to adjust
analogWrite(fanPwmOutPin, 0); // turn the fan off at start
pwmMinStartupDuty = (voltsForFanStartup / 5.0) * 255.0; // convert the Mazda starting voltage to a PWM duty
} // end setup
void loop() { /* ++++++++++++++++++ Main Loop, continuously loops forever ++++++++++++++++++++++++++++*/
readAndTranslateTempSensor();
calculate_and_send_PWM();
print_to_serial_port(); // un-comment this line for testing and calibration to the laptop.
} // end main loop
void calculate_and_send_PWM() { /* ++++++++ subroutine to calculate and set PWM duty cycle ++++++++++++++*/
if (currTemperature < tempForFanStartup) { // If the temperature is below the lowest setpoint, turn fan off
analogWrite(fanPwmOutPin, 0); // PWM duty = 0 percent
pwmDuty = 0;
return;
}
if (currTemperature > tempForFanOnFull) { // If the temperature is above the highest setpoint, turn fan on full
analogWrite(fanPwmOutPin, 255); // PWM duty = 100 percent
pwmDuty = 255;
return;
}
float tempRange = tempForFanOnFull - tempForFanStartup ; // start calculating duty cycle
float pwmRange = 255.0 - pwmMinStartupDuty ;
float pwmDutyPct = (currTemperature - tempForFanStartup) / tempRange ;
pwmDuty = (int) (pwmMinStartupDuty + (pwmDutyPct * pwmRange) +.5); // actual PWM duty is calculated here
if (pwmDuty > 255) { // make sure duty ended up between 255 and 0
pwmDuty = 255;
}
if (pwmDuty < 0) {
pwmDuty = 0;
}
analogWrite(fanPwmOutPin, pwmDuty); // write PWM duty to PWM output pin
} // end calculate_and_send_PWM
void readAndTranslateTempSensor() { /* ++++++ subroutine to read and translate temp sensor to temp F +++++++++++++*/
int tmp = analogRead(tempSensorPin);
int currTemperature1 = map(tmp, 0, 1023, 150, 158);
currTemperature = currTemperature1;
//float r = ((1023.0*R0)/(float)tmp)-R0;
//currTemperature = Beta/log(r/0.09919) - 273.15; // for a 10K thermister with a beta of 3435
//currTemperature = (9.0/5.0) * currTemperature +32; // convert to Fahrenheit
} // end readAndTranslateTempSensor
void print_to_serial_port() { /* ++++++++++ optional prints values to laptop usb port for debugging and calibration ++*/
Serial.print(F("currTemperature F: ")); Serial.print(currTemperature);
Serial.print(F(" pwmDuty: ")); Serial.println(pwmDuty);
}