Franzis Adventskalender für Arduino – Tag 9

In diesem Beitrag möchte ich mit dir das neunte Türchen des Franzis Adventskalender für Arduino öffnen.

Franzis Adventskalender für Arduino - Tag 9
Franzis Adventskalender für Arduino – Tag 9

Wenn wir nun das Türchen öffnen, finden wir (wie gestern auch) zwei 10 cm lange, rote Breadboardkabel.

Eigentlich wollte ich mich mit Kritik zurückhalten, doch an zwei aufeinanderfolgenden Tagen die Breadboardkabel finde ich schon etwas unglücklich.

Da ich bereits das heutige Thema „Aufgabe: verbesserte Abfrage des Tasters“ dir in den letzten drei Tagen ausführlich gezeigt habe, möchte ich heute etwas ganz anderes machen, es soll nun heute um analoge Werte am Arduino Nano gehen.

Heute möchte ich dir zeigen, wie du eine LED als Lichtsensor einsetzen kannst. Eigentlich dient eine LED zum Abgeben von Licht, jedoch kann diese auch durch den verbauten Kristall eine kleine Spannung erzeugen, welche wir wiederum am Arduino per analogen Pin messen können. Dazu habe ich dir bereits ein kleines YouTube Video auf meinem Kanal gewidmet.

LED als Lichtsensor am Arduino UNO

Im gleichnamigen Beitrag Arduino Lektion #101: LED als Lichtsensor habe ich dir das ganze bereits ausführlich beschrieben, jedoch möchte ich hier mit den vorhandenen Bauteilen dir dieses Projekt etwas näher bringen.

Exkurs – Analoge Werte am Arduino Nano verarbeiten

Gewiss wird dieses Thema im Handbuch zum Adventskalender noch behandelt, aber es kann nicht schaden dieses Thema schon zu behandeln, denn dieses ist sehr essenziell für die Mikrocontrollerprogrammierung.

Was ist ein analoges Signal?

Ein analoges Signal am Arduino kann einen Wert zwischen 0 und, 1023 einnehmen. Dieses Signal können wir auf eine 5V Spannung repräsentieren, wobei 0 dann 0 V und der Wert 1023 5 V darstellen.

Somit kann ein analoges Signal mehr Zustände als ein rein digitales Signal besitzen, welches ja im Grunde nur die Zustände EIN/AUS – 1/0 hat.

Wie lese ich ein analoges Signal am Arduino?

Der Arduino UNO & Nano haben 6 analoge Pins, welche mit der Funktion „analogRead(<Pin>)“ gelesen werden können. Wobei die Rückgabe ein Integerwert (eine Ganzzahl) zwischen den erwähnten 0 und 1023 ist.

Wenn wir als nun die gelbe LED an einen der analogen Pins mit der Anode (dem Pluspol, langer Kontakt) anschließen und die Kathode (der Minuspol, kurzer Kontakt) an GND, dann können wir die Werte auf der seriellen Schnittstelle ausgeben und ablesen.

Programmieren

Das Programm zum auslesen eines analogen Wertes ist recht einfach, denn man muss wie erwähnt nur in einem Intervall den Pin auslesen und diesen Wert behandeln.

// LED am analogen Pin A0 angeschlossen
#define lichtsensor A0

void setup() {
  // beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);
}

void loop() {
  // auslesen des aktuellen Wertes vom analogen Pin
  int value = analogRead(lichtsensor);
  // ausgeben des gelesenen Wertes auf der seriellen Schnittstelle
  Serial.println(value);
}

Wenn wir diesen Code auf den Mikrocontroller überspielen und zusätzlich den seriellen Plotter öffnen, können wir erkennen, wie sich die Werte je nach Lichteinfluss ändern.

Aktivieren der LEDs je nach Wert

Nun können wir wie erwähnt die untere und obere Grenze ermitteln und mit einer weiteren Funktion „map“ diese Werte verwenden und eine der beiden LEDs (rot & grün) einschalten.

// LED am analogen Pin A0 angeschlossen
#define lichtsensor A0

// rote LED am digitalen Pin D3 angeschlossen
#define ledRot 3

// grüne LED am digitalen Pin D8 angeschlossen
#define ledGruen 8

// ein Array mit den Pins der LEDs
int leds[] = { ledRot, ledGruen };

// Variable zum Speichern der zuletzt ermittelten LED bzw.
// der Index für das Array
int activeLed = 0;

void setup() {
  // beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);

  // die Pins der LEDs als Ausgang definieren
  pinMode(ledRot, OUTPUT);
  pinMode(ledGruen, OUTPUT);
}

void loop() {
  // deaktivieren der zuletzt aktivierten LED
  digitalWrite(leds[activeLed], LOW);

  // auslesen des aktuellen Wertes vom analogen Pin
  int value = analogRead(lichtsensor);
  // ausgeben des gelesenen Wertes auf der seriellen Schnittstelle
  Serial.println(value);

  // ermitteln des Indexes aus dem Array, mit der unteren und oberen Grenze
  activeLed = map(value, 100, 325, 0, 1);
  digitalWrite(leds[activeLed], HIGH);

  // eine kleine Pause von 125 ms.
  delay(125);
}

Wenn wir den obigen Code auf den Mikrocontroller überspielen, dann können wir zbsp. mit einer kleinen Taschenlampe auf die gelbe LED leuchten und so zwischen den beiden LEDs (rot & grün) wechseln.

Ein Kommentar

Kommentar hinterlassen

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