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

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.
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.