Franzis Adventskalender für Arduino – Tag 19

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

Franzis Adventskalender für Arduino – Tag 19
Franzis Adventskalender für Arduino – Tag 19

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:

Schaltung - Arduino Nano mit LEDs, Taster & Drehpotentiometer
Schaltung – Arduino Nano mit LEDs, Taster & Drehpotentiometer

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.

Kommentar hinterlassen

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