Heizungssteuerung
Die Heizungssteuerung sieht bei den meisten Umbauten so aus, dass ein Schalter das Heizelement über ein Relais einschaltet. Heizung ist nötig, auch bei diesen Temperatutren um die 30°C, sonst gibt’s keinen TÜV. Da der Boxster ja eine Klimaautomatik
hat (aber keinen Kompressor mehr) wollte ich die nutzen. Hierzu gibt es zwei sinnvolle Signale: Zu Ersten das Feedback Signal des
Heizungsklappenmotors mit 0,5-4,1V und Zweitens das des Lüfters. Beide sind bei Zündung aus 0V.
Die Kiste mit der Heizungssteuerung ist relativ leer- Da geht doch was!
Also hab ich ein Arduino Nano besorgt, der über 12V mit Strom versorgt wird.
Die Signale gehen an zwei Analogeingänge. Pin 13 geht an eine Flachled, für die ich in der Blende einen kleinen Schlitz gefräst habe. Der Digitalausgang geht an ein 5V Relais mit 180Ohm und schalte dann 12V an das Kilovac Relais. Das wars.
Dann ein Programm geschrieben, das prinzipiell folgendes macht: Wenn die Heizungsklappe etwas auf ist und der Lüfter mindestens auf Stufe 3 läuft, schaltet sich die Heizung ein. Ansonsten ist sie Aus was sie mindestens 10sec ist. So wird vermieden das Sie ständig hin- und herschaltet. Aus den Analogsignalen mittele ich um auch hier ein Glättung zu erzielen.
Hier das Programm:
Update: Hier ein neues Programm, mein Bruder war der Meinung, dass Befehle wie delay() nur was für kleine Kinder sind, daher hier in seiner überarbeiteten Version incl Tiefpassfilter der Signale. Funktioniert auch…
/*
Heater control for Boxster
on Arduino Nano/ fits inside HVAC Control
D Plug is Black
D15: Ground
D 9: Switched 12V ignition
B Plug is Red
B12: Actuation Fan
B13: Checkback Signal Temperature Flap (Cool 4,1V / hot 0,5V)
Output Pin3 on relay actuating a Kilovac 200
Output Pin13 an LED
By Christian Schulz 31.7.2013
eboxster.blogspot.com
*/
int CheckbackFlap = 0; // Input checkback Flap
int ActuationFan = 1; // Input B12 Actuation Fan
int heater = 3; // pin for the heater Relay max 40mA!
int led = 13; // Pin for control LED
float Flap; // define FlapValue
float Ventilation; // define Ventilation Value
int FlapLimit = 650; // Limit when heater may turn on (flap is open)
670 zu niedrig
int VentilationLimit = 855; // Limit when Ventilation is high enough for
heating 870zu hoch 880 zu n
float DtLPFVentilation = 0.5; // Filterconstant for ventilation (0 = No
Filter; 0.99 = very Smooth)
float DtLPFFlap = 0.5; // Filterconstant for Flaps
unsigned long dtDeactiveAfterHeat = 0; // Marks Timestep after witch Changes in
Heater are possible
int dtNoActionAfterHeating = 10000; // Milliseconds
void setup() {
/* declare pinmodes/ pinMode(heater, OUTPUT); // declare the heater as an Output pinMode(led, OUTPUT); // declare the LED as an Output Serial.begin(9600); // for adjustment readout / initialize all variables/ Flap = analogRead(CheckbackFlap); // initialize Flap for smooth StartUp of LPF Ventilation = analogRead(ActuationFan); // initialize Ventilation for smooth StartUp of LPF dtDeactiveAfterHeat = 0; // initialize timer ( 0 = changes are possible directly after startUp) DtLPFFlap = 0.5; // initialize Filterconstant for Flaps (0 = No Filter; 0.99 = very Smooth) DtLPFVentilation = 0.5; // initialize Filterconstant for ventilation (0 = No Filter; 0.99 = very Smooth) } void loop() { /*read sensorsvalues and filter */
Flap = lpf(analogRead(CheckbackFlap), DtLPFFlap, Flap); // readout Flap and
average over LPF
Ventilation = lpf(analogRead(ActuationFan),DtLPFVentilation,Ventilation); //
readout Ventilation average over LPF
Serial.print(„Flap = “ ); // for adjustment readout
Serial.print(Flap);
Serial.print(„/ Ventilation:“);
Serial.println(Ventilation);
if (millis() >= dtDeactiveAfterHeat) // Prevent any Changes for 10000ms
after heater was turned off
{
if (Flap < FlapLimit && Ventilation > VentilationLimit) //
{
digitalWrite(heater, HIGH); // turn heater on
digitalWrite(led,HIGH); // turn LED on
}
else
{
digitalWrite(heater, LOW); // turn heater off
digitalWrite(led,LOW); // turn LED off
dtDeactiveAfterHeat = millis() + dtNoActionAfterHeating; // reset timer
}
}
}
float lpf(int data, float filterConst, float filteredValue){
/*
Simple LowPassFilter
data = Data input
filterConst = TimeConstant for LowPassFilter (Value Should be between 0 and 1)
0 = No Fiter
1 = Very Smoth Filtering
FilteredValue = Filtered Value from last Timestep (not nesseary to be flaot
but more accurate)
*/
if (filterConst > 1){ // check to make sure filterConst is in range
filterConst = .99; // Lowest filtering
}
else if (filterConst <= 0){
filterConst = 0; // No Filter
}
filteredValue = (data * (1 – filterConst)) + (filteredValue * filterConst);
return filteredValue;
}
Das funktioniert soweit ganz gut. Man muss halt aufpassen wenn man die Daten ausliest, ich habe das fast nur mit ausgeschalteter Zündung gemacht. Wer weis was da passiert…
Die Parameter der Schaltpunkte müssen noch mal überprüft werden, da es die letzten Tage nie unter 27°C war. Sieht soweit gut aus, und regelt auch. Bezüglich der Heizleistung kann ich das noch nicht einschätzen, da die PTC’s bei den Temperaturen jetzt maximal 5A „ziehen“, was etwas über 600W entspricht.