IR-signal entprellen?

Ok hallo…:wink:

Ich habe wieder eine Frage zum Thema Ir-receivern. Um eine Lebens-Anzeige für mein Laser-Tag-System zu bauen habe ich einen Ir-Receiver und ein lcd-display verwendet auf welchem ich einen counter mit der Zahl 3 herunterzählen lasse…Das Problem ist, das der counter schon heruntergezählt hat bis ich es überhaupt bemerkt habe! Taster entprellt man in diesem Fall ja, aber meineFrage ist, wie man dies bei einem IR-Signal macht???

Nur mechanische Schalter/Taster prellen (Kontakte hüpfen einige male beim Öffen bzw Schließen). Darum müssen nur diese entprellt werden. Grüeß Uwe

Ja aber ein IR_Signal wird statdessen eben sehr oft gesendet..Also das gleiche Prinzip ;) Wie führe ich also eine ÄHNLICHE Aktion wie beim entprellen aus??:)

Du hast doch schon einen anderen Thread wegen deinem Laser-Tag offen. Dort steht doch bereits eine Lösung.

Alles für den normalo hier ein wenig unschlüssg ?! Laser-Tag-System mit IR-Receiver auf LCD-Display ? Was prellt eigentlich vermeintlicherweise wo ?

Klugscheiss:

Es gibt LCDs, Liquid Crystal Displays und LC-Displays.

LCD-Displays gibt es nicht.

Gruß Chris

Nicht umsonst habe ich ein Fragezeichen nach "entprellen?" gesetzt..... Ich glaube ihr versteht mich nicht: Es geht um den counter auf dem lcd! Dieser soll auch wenn man das Signal 2 sek. sendet nur 1 nach unten zählen! Bitte seid nicht immer so kritisch verdammt!Ich habe mir mit 15 ohne jegliche elektro-kurse,HTBLA oder sonstige Hilfe ein fast funktionierendes Laser-tag gebaut also bitte! :relaxed:

Wir sehen hier aber immer noch keinen Sketch. Entprellen ist nicht notwendig. Mach es doch einfach wie folgt

sschultewolter: So nicht ;)

Bitte auch den Code mitliefer in [*code] hier der Sketch rein */code

Möglichkeit wäre, das Signal am Taster erst wieder nach x ms wieder auf 0 zu setzen. Aber bitte gebe uns noch ein paar Infos und deinen bisherigen Sketch.

unsigned long currentMillis = millis();
static unsigned long previousMillis;
// Zeit, wie lange nach einem Treffer vergangen sein muss
unsigned int wait = 1000; 
static int hits;

if(irSignal == HIGH) 
{
  if(currentMillis - previousMillis > wait)
  {
    hits++;
    previousMillis = millis();
  }
}
#include <LiquidCrystal.h>
#include <IRremote.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int RECV_PIN = 11;
int counter = 3;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); 
   
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
    irrecv.resume(); 
  }
  switch(results.value){

//sun
  case 0x1CE38877:          //wenn diese Signal empfangen wird:
  
  counter1--;               //counter nach unten zählen
  lcd.setCursor(1,0);       //Cursor in Zeile 1 setzen
  lcd.print(counter1);      //counter anzeigen
  
  break;
  }  
}
#include <LiquidCrystal.h>
#include <IRremote.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int RECV_PIN = 11;
int counter = 3;
IRrecv irrecv(RECV_PIN);
decode_results results;

unsigned long previousMillis;
unsigned int wait = 1000;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); 
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
    irrecv.resume(); 
  }

  if(results.value = 0x1CE38877) {  // 0x1CE38877?
    if(millis() - previousMillis > wait) {
      counter--;
      lcd.setCursor(1,0);
      lcd.print(counter1);
      previousMillis = millis();
    }
  }
}

Chris72622: Klugscheiss:

Es gibt LCDs, Liquid Crystal Displays und LC-Displays.

LCD-Displays gibt es nicht.

Gruß Chris

Hier darf's auch Liquide Cristal Display Displays geben. ;) ;) ;)

"Drkazst mi net schunsch gea i fernsehschaugn". (Ärgert mich nicht, sonst verlagere ich meine heutige Abenbeschäftigung vor das Fernsehgerät).

Uwe

invisible09: Nicht umsonst habe ich ein Fragezeichen nach "entprellen?" gesetzt..... Ich glaube ihr versteht mich nicht: Es geht um den counter auf dem lcd! Dieser soll auch wenn man das Signal 2 sek. sendet nur 1 nach unten zählen! Bitte seid nicht immer so kritisch verdammt!Ich habe mir mit 15 ohne jegliche elektro-kurse,HTBLA oder sonstige Hilfe ein fast funktionierendes Laser-tag gebaut also bitte! :relaxed:

Dann sag das doch. Entprellen ist klar definiert als kurzzeitges "hüpfen" eines mechanischen Komtaktes. Das was Du brauchst ist ein einmaliges Zählen eines länger dauernden Ereignisses.

Wieso sendest Du den IR Kode mehrmals?

Grüße Uwe

ich denke, sein Problem ist, dass der Laser gepulst ist, und der IR-Sensor demnach auch pulse abgibt.

Du willst, wenn ich das richtig verstehe, Treffer zählen, nicht Pulse, wobei ein Treffer ja aus einer beliebig langen Pulsfolge bestehen kann.

Nun kommt es darauf an, was du willst: Soll ein Dauertreffer (du stehst mehrere Sekunden lang im Focus der Laserwaffe) als 1 Treffer gewertet werden? Oder soll bei Dauerfeuer pro Sekunde ein Leben runtergezählt werden?

Im ersten Fall mußt du beim ersten Empfangenen Impuls gotHit= true setzen, und dann prüfen, ob weitere Pulse in der richtigen Frequenz kommen. Erst wenn keine Pulse mehr kommen, dann gotHit=false und du bist wieder bereit für den nächsten Treffer.

Im zweiten Fall, reicht es, beim ersten empfangenen Impuls einen Timer zu starten, bei Ablauf des Timers einfach wieder auf Pulse zu warten.

Wobei ich auch eine gewisse Mindest-treffer-zeit definieren würde, damit nicht verirrtes Streulicht aus Reflexionen jedes mal einen Treffen auslöst.

MIt welcher Frequenz sind die Laserwaffen den gepulst?

Ok danke. Also es soll pro Sekunde(bei Dauerfeuer) ein Leben hinuntergezählt werden!Aber wie setze ich es in einem Sketch um einen Timer zu starten wenn(0x1CE38877) empfangen wird und dieser sich nach einer Sekunde wieder beendet und in dieser Zeit auch noch ein counter herunterzählt?

in etwa so:

#define blasttime 1000
unsigned long last_hit = 0;
int live = 3;

void loop(){  
  IR_Buffer = Read_IR();                                  // bitte passende Funktion einsetzen
  if (millis() > last_hit + blasttime){
    if (IR_Buffer == 0x1CE38877){
      last_hit = millis();
      live--;
    }
  }  
  if (live < 1){
    tilt();
  }  
} // end loop

das ist jetzt nicht getestet, nur so Pseudocode aus dem Stegreif.
Funktionsweise:
in der Loop wird dein IR empfänger ausgelesen, dafür hast du ja bestimmt eine Funktion.
Dann wird geprüft, ob in den letzten 1000ms (blasttime) bereits ein Trefer erfolgte.
Falls ja, wird einfach weitergemacht, falls nein, wird geprüft, ob in IR_Buffer ein gültiger Code steht.
ja: Treffer. Lebenszähler wird decrementiert (live–) und die Trefferzeit gespeichert.

So oder so ähnlich würde ich das machen, ohne nähere Kenntnis deines sketches.

Sieh an sieh an! Ich habe es jetzt geschafft!:) Durch den letzten Beitrag und auch vorherige Tipps habe ich es jetzt geschafft den counter perfekt auszugeben!! Danke ;)

Jetzt ist aber ein weiteres Problem aufgetreten!!::

Wenn ich einmal ein IR.Signal gesendet habe kann ich keines mehr empfangen!! Was könnte das Problem sein?

Nur ein Bsp. wie es in meinem großen sketch aufgebaut ist:
Das man es nicht gleichzeitig ausführen kann ist mir klar aber wieso nicht nacheinander??

#include <IRremote.h>
const int RECV_PIN = 22;
IRrecv irrecv(RECV_PIN);
decode_results results;
int inputPin = 8;
int val = 0;
class LaserTag {
  enum {
    CMD_LEN = 32,
    SHOOT   = 0x538BC81
  };
  
  IRsend tag;
  
  void send_command(const long command) {
    tag.sendNEC(command, CMD_LEN);
  }
  public:
  
  void shoot() { send_command(SHOOT); }
};

LaserTag laser_tag;
const unsigned int BAUD_RATE = 9600;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  irrecv.blink13(true),
  Serial.begin(BAUD_RATE);
  pinMode(inputPin, INPUT);
}

void loop() {
  val = digitalRead(inputPin);  {
  if (val == LOW) {
    laser_tag.shoot();

  }
}
  if (irrecv.decode(&results)) {
    if (results.decode_type == NEC) {
      Serial.print("NEC: ");
    } else if (results.decode_type == SONY) {
      Serial.print("SONY: ");
    } else if (results.decode_type == RC5) {
      Serial.print("RC5: ");
    } else if (results.decode_type == RC6) {
      Serial.print("RC6: ");
    } else if (results.decode_type == UNKNOWN) {
      Serial.print("UNKNOWN: ");
    }
    Serial.println(results.value, HEX);
    irrecv.resume(); 
  }
}