Ich habe einen IR Sender der nicht funktioniert

Das hier ist die Quelle dafür.

Hier mein Programm, ein bischen geändert. Aber auch das orginale Programm macht nichts.

#include <IRremote.h>
//Pin der IR Diode am digitalen Pin 3 angeschlossen
int irSendPin = 3;
IRsend irSender;
//Message welche gesendet werden soll
char message[4] = {'4', '1', '7', '6'};
void setup() {
  //beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);
}
void loop() {
  //Das char Array durchlaufen...
  for (int i = 0; i < 4; i++) {
    //den Charakter an Position "i" entnehmen
    char sign = message[i];
    //in den ASCII Zahlenwert umwandeln
    unsigned long value = sign;
    //Ausgabe des Zeichens sowie der Zahl auf der seriellen Schnittstelle
    Serial.print("Zeichen = ");
    Serial.print(sign);
    Serial.print(" Zahl = ");
    Serial.println(value);
    //Absenden des Zahlenwertes
    irSender.sendSony(value, 12);
    //eine Pause von 25ms.
    delay(25);
  }
  //eine Pause von 1000ms.
  delay(1000);
}

Ich habe eine IR Diode mit Treiber komplett gekauft, habe aber festgestellt, dass das Ding mit pos. Impulsen arbeitet, aber die im Link empfohlene Schaltung mit Minus Impulsen arbeiet. Dachte als, ich habe meinen Fehler gefunden. Aber war nichts. ich hatte den Oszi am Pin3 und nen Widerstand 1000 Ohm gegen Plus. Aber da kommen auch keine Minus Impulse :roll_eyes:

Der Empfänger im Link funktioniert. Die Lib "IRremote.h" funktioniert auch. Hat sich jemand schon mehr damit beschäftigt, so dass er sagen kann, woran es da hängt? Also da rührt sich auf Pin.3 überhaupt nichts. Die Serial.print Ausgabe rennt, aber Pin.3 ist schweigen im Walde. Habe auch schon eine andere CPU Verwendet, andere Pins, auf Plus- wie auf MinusImpulse getesten. Da geht nichts.

Franz

Hallo Franz,
zeige doch mal einen Link deines Teils und ein Schaltbild, wie du es verdrahtet hast.

Ich sowas mal vor längerem mal ausprobiert. Der Sender war wie folgt aufgebaut:

V2 entspricht einem Pin vom Microcontroller.

Oszimäßig sah das dann so aus:

Der untere Bereich ist das Signal vom Sender (LD-274 Diode von Osram) , oben das Signal vom Empfänger (TSOP31238).

Ansonsten wie öfter mal zu empfehlen:

Vielleicht hilft das weiter.

IRremote Lib reagiert jedenfalls nicht auf eine globale Variable int irSendPin.
Hängt vielmehr am Arduino-Typ. Hast du einen atmega328p?

Mein Problem ist wie gesagt, nicht die Sende IR-Diode, sondern dass am Ausgang zur IR-Diode am UNO, Mega, Nano, NICHTS kommt. keinerlei Signal. Ich bin zur Zeit einfach nur mit dem Oszi dran. Aber ich teste mal den Coden von Wolles Elektrokiste.

Franz

Aber hast Du denn den irSendPin der IR-Lib zugewiesen, so dass diese weiss, dass sie die Daten über diesen Pin auseben muss? weder bei der Instanz-Erzeugung , noch im Setup ist davon was zu sehen. michael-x hat doch schon darauf hingewiesen, dass die IR-Remte lib NICHT auf eine Globale Variable int irSendPin reagiert.
Ich denke, Du bekommst am Ausgang kein Signal, weil die Lib nicht weiss, auf welchem Pin sie das Signal ausgeben soll.

OK, Danke, dann kann der Code ja nur Mist sein, den ich hier haben. Versteh ich nicht, warum man einen Code ins Netzt stellt, der so nie funktioniert haben kann. Aber Ok, ich schaue mir mal den Code von Wolles Elektrokiste an.

Franz

1 Like

OK, danke. Ich suche dann mal ein Beispiel das funktioniert :roll_eyes:

Na ja, beim Uno etc. sollte es schon Pin 3 sein. Die Zeile ist also eher überflüssig als völlig falsch.

Vielleicht hat die Lib ja auch eine Funktion, mit der man den Sende-Pin einstellen kann, und im Code vom netz fehlt diese zeile einfach. sei es wegen kopier-fehler oder was auch immer.

Das ist eine Annahme, die Du nicht beweisen kannst.
Punkt 1: Die iRRemote-Lib unterliegt einer ständigen Weiterentwicklung-
Punkt 2: Die Lib hat einige Funktionen gehabt, die in jüngster Zeit deprecated waren.
Punkt 3: Warum benutzt Du nicht eines derExample, die mitgeliefert werden?
Spätestens hier dürfte auffallen, das sich einiges getan hat und das die Syntax der Verwendung bestimmter Komponenten evtl. nicht mehr zu einem jahrealten Code aus dem Netz passt.

Ja.
Jedem(!) Beispiel liegt eine Pindefinition bei.

@my_xy_projekt : ich habe mir die lib selbst auch nicht aneschaut, sondern eben nur vermutet. Und habe ich eben beim anschauen des Codes von Franz54 nirgens eine Zuweisung des irSendPin zur lib, resp, der vom Code ereugten Instanz gesehen. Und das kam mir etwas seltsam vor.

Die Dok hat extra ein Kapitel, was man tun soll, wenn alte Beispiele/Tutorials nicht mehr funktionieren.

( Sich die Version 2.x der lib besorgen ) halte ich aber für Mist.

Ich habe mal folgendes als Beispiel:

Senderseite. "Sendepin" ist D3.

#include <Arduino.h>

#include "PinDefinitionsAndMore.h"   //Define macros for input and output pin etc.
#include <IRremote.hpp>

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  Serial.println(F("START " __FILE__ " from " __DATE__ "\r\nUsing library version " VERSION_IRREMOTE));
  IrSender.begin();   // Start with IR_SEND_PIN as send pin and if NO_LED_FEEDBACK_CODE is NOT defined, enable feedback
                      // LED at default feedback LED pin
  Serial.print(F("Ready to send IR signals at pin "));
  Serial.println(IR_SEND_PIN);
}

uint16_t sAddress {0x0102};
uint8_t sData[] {'T', 'e', 's', 't', '\0'};
uint8_t idx {0};
uint8_t sRepeats {0};

void loop() {
  idx = 0;
  do {
    Serial.print(static_cast<char>(sData[idx]));
    IrSender.sendSony(sAddress, sData[idx], sRepeats);
    // delay must be greater than 4,5 ms (nec), 2.5ms (sony) (RECORD_GAP_MICROS), 
    // otherwise the receiver sees it as one long signal
    delay(65); 
  } while(sData[++idx]);
  IrSender.sendSony(sAddress,0, sRepeats);
  Serial.println("");
  delay(3000);
}

Empfängerseite. "Empängerpin" ist D2:

#include <Arduino.h>
#define DECODE_SONY

#if !defined(RAW_BUFFER_LENGTH)
// Maximum length of raw duration buffer. Must be even. 100 supports up to 48 bit codings inclusive 1 start and
// 1 stop bit.
#define RAW_BUFFER_LENGTH 100                                                                                              \
// #define RAW_BUFFER_LENGTH  112    // MagiQuest requires 112 bytes.
#endif

#define EXCLUDE_UNIVERSAL_PROTOCOLS   // Saves up to 1000 bytes program space.
#define EXCLUDE_EXOTIC_PROTOCOLS      // saves around 650 bytes program space if all other protocols are active
// #define _IR_MEASURE_TIMING
// #define DEBUG // Activate this for lots of lovely debug output from the decoders.
// #define INFO // To see valuable informations from universal decoder for pulse width or pulse distance protocols

#include "PinDefinitionsAndMore.h"
#include <IRremote.hpp>

// #if defined(APPLICATION_PIN)
// #define DEBUG_BUTTON_PIN APPLICATION_PIN   // if low, print timing for each received data set
// #else
// #define DEBUG_BUTTON_PIN 6
// #endif

void setup() {
  Serial.begin(115200);
#if defined(__AVR_ATmega32U4__) || defined(SERIAL_PORT_USBVIRTUAL) || defined(SERIAL_USB) || defined(ARDUINO_attiny3217)
  delay(1000);
#endif
  Serial.println(F("START " __FILE__ " from " __DATE__ "\r\nUsing library version " VERSION_IRREMOTE));
  Serial.println(F("Enabling IRin..."));
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  Serial.print(F("Ready to receive IR signals of protocols: "));
  printActiveIRProtocols(&Serial);
  Serial.print(F("at pin "));
  Serial.println(IR_RECEIVE_PIN);
}

void loop() {

  if (IrReceiver.decode()) {
    /*
    if (IrReceiver.decodedIRData.protocol == UNKNOWN) {
      // We have an unknown protocol here, print more info
      IrReceiver.printIRResultRawFormatted(&Serial, true);
    }
    */
    if (IrReceiver.decodedIRData.protocol == SONY) {
      //IrReceiver.printIRResultShort(&Serial);
      if (IrReceiver.decodedIRData.command == '\0') {
        Serial.println("");
      } else {
        Serial.print(static_cast<char>(IrReceiver.decodedIRData.command));
      }
    }
    IrReceiver.resume();
  }
}

Habe das mit zwei Nano Clones ausprobiert. Diode, Senderschaltung und IR-Empfänger entsprechen den Angaben in meinem ersten Posting #3. Es werden die Zeichen "Test" per IR-Diode übertragen und beim Receiver auf der Konsole ausgegeben.

Verwendet wurde IRremote 4.0.0. Es sollte aber auch noch mit einer Version ab 3.1.1 funktionieren.

Was den umgang mit dem "Sendepin" betrifft: GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple protocols

Soll die PIN-Nummer per #define IR_SEND_PIN geändert werden, muss das passieren, BEVOR die Headerdatei IRremote.hpp inkludiert wird.

Franz,
Dein Code sollte mit einer minimalen Änderung zum Laufen zu bringen sein (Quelle: Doku):

#include <IRremote.h>
//Pin der IR Diode am digitalen Pin 3 angeschlossen
const byte irSendPin = 3;
IRsend irSender;
//Message welche gesendet werden soll
char message[4] = {'4', '1', '7', '6'};
void setup() {
  //beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);
  irSender.begin(irSendPin);  /// <--- Pin hier festlegen.
}

Danke dir. Das hat super gepasst. Jetzt gibt das Programm wunderbar den IR-Code aus.

Gerettet :stuck_out_tongue_winking_eye:

Hier ist mal der einfachste Grundcode. Ich wollte ja was mit wenigen Zeilen, zum leicht mit einbauen in einem Code.

#include <IRremote.h>
//Pin der IR Diode am digitalen Pin 3 angeschlossen
const byte irSendPin = 3;
IRsend irSender;
//Message welche gesendet werden soll
void setup() {
  //beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(115200);
  irSender.begin(irSendPin);  /// <--- Pin hier festlegen.
}
void loop() {

  //Absenden des Code 4176 für Volumen +
  irSender.sendSony(4176, 16);
  //eine Pause von 25ms.
  delay(25);
  //---------------------------------------------
  //eine Pause von 3000ms.
  delay(3000);

  //Absenden des Code 6225 für Volumen -
  irSender.sendSony(6225, 16);
  //eine Pause von 25ms.
  delay(25);
  //---------------------------------------------
  //eine Pause von 3000ms.
  delay(3000);
}

Trotz allem wäre es evtl. sinnvoll eine aktuelle Version der Library zu verwenden.

An welche Lib. denkst du da?

Die IRremote 4.0.0

Gruß Bernhard

Habe ich oben als Link zum example hinterlegt...