// lichtmaschinenregler_benzinpumpensteuerung_im_sapo // seit dem 11.05.2023 im Saporoshez eingebaut //******************************************************* // Dies ist die Version mit der Platine //******************************************************* // 1 // 2 // 3 // 4 // 5 // //************************// // Lichtmaschinenregler // //************************// const int analogPin1 = A1; // oranges Kabel vom Spannungsteiler Zündungsplus (PLUS) const int analogPin2 = A2; // dünnes lila Kabel vom Spannungsteiler Lichtmaschinenphase, dickes lila/rotes Kabel // dazwischen noch eine Gleichrichterbrücke // Schraubkontakt 3 gelbes Kabel von Lichtmaschinenphase 1 // Schraubkontakt 4 gelbes Kabel von Lichtmaschinenphase 2 const int analogPin3 = A3; // dünnes weißes Kabel vom Spannungsteiler Anlasserrelais // Schraubkontakt 5 dickes weißes Kabel vom Spannungsteiler Anlasserrelais const int PWMPin1 = 9; // dünnes braunes Kabel zum P-Mosfet 1 // P-Mosfet 1: dickes blaues Kabel zum Anschluss Erregerwicklung const int DigitalPin1 = 10; // dünnes blaues Kabel zum P-Mosfet 2 // Schraubkontakt 2 P-Mosfet 2: dickes braunes Kabel zum Anschluss Benzinpumpe const int DigitalPin2 = 11; // dünnes gelbes Kabel zum NPN Leistungs-Transistor // Schraubkontakt 1 NPN Leistungs-Transistor: grün-gelb um Ladekontrolle auf Masse zu schalten int val1 = 0; // speichert den gelesenen Wert 1 Zündungsplus (PLUS) int val2 = 0; // speichert den gelesenen Wert 2 Lichtmaschinenphase int val3 = 0; // speichert den gelesenen Wert 3 Anlasserrelais int pwm = 0; // pwm zum Senden int sollvolt = 691 ; // 691 entprechen vermutlich 13,51 Volt // sollvolt muss bei einem Nachbau durch Probieren ermittelt werden long pumpendauer = 15000; // erste Einschaltdauer der Benzinpumpe = 15 Sekunden unsigned long zuendungdauer = 0; // Dauer der Zündung, d.h. seit dem Einschalten Arduino unsigned long zuendungdauer2 = 0; // Dauer der Zündung seit Anlasser, d.h. seit dem nächsten Startversuch long startTime = 0; // millis-Wert beim Start der Zündung, d.h. beim Einschalten Arduino long startTime2 = 0; // millis-Wert beim Betätigen des Anlassers int benzinpumpenvorlauf = LOW; // Vorlauf der Benzinpumpe ohne Motorlauf int b1 = 1 ; // Wert 1 für Berechnung Benzinpumpe, erster Wert für Zeitablauf int b2 = 0 ; // Wert 2 für Berechnung Benzinpumpe, Wert für erneuten Zeitablauf int b3 = 0 ; // Wert 3 für Berechnung Benzinpumpe, Wert für Ermittlung über Lichtmaschinenphase val2 const unsigned long ON_TIME = 200; // für dreimalblinken const unsigned long OFF_TIME = 200; // für dreimalblinken const unsigned long PAUSE_TIME = 600; // für dreimalblinken unsigned long previousMillis = 0; // für dreimalblinken int ladekontrolleuchte = LOW; // für dreimalblinken unsigned long blinkCount = 0; // für dreimalblinken void setup() { startTime = millis(); pinMode(PWMPin1, OUTPUT); pinMode(DigitalPin1, OUTPUT); pinMode(DigitalPin2, OUTPUT); } void auslesen() { val1 = analogRead(analogPin1);// Lesen des Analogpins 1 Zündungsplus (PLUS) val2 = analogRead(analogPin2);// Lesen des Analogpins 2 Lichtmaschinenphasen val3 = analogRead(analogPin3);// Lesen des Analogpins 3 Anlasserrelais } void pwmberechnen() { if ( val1 < sollvolt ) ++pwm; if ( pwm > 255 ) pwm = 255; if ( val1 > sollvolt ) pwm = pwm - 1; if ( pwm < 1 ) pwm = 0; } void pwmsenden() { analogWrite(PWMPin1,pwm); // Senden pwm } void dreimalblinken() { unsigned long currentMillis = millis(); if (ladekontrolleuchte == LOW && blinkCount == 0 && currentMillis - previousMillis >= PAUSE_TIME) { ladekontrolleuchte = HIGH; previousMillis = currentMillis; blinkCount++; } else if (ladekontrolleuchte == HIGH && currentMillis - previousMillis >= ON_TIME) { ladekontrolleuchte = LOW; previousMillis = currentMillis; blinkCount++; } else if (ladekontrolleuchte == LOW && blinkCount < 3 && currentMillis - previousMillis >= OFF_TIME) { ladekontrolleuchte = HIGH; previousMillis = currentMillis; } else if (ladekontrolleuchte == HIGH && blinkCount < 3 && currentMillis - previousMillis >= ON_TIME) { ladekontrolleuchte = LOW; previousMillis = currentMillis; } else if (ladekontrolleuchte == LOW && blinkCount == 3 && currentMillis - previousMillis >= PAUSE_TIME) { ladekontrolleuchte = HIGH; previousMillis = currentMillis; blinkCount = 0; } } void benzinpumpeberechnen() { zuendungdauer = millis() - startTime; if (zuendungdauer > pumpendauer) // wenn die Zündung länger als der Grenzwert läuft { b1 = 0; // dann wird Wert 1 auf 0 gesetzt } if ( val3 > 100 ) // Wenn Spannung am Anlasserrelais anliegt { b2 = 1; // bei diesem Neustart zu Beginn Wert 2 auf 8 startTime2 = millis(); } zuendungdauer2 = millis() - startTime2; if (zuendungdauer2 > pumpendauer) // wenn die Zündung länger als der Grenzwert läuft { b2 = 0; // dann wird Wert 2 auf 0 gesetzt } if ( val2 > 50) // Wenn Spannung an der Lichtmaschinenphase anliegt { b3 = 1; // dann wird Wert 3 auf 1 gesetzt } if ( val2 < 51 ) // Wenn keine Spannung an der Lichtmaschinenphase anliegt { b3 = 0; // dann wird Wert 3 auf 0 gesetzt } if ( ( b1 + b2 + b3 ) > 0 ) { benzinpumpenvorlauf = HIGH; previousMillis = 0; blinkCount = 0; } if ( ( b1 + b2 + b3 ) < 1 ) { benzinpumpenvorlauf = LOW; dreimalblinken(); } digitalWrite(DigitalPin1, benzinpumpenvorlauf); } void ladeleuchteberechnen() { if ( ( b1 > 0 || b2 > 0 ) && b3 == 0) { ladekontrolleuchte = HIGH; unsigned long previousMillis = 0; } if ( b3 > 0 ) { ladekontrolleuchte = LOW; } if ( benzinpumpenvorlauf == LOW ) { dreimalblinken(); } digitalWrite(DigitalPin2, ladekontrolleuchte); } void loop() { auslesen(); pwmberechnen(); pwmsenden(); benzinpumpeberechnen(); ladeleuchteberechnen(); digitalWrite(DigitalPin2, ladekontrolleuchte); }