Go Down

Topic: LED Ansteuerung über IR - "Disko"-Funktion (Read 452 times) previous topic - next topic

Marcel123

Jan 05, 2016, 06:23 pm Last Edit: Jan 05, 2016, 06:55 pm by Marcel123
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:
Code: [Select]
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

HotSystems

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
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Marcel123

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

HotSystems

Erledigt. Danke für den Hinweis. Hab ich irgendwie verpeilt :D
Prima, danke.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

uwefed

#4
Jan 05, 2016, 11:37 pm Last Edit: Jan 05, 2016, 11:37 pm by uwefed
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

HotSystems

#5
Jan 05, 2016, 11:47 pm Last Edit: Jan 05, 2016, 11:49 pm by HotSystems
Uwe hat es mir vorweg genommen, war gerade am Schreiben.


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

Code: [Select]

DiskoOn == 1; \\für Ein

DiskoOn == 0; \\für Aus


Die Variable "int DiskoOn" global deklarieren.

Das in die Loop:

Code: [Select]

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


Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

uwefed

#6
Jan 06, 2016, 12:14 am Last Edit: Jan 06, 2016, 12:15 am by uwefed
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

HotSystems

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 ;)

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Marcel123

Ich hab das jetzt so wie ihr gesagt habt mit einer Variable gelöst.
Das funktioniert ohne Probleme.
Danke.
Hier noch mal der Sketch:
Code: [Select]
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();
  }
}

Go Up