Zum Inhalt springen
Adaptives Fahrtlicht mit Arduino - Auto-Foto

Adaptives Fahrtlicht mit Arduino

    Moderne Autos verfügen oft über adaptives Fahrtlicht. Das bedeutet, dass sich das Abblendlicht je nach Lichtverhältnissen automatisch einschaltet. Das lässt sich selbstverständlich gut mit Arduino nachbauen. Dazu benötigt man nur ein paar Teile.

    Adaptives Fahrtlicht mit Arduino auf dem Breadboard

    Bauteile

    Schaltplan

    Der Schaltplan lässt sich in zwei Schaltkreise unterteilen: der Sensor-Schaltkreis und der Lichtschaltkreis:

    Der Lichtschaltkreis besteht aus zwei Parallelschaltungen jeweils gleichfarbiger LEDs (Scheinwerfer und Rücklichter), die jeweils mit einem Widerstand (220 Ohm) in Reihe geschaltet sind. Da immer alle LEDs gleichzeitig an- oder ausgeschaltet werden genügt die Steuerung durch einen digitalen Output vom Arduino. Übrigens benötigen wir diese beiden Parallelschaltungen, da LEDs mit unterschiedlichen Farben unterschiedliche Innenwiderstände besitzen. Würden wir alle vier parallel schalten, würden nur die beiden roten LEDs leuchten. (Ja, das musste ich erst ausprobieren :-) )


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Der Sensor-Schaltkreis besteht aus einer Spannungsteiler-Schaltung. Hierbei werden zwei Widerstände, nämlich der Fotowiderstand und der 100 kOhm Widerstand in Reihe geschaltet. Eine Seite der Reihenschaltung wird mit dem GND verbunden, die andere mit dem 5V Plus. »Ausgelesen« wird die Schaltung, indem die Verbindung der beiden Widerstände an einen analogen Input-Pin des Arduino-Boards angeschlossen wird.

    Erschließung

    Sehen wir uns als Erstes an, welche Werte der analoge Input-Pin vom Arduino anzeigt. Dazu nutzen wir die serielle Kommunikation.

    const int ldrPin = A0;
    
    void setup() {
      Serial.begin(9600);
    }
    
    void loop() {
      Serial.println(analogRead(ldrPin));
      delay(10);
    }
    

    Im seriellen Monitor (Arduino>Werkzeuge>Seriellen Monitor) werden die Werte vom Fotowiderstand ausgegeben. Je dunkler es wird, desto kleiner wird der Wert. Nun legen wir einen Wert fest, ab dem das Licht eingeschaltet werden soll. Im Beispiel wird das 900 sein. Dieser Wert wird als Variable threshold (engl. Schwelle) gespeichert. Nun lässt sich im Code darauf prüfen.

    const int ldrPin = A0;
    const int ledPin = 2;
    const int threshold = 900;
    
    void setup() {
      Serial.begin(9600);
      pinMode(ledPin, OUTPUT);
    }
    
    void loop() {
      Serial.println(analogRead(ldrPin));
      if (analogRead(ldrPin)<threshold){
        digitalWrite(ledPin, HIGH);  
      } else {
        digitalWrite(ledPin, LOW);  
      }
      delay(10);
    }
    

    Nun wäre es ziemlich unpraktisch, wenn sich die Lampen so schnell nach Lichtsituation ändern würden. Deshalb bleiben sie beim Auto nach dem Einschalten eine Weile an, auch wenn man z. B. aus einem Tunnel fährt in die pralle Sonne fährt. In unserem Beispiel müssen wir nun also einen Timer einbauen. Das geht so:

    const int ldrPin = A0;
    const int ledPin = 2;
    const int threshold = 900;
    
    int einschaltTimer = 0;
    int einschaltDauer = 1000;
    
    void setup() {
      Serial.begin(9600);
      pinMode(ledPin, OUTPUT);
    }
    
    void loop() {
      Serial.println(analogRead(ldrPin));
      if (analogRead(ldrPin)<threshold){
        digitalWrite(ledPin, HIGH);  
        einschaltTimer = millis(); 
      } else {
        if (einschaltTimer+einschaltDauer<millis()){
          digitalWrite(ledPin, LOW);
        }
      }
      delay(10);
    }

    Wenn der Fotowiderstandswert kleiner als die Schaltschwelle (threshold) wird, wird eine »Stoppuhr« (timer) gestartet. Das passiert bei jedem Programmdurchlauf erneut, bis die Schaltschwelle größer als der Fotowiderstandswert ist. Nun wird im else-Zweig geprüft, ob der Stopuhr-Start plus der Wartezeit (einschaltDauer) kleiner als die aktuelle Zeit (millis()) ist. Ist das der Fall, wird der ledPin auf LOW gesetzt, was die LEDs abschaltet.

    Titelfoto von Sönke Biehl, CC-BY-SA

    So einfach ist das. Fragt doch mal beim nächsten Autokauf, warum adaptives Fahrtlicht als Extra so teuer ist :-D


    Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!

    • Die beliebtesten Arduino-Projekte von StartHardware
    • Inklusive Schaltplan, Beschreibung und Code
    • Arduino-Schnellstart-Kapitel
    • Kompakter Programmierkurs


    2 Gedanken zu „Adaptives Fahrtlicht mit Arduino“

    1. Hi Benno, also das sieht erstmal gut aus. Könnte so funktionieren. Ob es wirklich klappt kann man natürlich nur sagen, wenn man es ausprobiert.
      Liebe Grüße Stefan

    2. Moin.
      Danke für die Erklärung.
      Ich versuche gerade deinen Code umzubauen, um die Wartezeit bei einschalten und ausschalten zu haben, sowie zwei Timer. Natürlich müssen noch die Variable ergänzt werden.
      Kann das so was werden?

      void loop() {
      Serial.println(analogRead(ldrPin));

      if (analogRead(ldrPin)<threshold_on) {
      if (ausschaltTimer+ausschaltDauer<millis()) {
      digitalWrite(ledPin, HIGH);
      einschaltTimer = millis();
      }
      } else if (analogRead(ldrPin)<threshold_off) {
      if (einschaltTimer+einschaltDauer<millis()) {
      digitalWrite(ledPin, LOW);
      ausschaltTimer = millis();
      }
      }
      delay(10);
      }

      Vielen Dank.

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

     

    Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.