Arduino also AV-Reciver Interface

  • So hab mal wieder gebastelt bzw programmiert. Ich habe für meinen Yamaha RX-A830 AV-Reciver (7.1 Verstärker mit Hdmi, Radio usw) ein kleines Gaget geplant. Da der Reciver so eine schöne RS232 Schnittstelle hat die man ja nutzen könnte hab ich mich mal im Internet schlau gemacht. Gar nicht so einfach die Steuerbefehle zu finden.
    Also was kann man mit der Schnittstelle anfangen? ALLES!
    Einstellungen direckt vornehmen, Quellenwahl, Lautstärke direckt anwählen, lauter/leiser Zohne2 usw.

    Also was brauche ich? Da meine Freundin so auf Energiespaaren achtet und ich nie Bock habe die Stecker dauernd rein und raus zu stecken muss das alles automatisch gehen.

    Des weiteren sind in der Küche Lautsprecher die über die Zohne2 angesteuert werden. Dummerweise ist da eine Wand zwischen Küche und und Verstärker. Und wer nimmt die Fernbedienung mit in die Küche?

    Also was wurde vorbereitet? Vom Verstärker aus gehen je 18m 2X 2x4mm² cu Lautsprecherkabel und 1X 2x0,5mm² Klingeldraht.
    In der Küche kommt also eine Kleine Box mit 8 Tastern und Widerständen. Diese Schaltung erzeugt in der Steuerbox am Verstärker eine Spannung zwischen 0V und 4,5V. Mit diesen Spannungen erzeuge ich verschiedene serielle Befehle wie Zohne2 lauter/leiser, Mute, verschiedene Quellen wie Radio CD usw.

    Der Arduino muss also zwei Dinge bewerkstelligen. 1. Aus einer Spannung Befehle erzeugen um sie an den Verstärker zu senden und 2. um Befehle entgegen zu nehmen. Mit diesen Befehlen steuert er dann eine Steckdosenleiste mit Relais. So schaltet er Geräte die CD Player, Bray Player usw ein und aus.
    Damit man nicht versehentlich den Film durch abschalten des Bray Players unterbricht sind alle Relais momentan 30 Sekunden abfallverzögert.

    Die Hardware wird denächst gebastelt.

    Der Quellcode: Ich habs versucht verständlich zu schreiben.


    /*
    #############################################################################################
    #Arduinointerface zwischen Yamaha RX-A830 AV Reciver. #
    #Steuert über Relais externe Peripherie Eein und Aus z.B. CD Player, Fehrnseher usw. #
    #Die Relais werden Zeitverzögert ausgeschaltet um versehentliches Abschalten zu verhindern. #
    #Über Zweidrahttechnik kann z.B. die zweite Zohne gesteuert werden. #
    #############################################################################################
    */
    //Festlegung der Adressen der Ein- und Ausgangspins
    const int Relais_1 = 13;
    const int Relais_2 = 12;
    const int Relais_3 = 11;
    const int Relais_4 = 10;
    const int Steuerung = A0;
    //Deklarieren der Merker und Speicher
    int Spannungsbefehl = 0;
    int Merker_R1 = 0;
    int Merker_R2 = 0;
    int Merker_R3 = 0;
    int Merker_R4 = 0;
    String inData;
    unsigned long Austimer_1 = 0;
    unsigned long Austimer_2 = 0;
    unsigned long Austimer_3 = 0;
    unsigned long Austimer_4 = 0;
    const long warten = 30000;

    //---------------------------------------------------------
    void setup()
    {
    Serial.begin(9600); //Baudrate festlegen
    pinMode(Relais_1, OUTPUT); //Als Ausgang festlegen
    pinMode(Relais_2, OUTPUT);
    pinMode(Relais_3, OUTPUT);
    pinMode(Relais_4, OUTPUT);
    //pinMode(Relais_5, OUTPUT); //Weitere Relais möglich
    }
    //---------------------------------------------------------

    void loop()
    {
    Aus(); //Unterprogramm Ausgänge abschalten
    while (Serial.available() > 0) //Wärend Serielle Daten da sind mache....
    {
    char recieved = Serial.read();
    inData += recieved;

    // Process message when new line character is recieved
    if (recieved == '\n')
    {
    if(inData == "@MAIN:INP=HDMI1\r\n") //Blueray // Wenn Daten "@MAIN:INP=HDMI1\r\n" entspechen setze....
    {
    Merker_R1 = 1; //Merker setzen
    Merker_R2 = 0;
    Merker_R3 = 0;
    Merker_R4 = 0;
    Ein(); //Unterprogramm Ausgänge einschalten
    Austimer_1 = millis(); // Austimer_1 = Programmzeit. Wird benötigt um die Zeitverzögerung zu bewerkstelligen.
    }

    if(inData == "@MAIN:INP=AV1\r\n") //TV
    {
    Merker_R1 = 0;
    Merker_R2 = 1;
    Merker_R3 = 0;
    Merker_R4 = 0;
    Ein();
    Austimer_2 = millis();
    }

    if(inData == "@MAIN:INP=AUDIO1\r\n" || inData == "@MAIN:INP=AV2\r\n") //I-Radio
    {
    Merker_R1 = 0;
    Merker_R2 = 0;
    Merker_R3 = 1;
    Merker_R4 = 0;
    Ein();
    Austimer_3 = millis();
    }

    if (inData == "@MAIN:INP=HDMI2\r\n" || //Wenn das oder das oder das oder oder oder Ihr wisst schon :)
    inData == "@MAIN:INP=HDMI3\r\n" ||
    inData == "@MAIN:INP=HDMI4\r\n" ||
    inData == "@MAIN:INP=HDMI5\r\n" ||
    inData == "@MAIN:INP=HDMI6\r\n" ||
    inData == "@MAIN:INP=HDMI7\r\n" ||
    inData == "@MAIN:INP=AV3\r\n" ||
    inData == "@MAIN:INP=AV4\r\n" ||
    inData == "@MAIN:INP=AV5\r\n" ||
    inData == "@MAIN:INP=AV6\r\n" ||
    inData == "@MAIN:INP=AUDIO2\r\n" ||
    inData == "@MAIN:INP=V-AUX\r\n" ||
    inData == "@MAIN:INP=TUNER\r\n" ||
    inData == "@MAIN:INP=USB\r\n" ||
    inData == "@MAIN:INP=NET RADIO\r\n" ||
    inData == "@MAIN:INP=Napster\r\n" ||
    inData == "@MAIN:INP=AV3\r\n" ||
    inData == "@MAIN:INP=Spotify\r\n" ||
    inData == "@MAIN:INP=AirPlay\r\n" ||
    inData == "@MAIN:INP=Server\r\n" ||
    inData == "@MAIN:INP=PHONO\r\n")
    {
    Merker_R1 = 0; //Merker rücksetzen
    Merker_R2 = 0;
    Merker_R3 = 0;
    Merker_R4 = 0;
    Ein();
    Austimer_4 = millis();
    }

    inData = ""; // Clear recieved buffer
    }
    }
    //-----------------------------------------------------------------
    Spannungsbefehl = analogRead(Steuerung);

    // if(Spannungsbefehl <= 102)
    // { }

    if(Spannungsbefehl >102 && Spannungsbefehl <204)
    {
    Serial.println("@ZONE2:PWR=On/Standby2");
    }

    if(Spannungsbefehl >204 && Spannungsbefehl <306)
    {
    Serial.println("@ZONE2:VOL=Down");
    }

    if(Spannungsbefehl >306 && Spannungsbefehl <408)
    {
    Serial.println("@ZONE2:VOL=Up");
    }

    if(Spannungsbefehl >408 && Spannungsbefehl <510)
    {
    Serial.println("@ZONE2:INP=TUNER");
    }

    if(Spannungsbefehl >510 && Spannungsbefehl <612)
    {
    Serial.println("@ZONE2:INP=AUDIO1"); //CD
    }

    if(Spannungsbefehl >612 && Spannungsbefehl <714)
    {
    Serial.println("@ZONE2:MUTE=On/Off");
    Serial.println("@MAIN:MUTE=On/Off");
    }

    if(Spannungsbefehl >714 && Spannungsbefehl <816)
    {
    Serial.println("ZONE2:PLAYBACK=Skip Rev");
    }

    if(Spannungsbefehl >816 && Spannungsbefehl <918)
    {
    Serial.println("@ZONE2:PLAYBACK=Skip Fwd");
    }

    // if(Spannungsbefehl >918 && <1024)
    // {}

    }
    //---------------------------------------------------------

    void Ein()
    {
    if(Merker_R1 == 1)
    {
    digitalWrite(Relais_1,HIGH);
    }

    if(Merker_R2 == 1)
    {
    digitalWrite(Relais_2,HIGH);
    }

    if(Merker_R3 == 1)
    {
    digitalWrite(Relais_3,HIGH);
    }

    if(Merker_R4 == 1)
    {
    digitalWrite(Relais_4,HIGH);
    }
    }
    //---------------------------------------------------------

    void Aus()
    {
    unsigned long currentMillis = millis();
    if((Merker_R1 == 0) && (currentMillis - Austimer_1 >= warten))
    {
    digitalWrite(Relais_1, LOW);
    }

    if((Merker_R2 == 0) && (currentMillis - Austimer_2 >= warten))
    {
    digitalWrite(Relais_2, LOW);
    }

    if((Merker_R3 == 0) && (currentMillis - Austimer_3 >= warten))
    {
    digitalWrite(Relais_3, LOW);
    }

    if((Merker_R4 == 0) && (currentMillis - Austimer_4 >= warten))
    {
    digitalWrite(Relais_4, LOW);
    }

    }

    Erfahrungen sind was sehr nützliches, leider macht man sie erst kurz nachdem man sie gebraucht hätte...