Gelöst : noch einmal meine Ferbedienung

Hallo freunde

Ich probiere mich gerade an einer IR Fernbedienung. Es klappt auch alles super, ich schalte damit meine Software Uhr wärend des betriebs, also ich kann die stunden, Minuten und Sekunden vor oder zurück stellen, das macht mir keine Probleme. Jedoch ist an der fernbedienung oben ein Tastenfeld für vor, zurück und seitliches schalten, diese Tasten möchte ich gerne so schalten das wenn ich die Taste dauernd gedrückt halte die Uhrzeit auch durchgehend vor oder zurück läuft. jedoch muss ich den Taster jedesmal neu dücken um z.B.1 Std vor oder zurück zu springen. Da wenn ich den Taster dauernd gedrückt halte jedesmal nur um eine Stelle weitergesprungen wird in der Zeit. obwohl im Serielen Monitor angzeigt wird das der Code der Taste dauernd ausgegeben wird. Ich stelle einmal ein Bild der Fernbedienung ein und en Sketch.

#include <FastSPI_LED2.h>
#include <IRremote.h>
#define NUM_LEDS 5
#define DATA_PIN A4

CRGB leds[NUM_LEDS];

char time[]=__TIME__;
int stunden,minuten,sekunden;
int farbe;
int satt;
int hell;
int RECV_PIN = 11; //define input pin on Arduino
int ledpin = 13;
IRrecv irrecv(RECV_PIN);

decode_results results;

 void tickOneSecond()  // UHR laufen lassen
 {
     
    
         //Uhrzeite berechnen
  if (sekunden == 60) {sekunden=0;minuten++;}
  if (minuten == 60) {minuten=0;stunden++;}
  if (stunden == 24) {stunden=0;}
  analogWrite(ledpin,255);
 }
void logofarbwechsel()
{
  farbe=255/stunden*3;
  satt=255;
  hell=60;
}
void setup()
{
pinMode(ledpin,OUTPUT); 
Serial.begin(9600);

FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
for (int i=0;i < NUM_LEDS; i++) {leds[i] = CHSV(255,0,0);}

  stunden=atoi(time);
  minuten=atoi(&time[3]);
  sekunden=atoi(&time[6]);
  
  /*
 stunden = 2;  // wenn Uhr von Hand gestellt wird
 minuten = 0;
 sekunden = 0;
 */ 

irrecv.enableIRIn(); // Start the receiver
pinMode(ledpin,OUTPUT);
}

unsigned long alteSekunde;

void loop() {
//for (int i=0;i < NUM_LEDS; i++) {leds[i] = CHSV(0,0,0);}

if (irrecv.decode(&results)) {
FastLED.show();  
Serial.println(results.value,HEX);
if (results.value == 0xFF6897) //Taste 1
{
  stunden=stunden+1;
  digitalWrite(ledpin,HIGH);
leds[0] = CHSV(100,255,60);
}

if (results.value == 0xFF9867) //Taste 2
{
 stunden=stunden-1;
leds[1] = CHSV(100,255,60);
}
if (results.value == 0xFFB04F) //Taste 3
{
  minuten=minuten+1;
leds[2] = CHSV(100,255,60);
}
if (results.value == 0xFF30Cf) //Taste 4
{
  minuten=minuten-1;
leds[3] = CHSV(100,255,60);
}
if (results.value == 0xFF18E7) //Taste 5
{
  sekunden=sekunden+1;
leds[4] = CHSV(100,255,60);
}

if (results.value == 0xFF7A85) //Taste 6
{
  sekunden=sekunden-1;
}

if (results.value == 0xFF10EF) //Taste 7
   {
     logofarbwechsel();
     for (int i = 0; i < NUM_LEDS; i++){leds[i] = CHSV(farbe,satt,hell);}
   }
/*
if (results.value == 0xFF38C7) //Taste 8
if (results.value == 0xFF5AA5) //Taste 9
if (results.value == 0xFF4AB5) //Taste 0 für Aus
*/

irrecv.resume(); // Receive the next value
}

if ((stunden == 12) or (stunden == 17)){leds[0] = CHSV(255,250,60);}
if ((stunden == 13) or (stunden == 18)){leds[1] = CHSV(255,250,60);}
if ((stunden == 14) or (stunden == 19)){leds[2] = CHSV(255,250,60);}
if ((stunden == 15) or (stunden == 20)){leds[3] = CHSV(255,250,60);}
if ((stunden == 16) or (stunden == 21)){leds[4] = CHSV(255,250,60);}
if ((stunden >= 22) or (stunden <= 11)){for (int i=0;i < NUM_LEDS; i++) {leds[i] = CHSV(0,0,0);}}

if (alteSekunde==millis()/1000)  return; // selbe Sekunde, loop verlassen
     analogWrite(ledpin,LOW);          
    delay(100);
    alteSekunde=millis()/1000;
    tickOneSecond(); // Uhrzeit weiterticken lassen
    
    sekunden++; // Sekundenzähler für UHR
    
    FastLED.show();
    
   Serial.print("Uhreit: Std. ");
   Serial.print(stunden);
   Serial.print(" Min. ");
   Serial.print(minuten);
   Serial.print(" Sek. ");
   Serial.print(sekunden);
   Serial.println(" ");
}

fernb.JPG

Hm-die Lib. liest die Fb ein oder?

Womöglich hat sie sowas wie eine Entprell-Funktion, die verhindert, das eine länger gedrückte Taste mehrmals erkannt wird.
Mach das doch selber, so schwer ist das nicht.
Besorg dir mal das Einsteiger-Tutorial was man zu den Sainsmart-Clones dazu bekommt, dort ist auch die Handhabung einer IR-Fernbedienung erklärt. Geht auch ohne Breakout-bzw. nur mit dem Sensor alleine. :slight_smile:
Da: Overview | IR Sensor | Adafruit Learning System wirds auch erklärt.

hi, malerlein,

bist Du sicher, daß der serial monitor in diesem fall wirklich den code der taste ununterbrochen ausgibt?

ich hab' die gleiche fernbedienung, und es ist schon monate her, aber soweit ich mich erinnere, gibt er einen eigenen wiederholungscode aus, der unabhängig von der taste ist. also wenn man draufbleibt, erstmal tastencode, dann eine halbe sekunde nix, und dann ununterbrochen den wiederholungscode.

Du müßtest also immer den tastencode speichern, und wenn der wiederholungscode kommt, ihn durch den letzten tastencode ersetzen.

gruß stefan

Eisebaer:
ich hab' die gleiche fernbedienung, und es ist schon monate her, aber soweit ich mich erinnere, gibt er einen eigenen wiederholungscode aus, der unabhängig von der taste ist. also wenn man draufbleibt, erstmal tastencode, dann eine halbe sekunde nix, und dann ununterbrochen den wiederholungscode.

Kann ich so bestätigen, ist bei den wenigen Versuchen die ich mit IR gestarte habe genauso gewesen.

Welchen Code (steht in results->decode_type) verwendete Deine Fernbedienung? Sei schon mal vorgewarnt: Du musst IRremote abändern, damit Du Autorepeat kriegst.

Ja Stefan Du hast recht es wird immer erst der Code ausgegeben und an FFFFFFF also wie folgt.

FF6897
FFFFFFFF
FFFFFFFF
FFFFFFFF

wo er auf die neue eingabe wartet, wenn ich die Anweisung irrecv.resume(); // Receive the next value ausblende, läuft der Code einfach durch und ich kann nichts mehr machen. Ich habe gedacht wenn ich diese Anweisung umgehen kann würde immer weiter geschaltet. Und zwar geht es mir einfach darum das ich eine Equinox Clock ja soweit fertig habe und diese auch mit der IR fernbedienung einstellen kann, jedoch möchte ich gerne im programm nch einbringen, wenn ich eine Taste z.B.Pfeil nach Oben.... im Beleuchteten Kranz der Equinox 5 LED die Farbe wechseln und schnell wie bei einem Lauflicht im dem Beleuchteten Kranz rum laufen ohne die Uhrzeit zu beeinflussen. Das rumlaufen könnte ich ja bewerstelligen, durch verändern der Millis() das geht schon. Aber dann verstelle ich auch beim überschreiten der 12er Marke die Uhrzeit. Ich habe in der Equinox einmal den Sekunden zeiger der ja im Beleuchteten Kranz läuft durch 3 LED und der wechselt Stündlich zu einem Pendel welcher aus 5 Leds besteht und im grunde wie der LarsonScanner arbeitet. nun möchte ich egal wann ich den Pfeil für schnell vorwärts drücke das oder 5 LEDs als Lauflicht im Kranz fungieren. ich hoffe Du verstehst was ich eine.

So wenn ich alles so programmiere, dann habe ich das lauflicht bei gedrückter taste, jetzt tritt lediglich das problem auf, das ich das lauflicht bei jeder taste habe. Die Uhrzeit wird durch das Lauflicht nicht verändert, so wie ich es wollte, nur wie belege ich nur die Pfeiltaste damit.

#include <FastSPI_LED2.h>
#include <IRremote.h>
#define NUM_LEDS 5
#define DATA_PIN A4

CRGB leds[NUM_LEDS];

char time[]=__TIME__;
int stunden,minuten,sekunden;
int farbe;
int satt;
int hell;
int whiteLed;
int RECV_PIN = 11; //define input pin on Arduino
int ledpin = 13;
IRrecv irrecv(RECV_PIN);

decode_results results;

 void tickOneSecond()  // UHR laufen lassen

 {
     
    
         //Uhrzeite berechnen
  if (sekunden == 60) {sekunden=0;minuten++;}
  if (minuten == 60) {minuten=0;stunden++;}
  if (stunden == 24) {stunden=0;}
  analogWrite(ledpin,255);
 }

 void logofarbwechsel()
{
  farbe=255/stunden*3;
  satt=255;
  hell=60;
}
void setup()
{
pinMode(ledpin,OUTPUT); 
Serial.begin(9600);

FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);
for (int i=0;i < NUM_LEDS; i++) {leds[i] = CHSV(255,0,0);}

  stunden=atoi(time);
  minuten=atoi(&time[3]);
  sekunden=atoi(&time[6]);
  
  /*
 stunden = 2;  // wenn Uhr von Hand gestellt wird
 minuten = 0;
 sekunden = 0;
 */ 

irrecv.enableIRIn(); // Start the receiver
pinMode(ledpin,OUTPUT);
}

unsigned long alteSekunde;

void loop() {
int merk=results.value; //speichern des Wertes für Lauflicht
if (irrecv.decode(&results)) {
FastLED.show();  

if (results.value == 0xFF6897) //Taste 1
{
  stunden=stunden+1;
  digitalWrite(ledpin,HIGH);
leds[0] = CHSV(100,255,60);
}

if (results.value == 0xFF9867) //Taste 2
{
 stunden=stunden-1;
leds[1] = CHSV(100,255,60);
}
if (results.value == 0xFFB04F) //Taste 3
{
  minuten=minuten+1;
leds[2] = CHSV(100,255,60);
}
if (results.value == 0xFF30Cf) //Taste 4
{
  minuten=minuten-1;
leds[3] = CHSV(100,255,60);
}
if (results.value == 0xFF18E7) //Taste 5
{
  sekunden=sekunden+1;
leds[4] = CHSV(100,255,60);
}

if (results.value == 0xFF7A85) //Taste 6
{
  sekunden=sekunden-1;
}

if (results.value == 0xFF10EF) //Taste 7
   {
     logofarbwechsel();
     for (int i = 0; i < NUM_LEDS; i++){leds[i] = CHSV(farbe,satt,hell);}
   }

if (results.value == merk) //Taste 8
{
   // Move a single white led 
   for(int whiteLed = 0; whiteLed < NUM_LEDS; whiteLed = whiteLed + 1) {
      // Turn our current led on to white, then show the leds
      leds[whiteLed] = CRGB::White;

      // Show the leds (only one of which is set to white, from above)
      FastLED.show();
      delay(100);
      leds[whiteLed] = CRGB::Black;
  }
}
if (results.value == 0xFF5AA5) //Taste 9
{
  for (int i=0;i < NUM_LEDS; i++) {leds[i] = CHSV(0,0,0);}
}

/*
if (results.value == 0xFF4AB5) //Taste 0 für Aus
*/

irrecv.resume(); // Receive the next value
}

if ((stunden == 12) or (stunden == 17)){leds[0] = CHSV(255,250,60);}
if ((stunden == 13) or (stunden == 18)){leds[1] = CHSV(255,250,60);}
if ((stunden == 14) or (stunden == 19)){leds[2] = CHSV(255,250,60);}
if ((stunden == 15) or (stunden == 20)){leds[3] = CHSV(255,250,60);}
if ((stunden == 16) or (stunden == 21)){leds[4] = CHSV(255,250,60);}
if ((stunden >= 22) or (stunden <= 11)){for (int i=0;i < NUM_LEDS; i++) {leds[i] = CHSV(0,0,0);}}

if (alteSekunde==millis()/1000)  return; // selbe Sekunde, loop verlassen
     analogWrite(ledpin,LOW);          
    delay(100);
    alteSekunde=millis()/1000;
    tickOneSecond(); // Uhrzeit weiterticken lassen
    
    sekunden++; // Sekundenzähler für UHR
             
    FastLED.show();
    
   Serial.print("Uhreit: Std. ");
   Serial.print(stunden);
   Serial.print(" Min. ");
   Serial.print(minuten);
   Serial.print(" Sek. ");
   Serial.print(sekunden);
   Serial.println(" ");
}

Verstehe nicht ganz alles, was du willst, aber wenns nur darum geht, die zuletzt gedrückte Taste richtig zu erkennen und den Code für diese Taste wiederholt auszugeben:

Du hast das hier:

int merk=results.value; //speichern des Wertes für Lauflicht //gleich nach Loop start
...
if (results.value == merk) //Taste 8 // irgendwann später...

D.h. er speichert den Code der gedrückten Taste direkt in die Variable merk, führt dann das aus, was codespezifisch ausgeführt werden muss. Später fragst du ab, ob merk == der gesendete code ist (was immer wahr ist), also startet er dein Lauflicht. Wenn du die Taste nun gedrückt hälst, sendet er den Wiederholungscode, wofür du nichts programmiert hast, also läuft nur noch das Lauflicht, unabhängig, welche Taste du drückst, da alle den selben Wiederholungscode senden.

Funktionieren würds eventuell wenn du sowas in der Art machst.

  • receiver starten, Code kommt rein
  • die verschiedenen if - Abfragen starten, um Code zu erkennen.
  • in jeder if - Abfrage (results.value == merk) -> merk enthält dann den letzten gesendeten Code
  • eine dieser Abfragen fragt nach dem Code für die gewünschte Taste (FFXXXX) und ist auch wahr, wenn "merk" diesen Code enthält
    => if (results.value == 0xFFXXXX || merk == 0xFFXXXX) -> Taste führt Funktion aus, wenn der Code für diese Taste gesendet wird oder der letzte gedrückte Taste vor dem Wiederholungscode der Code dieser Taste war

hi, jürgen,

hab' den code jetzt nur überflogen, aber die equinox läuft ja nicht mit diesem code (also das schöne "vorwärtsdimmen", oder)?

weil fastspiled gemeinsam mit fernbedienung gibt großes durcheinander. die fastspiled ist vom timing her so eng, daß dann keine vernünftigen werte mehr von der fernbedienung herkommen. war auch schon thema im englischen forum.

hast Du eine remote-library, wo das problem nicht auftritt? ich wollte deswegen bei meiner equinox (so ich dann mal weitermache), einen zweiten atmel nur für die fernbedienung einbauen.

gruß stefan

Nein Stefan, das ist nur ein Code den ich mir für versuchs Zwecke geschrieben habe um die IR Fenb. aus zu probieren. Nur ich möchte da meine Equinox ja nun schon fast 2 Monate komplett verbaut und an der wand hängt, mir aber die Spielereien die ich bis her darin Programmiert habe zu wenig sind :slight_smile: noch gerne ein Lauflicht einbringen für vorführ zwecke , also wenn ich die sagen wir einmal Taste nach oben drücke sollten im Farbring sich 3 bis 5 LED`s umfärben und als Lauflicht im Uhrzeigersinn wie der LarsonScanner nicht als Knightrider sondern durchlaufen. Wenn ich Pfel runter drücke dasgleiche nur Rückwärts, wenn ich Pfeil rechts drücke soll sich das Lauflicht teilen in vier Lauflichter die gegeneinander laufen und wenn ich links drücke soll irgend was anderes ausgeführt werden, solange ich die Taste an der IR gedrückt halte. das habe ich ja auch raus mit der gedrückten Taste, nur dann ist es egal welche Taste ich drücke es beginnt immer das Lauflicht solange ich die Taste drücke. Und vor allen Dingen, dürfen die Lauflichter nicht die Uhreit beeinträchtigen, denn das ist ja nicht schwer da bräuchte ich ja nur die Ablaufzeit der Software Uhr verstellen, dann rast der Sekunden Zeiger. ich werde das noch raus bekommen, nur bei mir ist es immer so. Je länger ich auf den Code schaue und überlege des so weniger entsteht, dann muss ich immer Pausieren damit mein Kopf klar wird.

Hier mal 2 Bilder meiner Equinox
Bild 1 da habe ich eine Abdeckung aus Plexiglas gemacht und mit Backlight Folie die mit einem Delphin Motiv bedruckt wurde aufgebracht und von hinten beleuchtet, die Beleuchtung kann die Farbe ändern entweder Automatisch oder Manuel.
Bild 2 ist die Equinox in Betrieb wo der untere Schein das Pendel ist welches wie beim knightrider imer von 20 nach bis 20 vor der Vollen zeit im Sekundentakt pendelt.

malerlein:
... nur dann ist es egal welche Taste ich drücke, es beginnt immer das Lauflicht solange ich die Taste drücke.

Hat mein Vorschlag nicht funktioniert?

Nein , so bekomme ich das nicht hin, ich habe das signal jetzt auf die Pfeil taste gelegt und es geht auch jedesmal das lauflicht wenn ich drücke und die anderen Tasten machen auch ihre Funktionen ohne das , das Lauflicht an geht aber ich bekomme es nicht hin das wenn ich die Taste gedrückt halte das Lauflicht weiter läuft, ich muss jedesmal neu drücken um es zu starten. Wenn ich es soweit habe das bei dauer Druck das lauflich durch läuft, dann verstellt sich die Uhrzeit, es kommt mir vor als wenn dann die Code durcheinander kommen.

Hi Stefan

Eisebaer:
hi, jürgen,

hab' den code jetzt nur überflogen, aber die equinox läuft ja nicht mit diesem code (also das schöne "vorwärtsdimmen", oder)?

weil fastspiled gemeinsam mit fernbedienung gibt großes durcheinander. die fastspiled ist vom timing her so eng, daß dann keine vernünftigen werte mehr von der fernbedienung herkommen. war auch schon thema im englischen forum.

hast Du eine remote-library, wo das problem nicht auftritt? ich wollte deswegen bei meiner equinox (so ich dann mal weitermache), einen zweiten atmel nur für die fernbedienung einbauen.

gruß stefan

Nein ich habe die IRremote.h aber ich habe so keine Schwierigleiten bei der Equinox, ich kann die Stunden, Minuten und Sekunden stellen, also alles was mit einem Tastendruck passiert ist kein Problem. Lediglich wenn man versucht die Taste zu halten also dauerdruck das dann was läuft, dann werden in dem Seriellen Monitor alles verschiedene Codes der fernb. ausgegeben und das schlägt sich dann eben bei der Equi auf die Uhrzeit nieder, die fängt an zu springen. schade ich würde so gerne noch ein paar Hingucker mit Farbverläufe u.s.w. per Fernb. einbringen. Mal sehen ob es eventuell eine andere lib gibt die man verwenden kann womit es geht. Mir ist eben Wichtig , das alles was ich mit der fernb. ausführen möchte nicht die Uhrzeit beeinträchtigt, sonst bringt mir das nichts wenn ich nach jeder vorführung die Uhr neu stellen mu?.