Teil 5: Den Arduino programmieren
Auf zum Letzten Akt
Im folgenden gehe ich davon aus, daß der Umgang mit der Arduino IDE bekannt und die Arduino AVR Bibliothek im Boardverwalter eingerichtet ist um den Nano flashen zu können.
Wichtig:
Solltet ihr die Schaltung bis hierhin fertig aufgebaut haben, bitte diese zuerst von der Stromversorgung trennen und unbedingt die Heizmatten abstecken (!). Ansonsten würde die Gefahr bestehen, daß ihr den USB-Port eures Computers zerstört, da die Heizmatten viel mehr Strom ziehen als ein normaler USB-Port liefern kann. Viele moderne Computer haben zwar eine Schutzschaltung um dies zu verhindern, aber testet das bitte lieber nicht ![]()
Der Sitzheizungsschalter kann hingegen gefahrlos verbunden sein.
Jetzt könnt ihr den Arduino per USB-Kabel mit eurem Computer verbinden. Es ist normal daß dabei sowohl eine LED am Arduino als auch die LED des DC-DC-Spannungswandlers aufleuchtet.
Der folgenden Code kann einfach Copy&Paste übernommen und geflasht werden:
#define PIN_POTI_FAHRER A0
#define PIN_POTI_BEIFAHRER A3
#define PIN_HEIZUNG_FAHRER 3
#define PIN_HEIZUNG_BEIFAHRER 9
byte PWM_CYCLE_FAHRER = 0;
byte PWM_CYCLE_BEIFAHRER = 0;
void setup()
{
Serial.begin(9600);
Serial.println("\n Onestone's Golf 1 PWM Sitzheizungsbox für Arduino");
// Input Pins für Schalter Potis zum Abfragen
pinMode(PIN_POTI_FAHRER, INPUT);
pinMode(PIN_POTI_BEIFAHRER, INPUT);
// Output Pins für Lasstransistoren
pinMode(PIN_HEIZUNG_FAHRER, OUTPUT);
pinMode(PIN_HEIZUNG_BEIFAHRER, OUTPUT);
}
void loop()
{
measureResistance();
delay(1000);
}
void measureResistance()
{
long reading = 0;
// Schalter Potis abfragen und PWM duty cycle daraus erstellen
reading = analogRead(PIN_POTI_FAHRER);
PWM_CYCLE_FAHRER = (byte)map(reading, 0, 525, 0, 255);
reading = analogRead(PIN_POTI_BEIFAHRER);
PWM_CYCLE_BEIFAHRER = (byte)map(reading, 0, 525, 0, 255);
// PWM cylcles Filtern:
// - kleine duty cycles herausfiltern, bringen keine Wärme, belasten aber die
// Transistoren sonst. Cycle 10 entspricht kurz vor der 1 auf dem Schalter Rädchen
// - ab 240 durchschalten auf volle Power, entspricht kurz vor Stufe 5 auf dem
// Schalter Rädchen
if (PWM_CYCLE_FAHRER < 10) PWM_CYCLE_FAHRER = 0;
else if (PWM_CYCLE_FAHRER > 240) PWM_CYCLE_FAHRER = 255;
if (PWM_CYCLE_BEIFAHRER < 10) PWM_CYCLE_BEIFAHRER = 0;
else if (PWM_CYCLE_BEIFAHRER > 240) PWM_CYCLE_BEIFAHRER = 255;
// PWM Pins duty cycle setzen für Lasttransistoren
analogWrite(PIN_HEIZUNG_FAHRER, PWM_CYCLE_FAHRER);
analogWrite(PIN_HEIZUNG_BEIFAHRER, PWM_CYCLE_BEIFAHRER);
// Serial.println("Rohwert: " + String(reading));
Serial.println("PWM cycles: Fahrerseite = " + String(PWM_CYCLE_FAHRER) + " / Beifahrerseite = " + String(PWM_CYCLE_BEIFAHRER));
}
Alles anzeigen
Hier ein paar Erläuterungen um den Code besser nachzuvollziehen:
- Zeilen 1-8:
- Hier werden die Pins definiert die wir benutzen wollen, für die Lastmodule und die beiden Potis im Schalter, sowie zwei Variablen angelegt
- Zeilen 11-24:
- Im Setup-Teil wird festgelegt wie die Pins zu benutzen sind: Die beiden Pins für die Potis im Schalter sollen Eingabe-Pins sein, die beiden Pins an denen die Lastmodule hängen sollen Ausgabepins sein. Außerdem schicke ich noch ein paar Ausgaben auf die Serielle Konsole, anhand derer man später testen kann ob das Flashen geklappt hat, oder ob z.B. der Schalter richtig angeschlossen ist
- Zeilen 26-30:
- Hier wird festgelegt, daß der Schalter einmal pro Sekunde abgefragt wird und die Lastmodule entsprechend angesteuert werden sollen
- Zeilen 32-40:
- Hier muss man wissen, daß die Analog-Digital-Wandler des Arduino eine Spannung an einem Analog-Pin auf eine Zahl zwischen 0 und 1024 abbilden. Je nach Potistellung liefert die Funktion analogRead aufgrund des Spannungsteilers in unserer Schaltung eine Zahl zwischen 0 und 525 zurück. Mit einer solchen Zahl kann der Ausgabepin des Arduino allerdings direkt nichts anfangen, dieser benötigt für die PWM-Funktion eine Zahl zwischen 0 (aus) und 255 (PWM bei 100%).
- Hierzu kommt nun die map-Funktion zum Einsatz. Diese Funktion bildet eine beliebige Zahlenreihe auf eine andere Zahlenreihe ab, in unserem Falls also die Zahlenreihe 0-525 auf die Zahlenreihe 0-255
- Zeilen 42-48:
- Da die Potis in den Schaltern alt sind und nicht immer genau 0 Ohm in Nullstellung und 500 Ohm auf Stufe 5 haben, sondern mal ein paar Ohm mehr oder weniger, habe ich hier noch einen kleinen Filter eingebaut. Dieser bewirkt daß alle Werte unterhalb von 10 auf 0 gesetzt werden um die Sitzheizung nicht im eigentlich ausgeschaltet Zustand immer trotzdem mit ein paar % Leistung anzusteuern.
- Das gleiche für die Max-Stellung: bei Stufe 5 soll sie immer mit 100% laufen, auch wenn das Poti ein paar Ohm weniger liefern sollte
- Zeilen 50-52:
- Hier wird nur noch die PWM-Rate der Ausgabepins gesetzt
- Zeile 55:
- Hier wird auf die Serielle Konsole einmal pro Sekunde die PWM-Rate der erkannten Schalterstellung geschrieben (0-255).
Noch wichtig zu wissen:
- Wenn ihr den Arduino alleine oder die ganze Schaltung ohne angeschlossenen Sitzheizungsschalter flasht und euch dann die Ausgabe auf dem Seriellen Monitor anschaut, seht ihr möglicherweise komische Werte (z.B. "PWM-Cycle 240" oder ähnlich). Das ist ganz normal und braucht euch nicht zu beunruhigen, da die Analogpins frei schwebend irgendetwas zurück liefern. Sobald ein Schalter dran hängt sollten sie ganz normal funktionieren
- Solltet ihr aus irgendeinem Grund alles schon fertig im Auto verbaut haben und dann erst mit einem Laptop und USB-Kabel an den Arduino gehen: Zündung aus und die Stecker Sitze vorher abziehen (!), sonst siehe oben
So, nun viel Spaß beim Nachbauen und ausprobieren ![]()
Weitere Ideen und Anregungen sind immer herzlich willkommen!