LED Ansteuerung über IR - "Disko"-Funktion

Hallo.
Ich bin erst neu hier und auch allgemein in dem Thema Arduino.
Ich versuche gerade ein paar LEDs über eine IR Fernbedienung anzusteuern. Das klappt auch alles soweit. Allerdings wollte ich eine “Disko”-Funktion einbauen, bei der immer eine LED an geht, wieder aus geht und dann eine andere an geht. Daran scheitert es allerdings. Entweder es geht eine LED an und aus und es passiert danach nichts mehr oder die Funktion läuft so ab wie sie soll, wo ich sie allerdings nicht mehr mit der Fernbedienung abschalten kann.
Hier mein Code:

int receiverpin = 9;

#include <IRremote.h>
#include <IRremoteInt.h>

IRrecv irrecv(receiverpin);
decode_results results;

void setup()
{
  irrecv.enableIRIn();
  for(int z = 2; z < 8; z++)
  {
    pinMode(z, OUTPUT);
  }
}

void pinOn(int pin)
  {
    digitalWrite(pin, HIGH);
  }

void pinOff()
{
  for (int z = 2; z < 8; z++)
  {
    digitalWrite(z, LOW);
  }
}

void translateIR()
{
  switch(results.value)
  {
    case 0xFF6897: pinOn(2);
    break;
    case 0xFF30CF: pinOn(3);
    break;
    case 0xFF18E7: pinOn(4);
    break;
    case 0xFF7A85: pinOn(5);
    break;
    case 0xFF10EF: pinOn(6);
    break;
    case 0xFF38C7: pinOn(7);
    break;
    case 0xFF906F: disko();
    break;
    case 0xFFA25D: pinOff();
    break;
  }
}

void disko()
{
  int z = 0;
  z = random(2,8);
  digitalWrite(z, HIGH);
  delay(50);
  digitalWrite(z, LOW);
  delay(50);
}

void loop() 
{
  if(irrecv.decode(&results))
  {
    translateIR();
    irrecv.resume();
  }
}

Ich hoffe ihr könnt mir helfen.
LG

Warum benennst du deinen Thread nicht so, das jeder sieht, was deine Frage ist. Das du Hilfe brauchst, kann man sich doch denken, wenn du hier postest.

Bitte ändere deinen Titel in einen entsprechenden Text.

Danke

Erledigt. Danke für den Hinweis. Hab ich irgendwie verpeilt :D

Marcel123: Erledigt. Danke für den Hinweis. Hab ich irgendwie verpeilt :D

Prima, danke.

Ich würde mal sagen, daß die Zahl von der Fernbediehnung nur einmal kommt. Das kann gut gehen wenn Du einmalig eine LED einschalten mußt und diese dann bis zum Abschalten leuchten soll. Bei DISKO soll aber ab Tastendruck dauernt was passieren.

Definiere eine status-Variable; setze sie 1 wenn der Einschalttastendruck kommt und setzte sie 0 wenn ein anderer Tastendruck kommt. Im loop() rufst Du die disko() funktion auf solange die status-Variable 1 ist.

Die kurze delay()-Zeit von 100mS stöhrt nicht sehr den Programmablauf. Bei längeren Zeiten mußt Du en Sketch auf millis() umschreiben.

Grüße Uwe

Uwe hat es mir vorweg genommen, war gerade am Schreiben.

Das in die jeweilige Ein bzw. Ausschaltfunktion deiner IR-Auswertung.

DiskoOn == 1; \\für Ein

DiskoOn == 0; \\für Aus

Die Variable "int DiskoOn" global deklarieren.

Das in die Loop:

void loop()
{
  if (DiskoOn == 1) {
    disko();
  }
  if (irrecv.decode(&results))
  {
    translateIR();
    irrecv.resume();
  }
}

HotSystems: Uwe hat es mir vorweg genommen, war gerade am Schreiben.

Auch ich habe Zeit gebraucht zu schreiben und kann nicht 10 Finger Blindschreiben. ;) ;) ;) Also habe ich nicht nur früher abgeschickt sondern auch früher angefangen zu schreiben. ;) ;) ;)

Grüße Uwe

uwefed: Auch ich habe Zeit gebraucht zu schreiben und kann nicht 10 Finger Blindschreiben. ;) ;) ;) Also habe ich nicht nur früher abgeschickt sondern auch früher angefangen zu schreiben. ;) ;) ;)

Grüße Uwe

Und ich brauchte etwas länger zum Überlegen. 5 x ;)

Ich hab das jetzt so wie ihr gesagt habt mit einer Variable gelöst.
Das funktioniert ohne Probleme.
Danke.
Hier noch mal der Sketch:

int receiverpin = 9;
boolean DiskoOn = false;

#include <IRremote.h>
#include <IRremoteInt.h>

IRrecv irrecv(receiverpin);
decode_results results;

void setup()
{
  irrecv.enableIRIn();
  for(int z = 2; z < 8; z++)
  {
    pinMode(z, OUTPUT);
  }
}

void pinOn(int pin)
  {
    digitalWrite(pin, HIGH);
  }

void pinOff()
{
  for (int z = 2; z < 8; z++)
  {
    digitalWrite(z, LOW);
  }
  DiskoOn = false;
}

void disko()
{
  int z = 0;
  z = random(2,8);
  digitalWrite(z, HIGH);
  delay(50);
  digitalWrite(z, LOW);
  delay(50);
}

void translateIR()
{
  switch(results.value)
  {
    case 0xFF6897: pinOn(2);
    break;
    case 0xFF30CF: pinOn(3);
    break;
    case 0xFF18E7: pinOn(4);
    break;
    case 0xFF7A85: pinOn(5);
    break;
    case 0xFF10EF: pinOn(6);
    break;
    case 0xFF38C7: pinOn(7);
    break;
    case 0xFF906F: DiskoOn = true;
    break;
    case 0xFFA25D: pinOff();
    break;
  }
}

void loop() 
{
  if( DiskoOn == true)
  {
    disko();
  }
  if(irrecv.decode(&results))
  {
    translateIR();
    irrecv.resume();
  }
}