Ankündigung

Einklappen
Keine Ankündigung bisher.

Klimaanlage über Arduino steuern

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Klimaanlage über Arduino steuern

    Ich gebe mal wieder gesammeltes Wissen bei und kopiere einen Beitrag von mir hierhin:

    Ich muss ja irgendwie sehen dass ich mein Wärmepumpenprojekt in irgendeiner Form gesteuert bekomme. Es handelt sich um eine LG P24EL mit 7kW Kühlen und Heizen

    Nachdem der Motordummy per Arduino fertig, aber noch nicht getestet ist, habe ich mich heute mal daran gegeben die Kiste irgendwie per Arduino fernsteuern zu können.

    Viel gelesen (u.a. hier: https://homematic-forum.de/forum/viewtopic.php?t=50251)
    Hier konnte ich doch die Wesentlichen Bestandteile zusammenstecken:

    Kurzum:
    Die Klimakisten, wo auf der Fernbedienung die Anzeigen für dies und jenes sind, versenden pro Tastendruck einen (!) kompletten Datensatz mit den Einstellungen, die auf dem Display angezeigt sind. Das ist sehr interessant zu wissen, da ich meiner Innengeräteelektronik die Stellmotoren sowie die Ionizer gemopst habe - wird er in der FB nicht angezeigt, bleibt seine Funktion weg und generiert keine Fehlermeldung.

    Nur wie kommt man nun an die Datenpaket?

    Viel gefunden habe ich nicht und das was ich fand verstand ich nicht wirklich.

    Also musste eine andere Löung her:

    Ich habe mir auf dem Steckbrett eine IR Empfänger und Sender aufgebaut und an den Arduino angesteckt:

    Mit diesem Empfängerprogramm kann ich den Datensatz empfangen und als sogenannte RAW Datei anzeigen lassen:

    Code:
    /*
    Erfassung langer IR-Datenpakete, zb von Klimaanlagenfernbedienungen, Ausgabe als RAW Datensatz
    
    ACHTUNG: Diese werden abwechselnd als positive und negative Werte dargestellt,
    zum Senden muss nachher aber alles positiv sein, also alle Minuse rauslöschen.
    
    Board Arduino Nano
    old Bootloader
    Port USB Serial 410 oder 620
    Connections:
    IR Receiver      Arduino
    V+          ->  +5v
    GND          ->  GND
    Signal Out   ->  Digital Pin 2
    (If using a 3V Arduino, you may connect V+ to +3V)
    */
    
    #define LEDPIN 13
    //you may increase this value on Arduinos with greater than 2k SRAM
    #define maxLen 800
    #define rxPinIR 2  // Nur Pin 2 & 3 können Interrupts lesen. ! Pin 3 ist im anderen Programm der Sender
    
    volatile  unsigned int irBuffer[maxLen]; //stores timings - volatile because changed by ISR
    volatile unsigned int x = 0; //Pointer thru irBuffer - volatile because changed by ISR
    
    void setup() {
      Serial.begin(9600); //change BAUD rate as required
      attachInterrupt(digitalPinToInterrupt(rxPinIR), rxIR_Interrupt_Handler, CHANGE);//set up ISR for receiving IR signal nur auf D2/3
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    
      Serial.println(F("Press the button on the remote now - once only"));
      delay(5000); // pause 5 secs
      if (x) { //if a signal is captured
        digitalWrite(LEDPIN, HIGH);//visual indicator that signal received
        Serial.println();
        Serial.print(F("Raw: (")); //dump raw header format - for library
        Serial.print((x - 1));
        Serial.print(F(") "));
        detachInterrupt(0);//stop interrupts & capture until finshed here
        for (int i = 1; i < x; i++) { //now dump the times
          if (!(i & 0x1)) Serial.print(F("-"));
          Serial.print(irBuffer[i] - irBuffer[i - 1]);
          Serial.print(F(", "));
        }
        x = 0;
        Serial.println();
        Serial.println();
        digitalWrite(LEDPIN, LOW); //end of visual indicator, for this time
        attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE); //re-enable ISR for receiving IR signal
      }
    
    }
    
    void rxIR_Interrupt_Handler() {
      if (x > maxLen) return; //ignore if irBuffer is already full
      irBuffer[x++] = micros(); //just continually record the time-stamp of signal transitions
    
    }
    Im seriellen Monitor kommt dann eine elendig lange Zeile Zahlen zum Vorschein. Der Befehl AUS sieht dann so aus:

    Code:
    Press the button on the remote now - once only
    Press the button on the remote now - once only
    
    Raw: (59) 8496, -4172, 580, -1532, 580, -476, 580, -476, 576, -480, 576, -1532, 580, -476, 580, -476, 580, -476, 580, -1532, 580, -1532, 576, -480, 576, -480, 576, -476, 580, -476, 580, -476, 580, -476, 580, -476, 580, -476, 580, -476, 580, -476, 580, -476, 576, -1532, 580, -476, 580, -1532, 580, -476, 580, -476, 580, -476, 580, -1532, 576,
    Da jeder AUS-Befehl etwas abweichende Zahlen ausspuckt habe ich dreimal den AUS-Befehl erfasst.

    Diese Zahlen müssen jetzt bereinigt werden. Also zunächst das Raw: (59) vorne weg. Die 59 ist ist die Anzahl der Zahlen. Diese wird später noch gebraucht.
    Jetzt werden die drei Zahlensätze nach Excel importiert, dann über alle drei Spalten ein Mittelwert ohne Nachkommastelle ermittelt. Diese speichere ich als .csv ab und öffne es nun im Word. Jetzt ersetze ich das ; gegen ein Komma (,) - ich weiss das geht auch noch im Excel - und lösche die Minuszeichen raus

    Dieser Zahlenwurm mit 59 Werten lege ich nun erst mal beiseite.

    Jeden Befehl, den ich mit dem Ardunio steuern will muss ich so zusammenstellen, für jede geplante Lüfterstellung und Gradzahl einzeln
    Hier droht also noch einiges an Arbeit

    Zum Test habe ich das noch mit der Gebläsestufe "volle Pulle" gemacht. Die Gasleistungen werden erst diese Woche angeschlossen (Kann also weder Heizen noch Kühlen derzeit testen

    Kommt nun der Teil des Datenversandes zur Steuerung durch den Ardunio. Ich habe dem Arduino noch zwei Taster verpasst, einen dritten hatte ich in dem Moment nicht mehr gefunden, vorbereitet ist es zumindest mal codeseitig. Nur muss ich die IRData erstellen.

    Code:
    // die Taster werden über einen kleinem Widerstand auf Masse gezogen
    #include <IRremote.h>
    IRsend ac_LGWP;  // Standardmässig sendets wohl auf PIN 3
    
    int led13 = 13;
    int time=500;
    int time1=50;
    int button10 = 10;
    int button10Status;
    int button11 = 11;
    int button11Status;// Variable für Pin 6
    int button12 = 12;
    int button12Status;
    
    //IRDATA
    unsigned int OFF[] = {8495,4173,577,1532,580,476,580,476,580,476,579,1532,579,477,579,477,577,477,579,1532,580,1532,579,476,579,477,579,477,579,477,579,477,579,475,580,476,580,476,580,476,580,476,577,477,579,1533,579,477,579,1532,579,476,580,476,580,476,579,1532,579};
    unsigned int HEIZ1[] = {8507,4160,589,1521,589,467,589,467,589,467,589,1521,589,467,588,467,588,467,589,467,589,467,589,467,589,467,589,1521,589,467,588,1523,588,467,589,467,589,1523,589,1521,589,467,589,465,591,1521,588,467,589,467,589,467,589,1523,588,467,589,467,588};
    unsigned int HEIZ4[] = {8507,4160,589,1521,589,467,589,467,589,467,589,1521,589,467,588,467,588,467,589,467,589,467,589,467,589,467,589,1521,589,467,588,1523,588,467,589,467,589,1523,589,1521,589,467,589,465,591,1521,588,467,589,467,589,467,589,1523,588,467,589,467,588};
    
    bool HMinLGWPblocked = false;
    unsigned long HMinLGWPblockedSINCE = millis();
    
    void lauflicht() {
      delay(time);
      digitalWrite(led13, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(time);                       // wait for a second
      digitalWrite(led13, LOW);    // turn the LED off by making the voltage LOW
      delay(time1);           // wait for a second
      }
    
    void setup() {
      Serial.begin(9600);
      pinMode(led13, OUTPUT);  // initialize digital pin LED_BUILTIN as an output.
      pinMode(button10, INPUT);
      pinMode(button11, INPUT);
      pinMode(button12, INPUT);// definiere Pin 11 als Eingang
      digitalWrite(button10, HIGH);
      digitalWrite(button11, HIGH);
      digitalWrite(button12, HIGH);// aktiviert den Pull- Up- Widerstand, die Taster sachalten auf Masse
    }
    
    void loop() {
        // Eingänge für LGWP lesen, und AC schalten, weiteres lesen blocken
      if (HMinLGWPblocked == false) {
          if(digitalRead(button10) == LOW) {
            ac_LGWP.sendRaw(OFF, 59, 36);
            HMinLGWPblocked = true;
            HMinLGWPblockedSINCE = millis();
            Serial.println("Klimaanlage aus ");        
          }
          if(digitalRead(button11) == LOW) {
            ac_LGWP.sendRaw(HEIZ1, 59, 36);
            HMinLGWPblocked = true;
            HMinLGWPblockedSINCE = millis();
            Serial.println("Klimaanlage volle Pulle ");      
          }
          if(digitalRead(button12) == LOW) {
            ac_LGWP.sendRaw(HEIZ4, 59, 36);
            HMinLGWPblocked = true;
            HMinLGWPblockedSINCE = millis();
            Serial.println("Klimaanlage halbe Pulle ");      
          }
              
      }
    
    
      if ((HMinLGWPblocked == true)&&(millis()-HMinLGWPblockedSINCE>1200)) {HMinLGWPblocked = false; }  // un-blocken wenn block länger als 1200ms
      
      button10Status = digitalRead(button10);
      button11Status = digitalRead(button11);  
      button12Status = digitalRead(button12);
    
      if(button10Status == LOW)                  
    
      {
    lauflicht();
    }
      if(button12Status == LOW)                  
    
      {
    lauflicht();
    }
    }
    ..... uuuuuund tadaaaaaa...... läuft

    Ich bin sehr verwundert das diese Bastelei genauso gut funktioniert wie die Originalfernbedienung. Jetzt kann ich mit dem Ardunio wunderbar weiterexperimentieren und so die Parameter, die ich vorab mit der FB ausgetestet habe übertragen.
    Ich denke dass ich mit vier, fünf Funktionen zurechtkommen werde.
    Letztendlich möchte ich die Leistung in einigen Stufen regeln können und so in Abhängigkeit der Heizkreistemp und Leistung Solaranlage einstellen.

    Noch ist alles auf dem Steckbrett zusammengefummelt:
    Ganz recht ist die Empfangseinheit zum Auslesen der FB
    Mitte rechts sind die Taster und die IR-LED zur Steuerung
    Der Transistor und die Widerstände links von den Tastern gehört noch zum Simulator des Gebläsemotors des IG

    Der Ardunio ist natürlich der zentrale Dreh- und Angelpunkt. derzeit muss ich die drei Programme (IR-Lesen, IR-Senden und Simulation BLDC-Motor) einzeln aufspielen. Ich werde mal sehen inwieweit sich das zusammenpacken lässt und sich auf den Nano quetschen lässt - FB und BLDC-Motor wäre schon toll.

    Ansonsten muss sich zwei Arduinos einsetzen. Wäre ggf sogar der bessere Weg, so ist dann z.B. die Fernbedienung per IR von der Steuerung galvanisch getrennt. Ich plane schliesslich die Leistung der PV im Netzwerk auszulesen.

    Oder ich nehme den ESP8266 oder den Wifikit 8
    Muss da aber mal sehen was ich final nehme



    Grüsse
    Carsten
    Angehängte Dateien
    Zuletzt geändert von Carstene; 20.04.2021, 14:11.

    #2
    Gestern Abend habe ich zufällig eine LGACremote.h für den ESP8266 gefunden.

    https://github.com/crankyoldgit/IRre...aster/examples
    https://www.electronics-lab.com/project/esp8266-wifi-air-conditioner-remote-control/


    Ich schau mal ob die es auch tut oder es noch der alte IR-Code ist
    Habe seit gestern das erste Programm auf dem WIFI Kit 8 mit Oled laufen.
    Zuletzt geändert von Carstene; 21.04.2021, 07:39.

    Kommentar


      #3
      Ich habe das Projekt etwas umgemodelt

      BTW... die Anlage läuft - Eingriffe in die Klimaanlagenelektronik waren nicht erforderlich. Bis auf :

      - Austausch den Innentemp.Fühlers druch festen Widerstand (die Elektronik glaubt jetzt dass im Raum 18 Grad sind)
      - Parallel zum Schalter habe ich einen Optokoppler geschaltet. Über diesen Opto schalte ich die Klimaanlage ein und aus

      Alles andere macht der Arduino ESP8266

      Er fragt mit einem PHP Script aus den Logdaten der PV-Anlage die Einspeisung ab und entscheidet ob WP an oder ausgeht.

      Der Arduino stellt eine kleine Webseite zur Verfügung wo ich quasi die Klimaanlagensteuerung ein und Ausschalten kann

      Kommentar

      Lädt...
      X