Mit Arduino nano und IR Stereoanlage steuern

Guten Abend leute,
bräuchte Hilfe bei meinem Projekt, wobei ich mit Hilfe eines arduino nanos und einer IR-Diode meine Stereoanlage steuern will. Ich will das Signal zum an/ausschalten der Stereoanlage senden, wenn es eine Signaländerung an Port 6 gibt, da ich dort einen schalter positionieren will, den man drückt und auf High bleibt oder auf LOW bleibt, und wenn dass das Signal von an zu aus wechselt oder von aus zu an soll es einmal das signal senden, nicht die ganze Zeit. Wenn ich den Code kompilieren will, dann kommt zwar keine Fehlermeldung, aber wenn ich ein Signal an Port 6 anliegen habe und es sich stetig ändert, passiert trotzdem nichts. Habe aber alles richtig angeschlossen.Hier mein Code:

# define stereo 6  // nehmen wir mal an, Pin 6


boolean switchstereoChanged() {
  static int oldState = LOW;  // oder auch HIGH, je nachdem

  int currentState = digitalRead(stereo);
  if(currentState == oldState) //wenn low dann= low
     return false;
  oldState = currentState;
  return true;
}
#include <IRremote.h>
IRsend irsend;

void setup() 
{ 

}

void loop() 
{
  if (switchstereoChanged()) {
     unsigned int  rawData[99] = {3350,1600, 400,450, 400,450, 350,1300, 400,450, 350,1300, 400,400, 400,1300, 350,450, 400,450, 400,1250, 400,450, 400,400, 400,1300, 350,1300, 400,450, 350,450, 400,450, 350,450, 400,450, 350,500, 350,1300, 400,400, 400,1300, 350,450, 400,1300, 350,450, 400,450, 350,450, 400,1300, 350,1300, 400,450, 350,450, 400,450, 400,400, 400,450, 400,450, 350,450, 350,500, 400,1250, 400,450, 400,1250, 400,450, 350,450, 350,500, 400,450, 350,1300, 350,450, 400,450, 400};  // NEC 4B36D32C
 irsend.sendRaw(rawData, sizeof(rawData) / sizeof(rawData[0]), 38);
  
  }
}

Wäre schön wenn mir jemand schnell antworten könnt.
Wünsche euch noch einen schönen Abend :wink:

Gruß

Lukas

Setze Deinen Sketch bitte in Codetags (</>-Button oben links im Forumseditor), damit er von allen besser gelesen werden kann.
Hänge Dir doch serielle Ausgaben rein, damit Du siehst, was Dein Sketch macht.

Gruß Tommy

Hallo,

Das hast Du schlecht zusammen kopiert wenn ich das mal so sagen darf.

  1. im set up Breich must Du dem Ding noch sagen das der pin6 ein Eingang sein soll

  2. Du hast zwar den pin 6 definiert fragst Ihn aber nirgends ab

  3. beim senden sendest Du das gesamte Array glaube ich, ich weiss nicht was irsend.sendRaw() an parameter braucht. Das gesamte Array kommt mir seltsam vor. Und das wird auch noch durch was geteilt ??? :wink:

  4. Du erst mal rausbekommen mit welchen IR code Dein Reciver aus und eingeschaltet werden will.

Dazu würde ich einen IR Empfänger bauen und den Code der passenden Fernbedienung ermitteln, dabei siehst Du dann auch was auf dem Monitor.

Heinz

Rentner:
3. beim senden sendest Du das gesamte Array glaube ich, ich weiss nicht was irsend.sendRaw() an parameter braucht. Das gesamte Array kommt mir seltsam vor. Und das wird auch noch durch was geteilt ??? :wink:

Dann solltest Du in die Lib schauen.

Das Array sind anscheinend die Werte, die den Schaltbefehl auslösen (sollen).
sizeof(rawData) / sizeof(rawData[0] ist die Anzahl der Elemente, wenn das Array richtig dimensioniert ist. (Also 99)

Gruß Tommy

Hallo Heinz,

Den Code für meine Fernbedienung habe ich schon ausgelesen und hier eingesetzt, kann ihn mithilfe eines anderen Sketches ausführen und da klappt alles, geht an und auch wieder aus.
Und was müsste ich denn hinschreiben um den Port 6 abzufragen?

Lukas

Hallo Tommy,
Der Sendecode und so passt alles, bloß sendets ihn nicht und das ist mein Problem… :confused:
Habe das schon mit den Beispielsketchen von der library IRremote ausprobiert, da konnte ich erfolgreich den code senden.

Lukas

Dann nimm den funktionierenden Beispielsketch als Grundlage und baue auf diesem auf, dann hast Du schon ein funktionierendes Grundgerüst.
Noch einen Tipp: Schreibe Dir an wichtigen Stellen Ausgaben auf den seriellen Monitor, dann siehst Du, was Dein Programm macht.

Gruß Tommy

Hallo Tommy, ich habe den sende scatch schon reingeschrieben, nur das wann es senden soll fehlt noch/muss ich ändern. Das ist der Orginal Scatch:

#include <IRremote.h>

//Pin 3 bei einem UNO
//Pin 9 bei einem MEGA2560
IRsend irsend;

void setup(){

}

void loop(){
unsigned int rawData[67] = {8850,4450, 550,550, 550,1650, 550,600, 500,600, 500,1650, 550,600, 500,1700, 500,1700, 550,600, 500,600, 500,1650, 550,1650, 600,550, 550,1650, 500,1700, 550,600, 500,1650, 550,1650, 550,600, 550,1650, 550,550, 550,550, 550,1650, 550,1650, 550,600, 500,600, 550,1650, 550,550, 550,1650, 550,1650, 550,600, 500,600, 500}; // NEC 4B36D32C
irsend.sendRaw(rawData, sizeof(rawData) / sizeof(rawData[0]), 38);
delay(2000);
}

Lukas

Ich glaube nicht, dass der Originalsketch ein leeres Setup hat. Gib uns doch mal einen Link zum Originalsketch.
Außerdem denke bitte an die Codetags.

Gruß Tommy

Oh ja sry wegen den codetags

Ok, der Pin 3 ist in der Lib vorgegeben. Davon war ich nicht ausgegangen.

Der Code aus #7 funktioniert?

Gruß Tommy

Hi Tommy,
Ja da funktioniert alles

Gruß Lukas

Gut. Wie hast Du denn den Taster angeschlossen, mit dem Du das Senden auslösen willst?

Gruß Tommy

Hi Tommy,
also das Projekt hier ist eigentlich nur ein Unterprojekt, ich will nämlich mit meiner alexa über esp 8266 meine Stereoanlage an und ausschalten, und dieser ist der eigentliche Schalter, wenn man “alexa stereoanlage an” sagt schaltet ein Port auf dem esp 8266 auf high und bleibt high bis man"Alexa stereoanlage aus" sagt, aber das ist eine andere sache. Ich habe aber um das ganze zu testen der code funktioniert erstmal einen Arduino uno mit einem output signal an den Port 6 angeschlossen.

Lukas

Du brauchst aber einen Input, wenn ein Taster etwas schalten soll.

int currentState = digitalRead(stereo);

Dann musst Du hier auch einen Taster angeschlossen haben. Da war meine Frage: Wie ist der angeschlossen?

Gruß Tommy

Hi Tommy,
Also ich habe das kabel welches der Schalter sein soll an port 6 angeschlossen und hab dieses dann immer rausgezogen und wieder hinein gesteckt, so hatte ich meinen schalter haha :smiley:
Und stereo ist ja Input port 6 welcher das Auslöse-signal auslesen soll.

Gruß Lukas

Wohin geht denn das Schalterkabel von Pin 6? Nach GND oder nach 5V?

Gruß Tommy

Zu 5V natürlich

Gruß Lukas

Dann schaffen wir mal definierte Verhältnisse:

boolean switchstereoChanged() {
  static int oldState = HIGH;  // oder auch HIGH, je nachdem

  int currentState = digitalRead(stereo);
  if(currentState == oldState) //wenn low dann= low
     return false;
  oldState = currentState;
  Serial.print("Status changed");
  Serial.println(currentState);
  return true;
}
#include <IRremote.h>
IRsend irsend;

void setup()
{
   pinMode(stereo,INPUT_PULLUP); // internen Pullup anschalten - unbetätigt auf HIGH
   Serial.begin(9600);
}

Den “Schalter” musst Du nach GND stecken/schalten, da er im Ruhezustand jetzt auf HIGH steht. Das zieht weniger Störungen rein.

Im Seriellen Monitor der IDE kannst Du jetzt erst mal erkennen, wann sich der Status geändert hat.
Funktioniert das?

Gruß Tommy

Hi

Da der Arduino nur PullUP-Widerstände besitzt und ein offener Pin 'böse' ist, werden zumeist die Taster, natürlich, nach GND geschaltet.

Da Du den Pin aber nicht konfigurierst, könnte Dieser so funktionieren, wie Du Dir Das wünscht.

Ein/zwei Serial.print in Deinem Code könnten darüber Auskunft geben.

MfG