пульт ДУ для Сплит-системы LESSAR
- Войдите на сайт для отправки комментариев
Пт, 24/08/2012 - 15:17
пытаюсь из 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("");
}
}
большая просьба помочь разобраться что у меня пошло не так, тк кондиционер не отвечает на сигнал
блин, случайно нажал enter не успев закончить название темы...
пульт ДУ для Сплит-системы LESSAR
есть целый проект про пульты http://www.pjrc.com/teensy/td_libs_IRremote.html
Получилось сделать проект?
Ну, совместными усилиями вроде бы получилось)
Здесь, правда выложена модификация для Меги (работа на 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 делать без ардуины.)