In diesem Beitrag möchte ich mit dir das neunzehnte Türchen des Franzis Adventskalender für Arduino öffnen.
Wenn wir nun das Türchen öffnen, finden wir einen 20 MOhm Widerstand.
Diesen Widerstand benötigen wir heute nicht und können uns ebenso wie gestern einem anderen kleinen Projekt widmen, mit den bereits vorhandenen Bauteilen.
Steuern der Helligkeit von einzelnen LEDs per Taster & Drehpotentiometer
Wollen wir heute unseren Taster in die Schaltung einbauen und mit diesem die Helligkeit jeder einzelnen LED steuern. Der Taster dient dabei durch die LEDs zu skippen und über den Drehpotentiometer wird die Helligkeit gesteuert.
Schaltung – LEDs, Taster und Drehpotentiometer am Arduino Nano
Hier nun die Schaltung zu dem neuen Projekt:
Für diesen Aufbau benötigst du:
- vier LEDs inkl. Vorwiderstand,
- einen Taster inkl. 10 kOhm PullDown Widerstand,
- ein 16 kOhm Drehpotentiometer
Der Taster ist in unserem Fall am digitalen Pin D2 angeschlossen, das ist im nachfolgenden sehr wichtig, denn wir möchten wieder den Taster über ein Interrupt verwenden.
Programmieren
In dem Programm werden wir ein neues Konstrukt verwenden, ein Mehrdimensionales-Array. Zuvor hatten wir einfache Arrays welche eine Liste repräsentieren, wo wir mit einem Index (beginnend mit 0) Elemente entnehmen können.
Ein Mehrdimensionales-Array funktioniert gleich, nur dass halt jedes Element wiederum ein Array ist. Beim Initialisieren eines solchen Arrays müssen wir jedoch einen Wert übergeben, wie groß dieses ist.
Wir sehen, dass für jeden Pin ein Wert im Array existiert, dieser Wert ist unser PWM Signal bzw. wird dafür verwendet.
// ein Mehrdimensionales-Array mit den LED Pins sowie den Werten für die Helligkeit int leds[][2] = { { ledRot, 0 }, { ledOrange, 0 }, { ledGelb, 0 }, { ledGruen, 0 } };
Damit wir jeder LED einen anderen Wert zuordnen können, nutzen wir den Taster, um durch die LEDs zu steppen. Zunächst legen wir uns eine globale Variable an, damit wir diese aus Zugriff aus der Loop haben.
// aktueller gewählter Index, wird benötigt um eine LED aus dem Array zu wählen int currentLEDindex = -1; // Funktion welche ausgeführt werden soll wenn der Taster betätigt wird. void changeLED() { //Wenn der Index gleich 3 ist, dann... if (currentLEDindex == 3) { //den Index auf -1 setzen currentLEDindex = -1; } //den Index um eins erhöhen currentLEDindex++; } void setup() { // hinzufuegen eines Interrupts an den digitalen Pin D2 // die Funktion "changeLED" soll ausgeführt werden wenn // der Taster betätigt wird. attachInterrupt(digitalPinToInterrupt(taster), changeLED, RISING); }
In der Funktion loop schreiben wir nun fortlaufend die Werte an die LEDs und lesen den Drehpotentiometer aus.
//Schleife über das Mehrdimensionale-Array for (int i = 0; i < 4; i++) { //an der Position 0 befindet sich die Pinnummer, //an Position 1 der Wert für die Helligkeit (PWM Wert) analogWrite(leds[i][0], leds[i][1]); }
Diesen gelesenen Wert schreiben wir dann an die Stelle im Mehrdimensionalen-Array mit dem aktuellen Index.
//lesen des aktuellen Wertes des Drehpotentiometers int potiValue = analogRead(poti); //mappen des analogen Wertes auf ein PWM Signal int pwmValue = map(potiValue, 0, 1023, 0, 255); //speichern des PWM Signals im Mehrdimensionalen-Arrays //an dem aktuellen Index leds[currentLEDindex][1] = pwmValue;
Hier nun der komplette Code zum Programm:
// rote LED am digitalen Pin D3 angeschlossen #define ledRot 3 // orange LED am digitalen Pin D5 angeschlossen #define ledOrange 5 // gelbe LED am digitalen Pin D6 angeschlossen #define ledGelb 6 // gruene LED am digitalen Pin D9 angeschlossen #define ledGruen 9 // Drehpotentiometer am analogen Pin A0 angeschlossen #define poti A0 //Taster am digitalen Pin D2 angeschlossen #define taster 2 // ein Mehrdimensionales-Array mit den LED Pins sowie den Werten für die Helligkeit int leds[][2] = { { ledRot, 0 }, { ledOrange, 0 }, { ledGelb, 0 }, { ledGruen, 0 } }; // aktueller gewählter Index, wird benötigt um eine LED aus dem Array zu wählen int currentLEDindex = -1; // Funktion welche ausgeführt werden soll wenn der Taster betätigt wird. void changeLED() { //Wenn der Index gleich 3 ist, dann... if (currentLEDindex == 3) { //den Index auf -1 setzen currentLEDindex = -1; } //den Index um eins erhöhen currentLEDindex++; } void setup() { // definieren das die Pins der LEDs als Ausgang dienen pinMode(ledRot, OUTPUT); pinMode(ledOrange, OUTPUT); pinMode(ledGelb, OUTPUT); pinMode(ledGruen, OUTPUT); // hinzufuegen eines Interrupts an den digitalen Pin D2 // die Funktion "changeLED" soll ausgeführt werden wenn // der Taster betätigt wird. attachInterrupt(digitalPinToInterrupt(taster), changeLED, RISING); //initialisieren des Index changeLED(); } void loop() { //Schleife über das Mehrdimensionale-Array for (int i = 0; i < 4; i++) { //an der Position 0 befindet sich die Pinnummer, //an Position 1 der Wert für die Helligkeit (PWM Wert) analogWrite(leds[i][0], leds[i][1]); } //lesen des aktuellen Wertes des Drehpotentiometers int potiValue = analogRead(poti); //mappen des analogen Wertes auf ein PWM Signal int pwmValue = map(potiValue, 0, 1023, 0, 255); //speichern des PWM Signals im Mehrdimensionalen-Arrays //an dem aktuellen Index leds[currentLEDindex][1] = pwmValue; }
Wenn wir den Code auf dem Mikrocontroller überspielen, dann können wir wie erwähnt mit dem Taster durch die LEDs steppen und über den Drehpotentiometer die Helligkeit ändern.