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

114 lines
3.1 KiB
C++

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS_CLT1 2
#define ONE_WIRE_BUS_CLT2 3
#define OVERRIDE_SWITCH_PIN 4
#define FAN1_PWM_PIN 8
#define FAN2_PWM_PIN 9
#define POTENTIOMETER_PIN 16
// Define temperature thresholds
#define FAN_ON_TEMP 95
#define FAN_OFF_TEMP (FAN_ON_TEMP - 10)
#define FAN_HIGH_TEMP (FAN_ON_TEMP + 10)
#define FAN_HIGH_DUTY_CYCLE 95
#define FAN_LOW_DUTY_CYCLE 40
#define OVERRIDE_DUTY_CYCLE 60
// Define variables
float temperature1 = 0;
float temperature2 = 0;
float averageTemp = 0;
bool fanOverride = false;
int fan1DutyCycle = 0;
int fan2DutyCycle = 0;
int overrideDutyCycle = 0;
OneWire oneWire_CLT1(ONE_WIRE_BUS_CLT1);
DallasTemperature sensor_CLT1(&oneWire_CLT1);
OneWire oneWire_CLT2(ONE_WIRE_BUS_CLT2);
DallasTemperature sensor_CLT2(&oneWire_CLT2);
void setup() {
pinMode(OVERRIDE_SWITCH_PIN, INPUT_PULLUP);
pinMode(FAN1_PWM_PIN, OUTPUT);
pinMode(FAN2_PWM_PIN, OUTPUT);
// Initialize Serial for debugging
Serial.begin(9600);
// Initialize temperature sensors
sensor_CLT1.begin();
sensor_CLT2.begin();
}
void loop() {
// Read temperatures
temperature1 = readTemperature(sensor_CLT1);
temperature2 = readTemperature(sensor_CLT2);
// Calculate average temperature
averageTemp = calculateAverageTemperature();
// Check if temperatures are valid
if (isValidTemperature(temperature1) && isValidTemperature(temperature2)) {
// Determine fan duty cycle based on temperature
calculateFanDutyCycle(averageTemp);
// Check for override switch
if (digitalRead(OVERRIDE_SWITCH_PIN) == LOW) {
// Override mode
fanOverride = true;
overrideDutyCycle = map(analogRead(POTENTIOMETER_PIN), 0, 1023, 0, 100);
analogWrite(FAN1_PWM_PIN, overrideDutyCycle);
analogWrite(FAN2_PWM_PIN, overrideDutyCycle);
} else {
// Normal operation
fanOverride = false;
analogWrite(FAN1_PWM_PIN, fan1DutyCycle);
analogWrite(FAN2_PWM_PIN, fan2DutyCycle);
}
} else {
// Invalid temperatures, turn off fans
analogWrite(FAN1_PWM_PIN, 0);
analogWrite(FAN2_PWM_PIN, 0);
}
// Output temperature, fan status, and override duty cycle to serial
Serial.print("Temperature 1: ");
Serial.print(temperature1);
Serial.print("°C, Temperature 2: ");
Serial.print(temperature2);
Serial.print("°C, Average Temperature: ");
Serial.print(averageTemp);
Serial.print("°C, Fan Override: ");
Serial.print(fanOverride ? "ON" : "OFF");
if (fanOverride) {
Serial.print(", Override Duty Cycle: ");
Serial.print(overrideDutyCycle);
Serial.print("%");
}
Serial.println();
delay(1000); // Adjust delay as needed
}
float readTemperature(DallasTemperature sensor) {
sensor.requestTemperatures();
return sensor.getTempCByIndex(0);
}
float calculateAverageTemperature() {
return (temperature1 + temperature2) / 2;
}
bool isValidTemperature(float temp) {
return temp >= -20 && temp <= 130;
}
void calculateFanDutyCycle(float temp) {
if (temp >= FAN_ON_TEMP) {
fan1DutyCycle = fan2DutyCycle = (temp >= FAN_HIGH_TEMP) ? FAN_HIGH_DUTY_CYCLE : FAN_LOW_DUTY_CYCLE;
} else {
fan1DutyCycle = fan2DutyCycle = 0;
}
}