пульт ДУ для Сплит-системы LESSAR

eldev
Offline
Зарегистрирован: 14.05.2012

пытаюсь из arduino сделать пульт ДУ для кондиционера

словил затык, казалось бы на самом простом - обеспечить несущуюю в 38 кГц

есть описание протокола (перевел машинным переводом вперемешку гугл и бинг):docs.google.com/document/d/184FB4ha5hK1ua-goIIRJ_uSNdlOpXjykpWlw8N8x1CM/edit

int pin = 13;
byte FanSpeed=5<<5; //3 старших бита в последовательности В отвечают за скорость вентилятора (низкая скорость)
//0 фиксированная скорость, 1 высокая скорость, 2 средняя скорость, 4 низкая скорость, 5 авто скорость

byte b40=B00011111; // 5 младших битов в последовательности В (заглушка)

byte TempMode=7<<4; //4 старших бита в последовательности С отвечают за температуру (22 градуса)
// 0 - 17град, 1 - 18град, 3 - 19град, 2 - 20град, 6 - 21град, 7 - 22град, 5 - 23град, 4 - 24град,
// 12 - 25град, 13 - 26град, 9 - 27град, 8 - 28град, 10 - 29град, 11 - 30град, 14 - Нет определения

byte Mode=2<<2; // 3 и 4 биты справа в последовательности С отвечают за режим работы кондиционера 
// 0 охлаждение, 1 сушка(вентилятор), 2 авто режим, 3 обогрев

byte c10=0; // 2 младших бита в последовательности С (заглушка)


void setup(){
  Serial.begin(115200);
  pinMode(pin, OUTPUT);  
  byte A= B10110010; //последовательность А
  byte B=FanSpeed^b40; //последовательность В
  byte C=TempMode^Mode^c10; //последовательность С
  byte invA =~A; //обратная последовательность А
  byte invB =~B; //обратная последовательность В
  byte invC =~C; //обратная последовательность С
  Serial.println(A,BIN); 
  Serial.println(invA,BIN);
  Serial.println(B,BIN);
  Serial.println(invB,BIN);
  Serial.println(C,BIN);
  Serial.println(invC,BIN);
  Serial.println("");

  byte code[] = {
    A,invA,B,invB,C,invC        };
  for (int t=0;t<6;t++){
    //Serial.print(code[t],BIN);
    for ( int i=0;i<sizeof(code[t])*8;i++){
      Serial.print(bitRead(code[t],i));
    }
  }
  Serial.println("");
}

void loop(){
  L();
  AABBCC(FanSpeed,b40,TempMode,Mode,c10);
  term_sign();
  S();
  L();
  AABBCC(FanSpeed,b40,TempMode,Mode,c10);
  term_sign();
  noTone(pin); // выключаем светодиод
  delay (30000); //пауза
}


void L(){ //Стартовый бит
  noTone(pin);   // выключаем светодиод
  delayMicroseconds(4400);              // пауза
  tone(pin, 38000);    // зажигаем светодиод
  delayMicroseconds(4400);// пауза
}

void S(){ //разделительный бит
  noTone(pin);   // выключаем светодиод
  delayMicroseconds(540);              // пауза
  tone(pin, 38000);    // зажигаем светодиод
  delayMicroseconds(5220);// пауза
}

void zero(){ //ноль
  noTone(pin);   // выключаем светодиод
  delayMicroseconds(540);              // пауза
  tone(pin, 38000);    // зажигаем светодиод
  delayMicroseconds(540);// пауза
}

void one (){ //единица
  noTone(pin);   // выключаем светодиод
  delayMicroseconds(540);              // пауза
  tone(pin, 38000);    // зажигаем светодиод
  delayMicroseconds(1620);// пауза
}

void term_sign(){ //делитель
  noTone(pin);   // выключаем светодиод
  delayMicroseconds(540);              // пауза
  tone(pin, 38000);    // зажигаем светодиод
  delayMicroseconds(540);// пауза
}

void AABBCC(byte FanSpeed,byte b40,byte TempMode,byte Mode,byte c10){
  byte A= B10110010; //последовательность А
  byte B=FanSpeed^b40; //последовательность В
  byte C=TempMode^Mode^c10; //последовательность С
  byte invA =~A; //обратная последовательность А
  byte invB =~B; //обратная последовательность В
  byte invC =~C; //обратная последовательность С
  int code[] = {
    A,invA,B,invB,C,invC        };
  for (int t=0;t<3;t++){
    //Serial.print(code[t],BIN);
    for ( int i=0;i<sizeof(code[t])*8;i++){
      if (bitRead(code[t],i)==0){
        zero();
      }
      else{
        one();
      }
    }
    //Serial.println("");
  }
}

 

большая просьба помочь разобраться что у меня пошло не так, тк кондиционер не отвечает на сигнал

eldev
Offline
Зарегистрирован: 14.05.2012

 блин, случайно нажал enter не успев закончить название темы...

пульт ДУ для Сплит-системы LESSAR

4ishops
Offline
Зарегистрирован: 06.10.2012

 есть целый проект про пульты http://www.pjrc.com/teensy/td_libs_IRremote.html

AKa
AKa аватар
Offline
Зарегистрирован: 10.11.2015

Получилось сделать проект?

eldev
Offline
Зарегистрирован: 14.05.2012

Ну, совместными усилиями вроде бы получилось)

Здесь, правда выложена модификация для Меги (работа на 9 пине). На уно и др должно работать по-умолчанию на 3 (нужно удалить 8 и 9 строки pinMode и digitalWrite)

Отсылает пакет во время подачи питания (ну или после нажатия ресета) один раз.

#include <IRremote.h>
#include <IRremoteInt.h>
IRsend irsend;

void setup() {
 Serial.begin(9600);
// переназначаем пин 3 на пин 9 как выход
 pinMode(9,OUTPUT); 
 digitalWrite(9, LOW);
  //прописываю временные промежутки для битов
unsigned int LESSAR_HEADER_SPACE = 4400;
unsigned int LESSAR_HEADER_MARK = 4400;
unsigned int LESSAR_SPACE = 540;
unsigned int LESSAR_ZERO_MARK = 540;
unsigned int LESSAR_ONE_MARK = 1620;
unsigned int LESSAR_DIVIDER_MARK = 5220;

//определяю переменные
byte A,Ai,B,Bi,C,Ci,D,Di,J,Ji,K,Ki,H,Hi,O,Oi,P,Pi; //D используется для задания времени работы, J и K для задания экономичной работы
//H,Hi,O,Oi,P,Pi используются для задания специальных режимов работы
unsigned int Msg[99];
unsigned int FullMsg[199]; //для обычного режима работы. для экономичного 298 впереди добавляется фрейм LAAiJJiKKiS

boolean on=false; // отметка о том что сплит выключен. можно писать в EEEPROM и грузить оттуда. по окончании скетча менять.
boolean econom=false; //отметка о включении экономичного режима
boolean timestamp = false;//отметка о таймерах

//формирую битовые последовательности для отправки... их можно формировать зная параметры запуска
  A = B10110010;//или B10110010 - для отключения
  B = B00011111;//[000 11111] фиксированнаяскорость вентилятора, или B01111011 - для отключения
  C = B01001000;//[0100 10 00] 24 градуса, режим работы авто, или B11100000 - для отключения

  D = B00000000;// [0 0000000] при 24 град таймер на 15мин - сейчас не используется

  J = B11100000;//сейчас не используется
  K = B00000011;//сейчас не используется

if (on == true){ //если включен - то выключаю
  A = B10110010;
  B = B01111011;
  C = B11100000;
} 

//обратные битовые последовательности
Ai= ~A;
Bi= ~B;
if (timestamp == false){
  Ci= ~C;
} else {
  D = B00000000;
  Ci = D; //также надо коректировать B4-B0 и C1-C0
}
Ji= ~J;
Ki= ~K;

//первичные присвоения временных промежутков
Msg[0] = LESSAR_HEADER_SPACE;
Msg[1] = LESSAR_HEADER_MARK;
FullMsg[98] = LESSAR_SPACE;
FullMsg[99] = LESSAR_DIVIDER_MARK;
FullMsg[198]= LESSAR_SPACE;
//FullMsg[199]= LESSAR_SPACE;

// для "опытов" пока работаю без времени и с обычным режимом (те беру самое простое)
//раскладываем последовательность A и Ai
for (int i=0;i<=7;i++){
  //int bitq=bitRead(i,A);
//  Serial.print(bitRead(A,7-i));
Msg[(i)*2+2] = LESSAR_SPACE;
  if (bitRead(A,7-i)==0){
    Msg[(i)*2+3] = LESSAR_ZERO_MARK;
  } else {
    Msg[(i)*2+3] = LESSAR_ONE_MARK;
  }
}
//Serial.println(";");

for (int i=8;i<=15;i++){
  //int bitq=bitRead(i,Ai);
//  Serial.print(bitRead(Ai,15-i));
  Msg[(i)*2+2] = LESSAR_SPACE;
  if (bitRead(Ai,15-i)==0){
    Msg[(i)*2+3] = LESSAR_ZERO_MARK;
  } else {
    Msg[(i)*2+3] = LESSAR_ONE_MARK;
  }
}
//Serial.println(";");
//раскладываем последовательность B и Bi
for (int i=16;i<=23;i++){
  //int bitq=bitRead(i,B);
//  Serial.print(bitRead(B,23-i));
  Msg[(i)*2+2] = LESSAR_SPACE;
  if (bitRead(B,23-i)==0){
    Msg[(i)*2+3] = LESSAR_ZERO_MARK;
  } else {
    Msg[(i)*2+3] = LESSAR_ONE_MARK;
  }
}
//Serial.println(";");
for (int i=24;i<=31;i++){
  //int bitq=bitRead(i,Bi);
  Msg[(i)*2+2] = LESSAR_SPACE;
  if (bitRead(Bi,31-i)==0){
    Msg[(i)*2+3] = LESSAR_ZERO_MARK;
  } else {
    Msg[(i)*2+3] = LESSAR_ONE_MARK;
  }
}
//раскладываем последовательность C и Ci
for (int i=32;i<=39;i++){
  //int bitq=bitRead(i,C);
  Msg[(i)*2+2] = LESSAR_SPACE;
  if (bitRead(C,39-i)==0){
    Msg[(i)*2+3] = LESSAR_ZERO_MARK;
  } else {
    Msg[(i)*2+3] = LESSAR_ONE_MARK;
  }
}
for (int i=40;i<=47;i++){
  //int bitq=bitRead(i,Ci);
  Msg[(i)*2+2] = LESSAR_SPACE;
  if (bitRead(Ci,47-i)==0){
    Msg[(i)*2+3] = LESSAR_ZERO_MARK;
  } else {
    Msg[(i)*2+3] = LESSAR_ONE_MARK;
  }
}
//тесты заполнения

//формирую raw последовательность для отправки
for (int i=0;i<98;i++){
  FullMsg[i]=Msg[i];
  FullMsg[i+100]=Msg[i];
//Serial.print(Msg[i]);
//Serial.print(",");
}
//Serial.println(";");

for (int i=0;i<=198;i++){
Serial.print(FullMsg[i]);
if (i<198){
  Serial.print(",");
} else{
  Serial.println(";");
}
}

//отправляем пакет на сплит
irsend.sendRaw(FullMsg,200,38);
}

void loop() {
  // put your main code here, to run repeatedly:

}

осталось продумать пути доставки данных на ардуину (bluetooth, Wi-Fi, ну или сразу на ESP8266 делать без ардуины.)