/* Sendeschema der Fernbedienung ARC480A53 (Daikin FTXP35M/RXP35M): Pulsbreite 420µs, 36.7kHz/27µs, 16 Sub-Pulse - Präambel - konstanter Teil1 - Befehlteil1 - konstanter Teil2 - Befehlteil2 LH=1 LL=0 HL=A HH=B 220 Pattern gesamt Präambel:2bit (0,1,A,B) AAAAAA00000000000000000000000000001BBBA0 6bytes identischer Vorspann: 1bit (0,1) 10111101 11110110 10110101 01010111 01111111 11111111 6bytes Kommandoabhängige: Heizen/Stop/Kühlen 11110111 11101110 11101011 11111111 1 1111011 01111111 11111111 11011101 11010111 11111111 1 1110110 11111111 11110111 10101111 01110101 11111111 1 1111101 10111111 5 bytes identisch 0xFF: 11111111 11111111 11111111 1 1111111 11111111 6bytes Kommandoabhängig: Heizen/Stop/Kühlen 11101101 11101011 11111111 1 1011111 10111101 10100000 11011011 11010111 11110111 1 1011111 01111101 01010000 11110110 11110101 11111111 1 1101111 11011101 11010000 */ #define PWUS 13 // Pulsweite in Mikrosekungen = 36.7kHz enum {WP_STOP,WP_HEAT,WP_COOL}; void wp(int); // zentrale Sendefunktion // Codes für Heizen/Stop/Kühlen mit 25°C und 3.Lüfterstufe char* pre="AAAAAA00000000000000000000000000001BBBA0\0"; char gem1[6+1]={0b10111101,0b11110110,0b10110101,0b01010111,0b01111111,0b11111111,0}; // Gemeinsam1 char hei1[6+1]={0b11110111,0b11101110,0b11101011,0b11111111,0b11111011,0b01111111,0}; // Heizen1 char sto1[6+1]={0b11111111,0b11011101,0b11010111,0b11111111,0b11110110,0b11111111,0}; // Stop1 char kue1[6+1]={0b11110111,0b10101111,0b01110101,0b11111111,0b11111101,0b10111111,0}; // Kühlen1 char gem2[5+1]={0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0}; // Gemeinsam2 char hei2[6+1]={0b11101101,0b11101011,0b11111111,0b11011111,0b10111101,0b10100000,0}; // Heizen2 char sto2[6+1]={0b11011011,0b11010111,0b11110111,0b11011111,0b01111101,0b01010000,0}; // Stop2 char kue2[6+1]={0b11110110,0b11110101,0b11111111,0b11101111,0b11011101,0b11010000,0}; // Kühlen2 void sTXpre(char*); // Präambel senden void sTXdat(char*); // Datenblock senden void byteTX(char); // 8bit senden void puls(char,char); // Doppelpulspaket bestehend aus 2x16 Elementarpulsen senden void wp(int act){ // cli(); sTXpre(pre); sTXdat(gem1); switch (act){ case WP_HEAT: sTXdat(hei1);sTXdat(gem2);sTXdat(hei2);break; case WP_COOL: sTXdat(kue1);sTXdat(gem2);sTXdat(kue2);break; case WP_STOP: sTXdat(sto1);sTXdat(gem2);sTXdat(sto2);break; } sei(); // global Interupts erlauben } void sTXdat(char* cp){ do { byteTX(*cp); } while (*(++cp)!='\0'); } void byteTX(char b){ for (int i=7;i>=0;i--){ // MSB first if ((b>>i)&1) puls('L','H'); // 1: "LH" else puls('L','L'); // 0: "LL" } } void sTXpre(char* cp){ do { switch (*cp){ case 'A': puls('H','L');break; case '0': puls('L','L');break; case '1': puls('L','H');break; case 'B': puls('H','H');break; } } while (*(++cp)!='\0'); } void puls(char peg1, char peg2){// sendet in 2 Zeitschlitzen bei High je 16 Einzelpulsen mit 13µs Länge : 840µs int i; for(i=0;i<16;i++){ // Teil1 switch (peg1) { case 'L': IR_L;_delay_us(PWUS); IR_L;_delay_us(PWUS);break; case 'H': IR_H;_delay_us(PWUS); IR_L;_delay_us(PWUS);break; } } for(i=0;i<16;i++){ // Teil2 switch (peg2) { case 'L': IR_L;_delay_us(PWUS); IR_L;_delay_us(PWUS);break; case 'H': IR_H;_delay_us(PWUS); IR_L;_delay_us(PWUS);break; } } }