Кондиционер и ИК передатчик из Ардуино.

ganz
Offline
Зарегистрирован: 30.04.2014

Не как не могу заставить работать Подобрать код дя работы с кондиционером Panasonic.

Изначально считывается RAW(132)

Unknown encoding: 9DCF5C22 (32 bits)
Raw (132): 2864,3450,-1650,500,-400,450,-1250,400,-450,450,-450,400,-450,450,-450,450,-450,450,-400,450,-400,450,-400,500,-400,450,-400,500,-400,450,-1250,450,-450,450,-400,450,-400,500,-400,450,-400,500,-400,450,-400,500,-1250,450,-1250,450,-1250,450,-400,500,-400,450,-1250,450,-400,500,-400,450,-450,450,-400,500,-400,450,-400,450,-400,450,-450,450,-400,450,-450,450,-400,500,-400,450,-400,500,-400,450,-400,450,-400,500,-400,450,-450,450,-400,500,-400,500,-350,500,-350,500,-400,450,-400,500,-400,450,-400,500,-400,450,-450,450,-400,450,-400,500,-1200,500,-1200,450,-450,450,-450,450,-400,450,-450,450,-400,450,

убираю первый символ и непонятно остается то меньше чем 132.

На всякий случай делаю несколько...

И ничего не работает!

 


#include <IRremote.h> // это скачанная библиотека 

int i;
IRsend irsend;
unsigned int powerOn0[133]= {3450,1650,500,400,450,1250,400,450,450,450,400,450,450,450,450,450,450,400,450,400,450,400,500,400,450,400,500,400,450,1250,450,450,450,400,450,400,500,400,450,400,500,400,450,400,500,1250,450,1250,450,1250,450,400,500,400,450,1250,450,400,500,400,450,450,450,400,500,400,450,400,450,400,450,450,450,400,450,450,450,400,500,400,450,400,500,400,450,400,450,400,500,400,450,450,450,400,500,400,500,350,500,350,500,400,450,400,500,400,450,400,500,400,450,450,450,400,450,400,500,1200,500,1200,450,450,450,450,450,400,450,450,450,400,450};
unsigned int powerOn1[132]= {3450,1650,500,400,450,1250,400,450,450,450,400,450,450,450,450,450,450,400,450,400,450,400,500,400,450,400,500,400,450,1250,450,450,450,400,450,400,500,400,450,400,500,400,450,400,500,1250,450,1250,450,1250,450,400,500,400,450,1250,450,400,500,400,450,450,450,400,500,400,450,400,450,400,450,450,450,400,450,450,450,400,500,400,450,400,500,400,450,400,450,400,500,400,450,450,450,400,500,400,500,350,500,350,500,400,450,400,500,400,450,400,500,400,450,450,450,400,450,400,500,1200,500,1200,450,450,450,450,450,400,450,450,450,400,450};
unsigned int powerOn2[131]= {3450,1650,500,400,450,1250,400,450,450,450,400,450,450,450,450,450,450,400,450,400,450,400,500,400,450,400,500,400,450,1250,450,450,450,400,450,400,500,400,450,400,500,400,450,400,500,1250,450,1250,450,1250,450,400,500,400,450,1250,450,400,500,400,450,450,450,400,500,400,450,400,450,400,450,450,450,400,450,450,450,400,500,400,450,400,500,400,450,400,450,400,500,400,450,450,450,400,500,400,500,350,500,350,500,400,450,400,500,400,450,400,500,400,450,450,450,400,450,400,500,1200,500,1200,450,450,450,450,450,400,450,450,450,400,450};
//unsigned int powerOn3[130]= {3450,1650,500,400,450,1250,400,450,450,450,400,450,450,450,450,450,450,400,450,400,450,400,500,400,450,400,500,400,450,1250,450,450,450,400,450,400,500,400,450,400,500,400,450,400,500,1250,450,1250,450,1250,450,400,500,400,450,1250,450,400,500,400,450,450,450,400,500,400,450,400,450,400,450,450,450,400,450,450,450,400,500,400,450,400,500,400,450,400,450,400,500,400,450,450,450,400,500,400,500,350,500,350,500,400,450,400,500,400,450,400,500,400,450,450,450,400,450,400,500,1200,500,1200,450,450,450,450,450,400,450,450,450,400,450};

void setup()
{
delay (3000); 

Serial.begin(9600); 
}
void loop()
{
  
delay (5000); 
irsend.sendRaw(powerOn0, 133, 38);
delay (4000);
irsend.sendRaw(powerOn1, 132, 38);
delay (4000);
irsend.sendRaw(powerOn2, 131, 38);
delay (4000);
//irsend.sendRaw(powerOn3, 129, 38);
//delay (4000);


 } 

Помогите!!!

Тут все прочитал http://arduino.ru/forum/apparatnye-voprosy/nuzhna-pomoshch-po-radiomodulyu-i-ik-peredatchiku#comment-form

ganz
Offline
Зарегистрирован: 30.04.2014

Если потом считывать с пульта и Ардуино, то:

Unknown encoding: 9DCF5C22 (32 bits) с пульта постоянно ОДИНАКОВЫЙ

а с АРДУИНО всегда разный

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

ganz пишет:

Если потом считывать с пульта и Ардуино, то:

Unknown encoding: 9DCF5C22 (32 bits) с пульта постоянно ОДИНАКОВЫЙ

а с АРДУИНО всегда разный

Считывать чем? Какие IR? На какой частоте они работают? Откуда известно, что частота именно 38, а не другая? Какие сомнения, что первый байт нужно откинуть? А зяглянуть в примеры библиотеки и найти как там используется метод sendRaw лень? В примере IRrecord есть такой метод и там явно показано, какие данные используются для отправки кода с помощью sendRaw.

Таких тем уже на форуме есть и может нет решения, но изжевана тема изрядно. Просто одно и тоже каждый раз объяснять приходится и каждый сомневается

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
ganz
Offline
Зарегистрирован: 30.04.2014

Так везде же откидывают первое число! Во всех примерах что я видел! Считываю тоже Ардуинкой. Частота 38, так как видел пример на забугорном сайте https://github.com/itamaro/home-control-arduino и там кондей от Панасоника на 38 частоте. 

Но в примере вообще мне ничего не понятно. Я почти все темы с форума прочитал, но так видимо и не понял. Я пробую уже целый месяц, как только не извращялся. Частоту подбирал аж до 70. 

Написал, потому что уже мозги закипели...

ganz
Offline
Зарегистрирован: 30.04.2014

Тема может и изжована, вот только конечный результат у многих по моему ощущению получается "на шару". 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

И правильно, какждый раз и говорю, что нужно отбрасывать первое число.

Посмотрите на строки 5-7 Вашего скетча. На первый взгляд все три массива одной и той же длины (я скроллил вправо до конца массивов), а в описании стоит разная длина. Либо установить правильную длину, либо рассчитайте её, оставив размер массива "неопределенным". Расчитывается просто, например, так unsigned int len = sizeof( powerOn0 ) / sizeof( unsigned int );

Просто благодаря таким мелочам в "эфир" уйдет мусор, либо совсем не то, что Вы ждете, а потому весь результат насмарку.

IR должны быть одинаковые, что на пульте, что на Ардуине (частота модуляции), потому что иначе с пульта будет читать стабильно, с Ардуины - нет. Легко, я в этом убеждался на практике. Потому и передатчик и приемник должны работать на одной частоте.

На шару или нет. У вас, например, если две Ардуины и Вы можете поэкспериментировать, не насилуя кондиционер, добиться сначала чтобы с пульта или с Ардуины приходил один и тот же код.

ganz
Offline
Зарегистрирован: 30.04.2014

Спасибо тебе огромное мил человек!!!

У меня почему-то даже с родного пульта приходит разный код в RAW (Unknown encoding: 9DCF5C22 (32 bits) с пульта постоянно ОДИНАКОВЫЙ)...  первый раз шестое число 400, а потом 450, потом опять 400 или седмое число 1300 , потом 1270 итд. Пробовал три разных ИК приемника, результат один и тот же. А вот с другой Ардуины которая посылает сигнал Unknown encoding: 9DCF5C22 совпадает не часто. Raw вообще разный.

Длину установил разную специально, так как непонятка с первым числом и в одном из примеров тут http://arduino.ru/forum/apparatnye-voprosy/nuzhna-pomoshch-po-radiomodulyu-i-ik-peredatchiku#comment-39581 увеличили длину на 1 и у парня всё заработало, вот и я извращаюсь.

 

ganz
Offline
Зарегистрирован: 30.04.2014

Сделал!!! Взял отсюда 3 библиотеки https://github.com/ToniA/arduino-heatpumpir

И запустил через heatpumpIR[0]->send(irSender, POWER_ON, MODE_COOL, FAN_5, 17, VDIR_AUTO, HDIR_AUTO); 

Теперь меняю эти значения и всё работает.

 

Удовлетворение 0%, так как самое обидное, что не понимаю как всё работает. Буду осваивать программирование...

p.s. Уже приципил датчик DS18b20 - всё работает, вот только вся система мне за ночь батарейку 2200мА посадила.

Trainer
Offline
Зарегистрирован: 20.09.2013

не знаю, поможет ли, но с год назад я долго мучался с кондиционерами Samsung и General

позже я узнал, что большинство кондиционеров отправляют 3 разных пакета на одно нажатие кнопки, так как там каждый раз отправялется режим, температура, направление и сила ветродуйки и прочее.

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

Так что, сканировать надо другим скетчем. В результате мои коды выглядят сейчас вот так

// Mode Off
byte ConditionerOff[349] = {7,175,30,89,5,5,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,5,5,5,5,5,15,5,15,5,5,5,15,5,15,5,15,5,15,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,5,15,5,30,30,89,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,5,5,5,5,5,15,5,5,5,15,5,15,5,15,5,15,5,15,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,30,30,89,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,5,5,5,5,5,15,5,5,5,5,5,5,5,15,5,15,5,15,5,15,5,5,5,15,5,5,5,15,5,15,5,5,5,5,5,5,5,15,5,15,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,5,15,5,5,5,15,5,15,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,15,5,15,5};

Не обращайте внимания, на то, что числа маленькие, они умышленно поделены на 100, чтобы меньше занимать памяти в ардуине

ganz
Offline
Зарегистрирован: 30.04.2014

И что это за скетч? название можно плиз ....

Trainer
Offline
Зарегистрирован: 20.09.2013

не помню где брал, потом еще вносил изменения

на почту вышлю

ЕвгеничЪ
Offline
Зарегистрирован: 30.09.2013

не могли бы ли Вы куда нибудь выложить скетч?

тоже интересует вопрос... тоже бьюсь с кондиционером...

Клапауций
Offline
Зарегистрирован: 10.02.2013

ЕвгеничЪ пишет:

тоже бьюсь с кондиционером...

завали ега из ПЗРК, сколько можно терпеть.

Trainer
Offline
Зарегистрирован: 20.09.2013

Вот держите

// ИК-приемник подключить к Digital Pin-02 на MEGA или Duemilanove
// Кнопку начала сканирования подключить между землей и Digital Pin-04

// Arduino Mega
#if defined(__AVR_ATmega2560__)
#define IRpin_PIN PINE
#define IRpin 4
// Arduino Duemilanove
#else
#define IRpin_PIN PIND
#define IRpin 2
#endif

#define MAXPULSE 65000
#define RESOLUTION 20 // Timing resolution 

int buttonPin = 4;
int buttonState = 0;        
uint16_t pulses[200][2]; // 100 pairs standart
uint8_t currentpulse = 0;
uint8_t sendpulse = 0;

void setup(void){
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);  
  Serial.begin(9600);
  Serial.println("\nPress Receive key...");
};

void loop(void){
  buttonState = digitalRead(buttonPin);
  if ((buttonState==LOW) || (currentpulse != 0))
    {
    if (buttonState==LOW)
      {
      Serial.println("\nReady to decode IR");
      delay(400);
      }
    uint16_t highpulse, lowpulse;
    highpulse = lowpulse = 0;
    while (IRpin_PIN & (1 << IRpin))
      {
      highpulse++;
      delayMicroseconds(RESOLUTION);
      if ((highpulse >= MAXPULSE) && (currentpulse != 0))
        {
        printpulses();
        sendpulse=currentpulse;
        currentpulse=0;
        return;
        }
      }
    pulses[currentpulse][0] = highpulse;
    while (! (IRpin_PIN & _BV(IRpin)))
      {
      // pin is still LOW
      lowpulse++;
      delayMicroseconds(RESOLUTION);
      if ((lowpulse >= MAXPULSE) && (currentpulse != 0))
        {
        printpulses();
        sendpulse=currentpulse;
        currentpulse=0;
        return;
        }
      }
    pulses[currentpulse][1] = lowpulse;
    currentpulse++;
    }
};

void printpulses(void){
  Serial.println("\nReceived:");
  Serial.print("\nunsigned int IRsignal[");
  Serial.print(currentpulse*2-1);
  Serial.print("] = {");
  for (uint8_t i = 0; i < currentpulse-1; i++)
    {
    Serial.print(pulses[i][1] * RESOLUTION, DEC);
    Serial.print(", ");
    Serial.print(pulses[i+1][0] * RESOLUTION, DEC);
    Serial.print(", ");
    }
  Serial.print(pulses[currentpulse-1][1] * RESOLUTION, DEC);
  Serial.print("};");
  Serial.println("");
};

 

ЕвгеничЪ
Offline
Зарегистрирован: 30.09.2013

Trainer спасибо!

ЕвгеничЪ
Offline
Зарегистрирован: 30.09.2013

Trainer,  а не поделитесь своим скетчем управления кондиционером? можно на почту, если так Вам удобнее.

good_mail(злой_пес)rambler.ru

Trainer
Offline
Зарегистрирован: 20.09.2013

А какой смысл в нем? Скетч сканера, который выше, выведет вам в монитор порта команду управления в RAW-формате.

Далее с помощю библиотеки IRremote отправляете команду вкратце вот так:


/*******************************************************************************************************************************
Pin 6 IR-led (ИК-светодиод. Пин можно выбрать в файле IRremoteInt.h между 5,6,9,11,46 для Arduino Mega)
*******************************************************************************************************************************/
#include <IRremote.h> // Подключение библиотеки для работы с IR-светодиодом
IRsend irsend;
unsigned int ConditionerOff[349] = {660, 17500, 3000, 8900, 500, 500, 500, 1500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1500, 500, 500, 500, 500, 500, 1500, 500, 500, 500, 500, 500, 1500, 500, 500, 500, 1500, 500, 1500, 500, 1500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1500, 500, 1500, 500, 1500, 500, 1500, 500, 3000, 3000, 8900, 500, 1500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1500, 500, 500, 500, 500, 500, 1500, 500, 500, 500, 1500, 500, 1500, 500, 1500, 500, 1500, 500, 1500, 500, 1500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 3000, 3000, 8900, 500, 1500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1500, 500, 500, 500, 500, 500, 1500, 500, 1500, 500, 1500, 500, 1500, 500, 500, 500, 1500, 500, 1500, 500, 1500, 500, 500, 500, 1500, 500, 500, 500, 1500, 500, 1500, 500, 500, 500, 500, 500, 500, 500, 1500, 500, 1500, 500, 1500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1500, 500, 1500, 500, 500, 500, 1500, 500, 1500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1500, 500, 1500, 500, 1500, 500, 1500, 500};

void setup(){
}; 

void loop(){
 irsend.sendRaw(ConditionerOff, 349, 38);
delay (10000);
};
Trainer
Offline
Зарегистрирован: 20.09.2013

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

можно запомнить какой то определенный режим (режим работы кондиционера, температура, режим работы заслонки, сила ветродуйки),

и отправкой этой команды привести кондиционер в определенный режим.

В моем случае я использую несколько предустановок:

1 Выключен

2 Охлаждение

3 Максимальное охлаждение

4 Нагрев

5 Максимальный нагрев

6 Проветривание

ЕвгеничЪ
Offline
Зарегистрирован: 30.09.2013

Trainer, да, я понимаю про режимы.

А скетч попросил у Вас в надежде узреть там что то упущенное мною.

Скетч для считывания сигнала с пульта дал мне вот такой результат (это включение кондиционера):

unsigned int IRsignal[139] = {8820, 4340, 660, 1560, 680, 520, 640, 520, 640, 1560, 680, 1560, 680, 500, 660, 500, 660, 500, 660, 540, 620, 1580, 660, 500, 660, 1580, 660, 500, 680, 480, 660, 500, 680, 500, 660, 520, 640, 520, 660, 480, 680, 500, 660, 500, 660, 1580, 660, 1560, 680, 480, 680, 520, 640, 520, 640, 500, 660, 520, 660, 1560, 680, 520, 640, 1560, 660, 540, 640, 520, 640, 1560, 680, 520, 640, 19460, 680, 520, 640, 520, 640, 540, 640, 520, 640, 520, 640, 520, 640, 520, 640, 540, 640, 520, 640, 520, 640, 520, 640, 520, 660, 520, 640, 1560, 660, 540, 640, 520, 640, 520, 640, 520, 640, 540, 620, 540, 640, 520, 640, 520, 640, 520, 660, 520, 640, 520, 640, 520, 640, 540, 620, 520, 660, 1560, 660, 1580, 660, 1580, 660, 1560, 680};

Пробовал отправлять именно в таком виде... пробовал двукратное отправление... пробовал двукратное, но во второй пачке убирал 8820... пока что успехов не принесло ((

Trainer
Offline
Зарегистрирован: 20.09.2013

Ну не знаю тогда. Считывали скетчем который  давал? ИК-передатчик точно работает?

Можно еще подключить к звуковой карте ИК-приемник и посмотреть как в действительности выглядит сигнал, и сколько реально в нем посылок, хотя скетч не должен ничего отрезать, даже если например держать кнопку громкости на пульте от телевизора, он будет долго сыпать цифрами и на повторы ему начихать.

С радостью бы попробовал сам, но ни у кого из знакомых именно Panasonic-a нет.

PS в этом топике есть ссылка на управление панасоником, так вот на вскидку они там отправляют код длиной толи 182 толи 188

ЕвгеничЪ
Offline
Зарегистрирован: 30.09.2013

Разными считывал, в том числе и тем, который Вы давали. Передатчик проверялся регулярно камерой телефона - мигает, потом проверялся второй ардуиной на прием - принимает.

Как раз подумываю о подключении к звуковой карте, вот только задача... как потом его интерпретировать в массив периодов?

У меня не Панасоник, у меня Gree, хотя кто их разберет с чего этот Gree слизан.

Trainer
Offline
Зарегистрирован: 20.09.2013

ну можно и интерпретировать, но думаю вам это не нужно.

я бы сделал так: вопревых сграбил звуковой картой один и тот же сигнал несколько раз, сопоставил, чтобы убедиться что он каждый раз одинковый. Вовторых там вы увидите сколько реально пакетов (между ними будут длинные разрывы) и посчитаете сколько реально марков и спейсов передается. Считать их длительности нет особого смысла у вас там одни и теже цифры в основном 500 и 1500 (ну или 600 и 1600) спокойненько можете выписать все на бумажку, то что они чуть чуть разные не принципиально, это погрешность, не бойтесь их округлить (посмотрите на мой код)

ЕвгеничЪ
Offline
Зарегистрирован: 30.09.2013

Trainer, хорошо, попробую так сделать. Напишу о результатах.

ЕвгеничЪ
Offline
Зарегистрирован: 30.09.2013

Считал сигнал пульта с помощью диода и звуковой карты.

По информации из инета, я полагал, что кодирование сигнала происходит за счет низкого уровня, т.е. за счет минимумов на изображении. В таком случае эта пауза считается как пауза или же все таки нет?

 

На изображении насчитал 69 максимумов и 68 минимумов, включая длинный, который, все же похоже является паузой. При подсчете не учитывал первые максимум и минимум, те, которые, якобы, обозначают начало посылки.

Кстати, при считывании пульта с помощью IRrecvDump этого длинного минимума в массиве нет, а при считывании скетчем, преложенным ув. Trainer этот минимум есть, и имеет он длинну аж 19460 или около того.

ИТОГО имеем 139 значений в массиве, так же как и в результатах использования скетча от Trainer, т.е. казалось бы результат в 139 символов подтвержден, но кондиционер молчит как партизан.

 

Добавлено:

Сейчас вручную еще раз пересчитал пики на картинке... вручную написал предполагаемый массив, получилось вот это:

 

9000, 4500, 600, 1600, 600, 600, 600, 600, 600, 1600, 600, 600, 600, 1600, 600, 600, 600, 600, 600, 1600, 600, 1600, 600, 1600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 1600, 600, 1600, 600,  600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 1600, 600, 600, 600, 1600, 600, 600, 600, 600, 600, 1600, 600, 600, 600, 19500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 1600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 1600, 600, 1600, 600

кондей молчит...

Trainer
Offline
Зарегистрирован: 20.09.2013

а должен работать...

А этот скетч у вас работает?

из него теоретически вручную можно РАВ собрать и сравнить с тем что у вас получилось при оцифровке,

если, конечно, у вас не другой протокол какой нибудь

ЕвгеничЪ
Offline
Зарегистрирован: 30.09.2013

Нет, этот у меня не работает...

я даже списывался с автором на предмет команды, но он мне мол ответил, что вон там есть скетч, который перебирает некоторые режимы... 

короче у меня кондей и его проигнорировал...

 

чую, что ошибка где то на поверхности, но вариантов пока не осталось куда копать...

частоты пробовал от 30 до 56... может железо (в частности диод) чем то не подходит, но пробовал штуки три, два одинаковых и один какой то из местного магазина, зеленоватого оттенка...

ЕвгеничЪ
Offline
Зарегистрирован: 30.09.2013

 

Сграбил сигнал пульта с помощью звуковой карты, но на другом компе. Удивительно, но максимумы и минимумы поменялись местами, хотя их набор остался тот же. Т.е. получили как бы перевернутую картинку. Максимумы стали минимумами и наоборот.

Как я понимаю в RAW массиве интервалов чередуется горение и "молчание" передающего ИК диода.

Как бы попробовать заставить работать его по перевернутой схеме? Может быть в этом дело?

Artemiy
Offline
Зарегистрирован: 20.10.2014

Дабы не создавать новую тему, позволю спросить здесь. Да и тему стоит обновить. Или все уже разобрались и спокойно управляют кондеем с Ардуины? ;)

Меня интересует: для полноценной работы нужно два усттройства: приемник для считывния кодов, и передатчик для отправки сигнала в ик-приемник кондея? Или один?

Приемник нашел: http://www.ebay.com/itm/130964527002?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649 подойдет такой?

Нужно ли еще такой покупать для передачи сигнала в ик-приемник кондея: http://www.ebay.com/itm/110950917804?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

И еще, такой трансивер что будет делать? Отсылать или принимать сигнал? Не совсем разобрался. http://www.ebay.com/itm/Electronic-Bricks-Infrared-Sensor-IR-Transmitter-Module-DC-5V-/191237976710?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item2c86abf286

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

На последнем написано,что это передатчик.
Приёмник - они различаются частотой, как правило в маркировке две последних цифры. В этом вроде 38.
Передатчик точно нужен (2 ссылка, или, если лень навеску добавлять,то третья ссылка). А приёмник - смотря для чего.

sergiocharm
Offline
Зарегистрирован: 01.02.2016

Помогите не могу разобраться.

Подключаю ИК приемник и ИК передатчик к ардуине, а что дальше делать не знаю. Считал коды кнопок пульта от телика, так же от пульта колонок. Хочу управлять пультом ТВ пультом колонок. У Осипова беру вот такой скетч

// урок от Дмитрия Осипова. ИК-передатчик для компьютера. IR transceiver for PC. Infrared Transmitter for PC
// ВАЖНО !!! (PIN 3;) вЫход ИК передатчика ((PIN 3;)на другой пин изменить нельзя)
#include <IRremote.h> // это скачанная библиотека 

#define PanasonicAddress      0x4004  

#define P1        0x1000809  //ВАЖНО !!! ( 1000809 ) это код кнопки №1 - моего пульта от телевизора Panasonic - у вашего пульта будет другой код - замените на свой
#define P2        0x1008889  
#define P3        0x1004849 
#define P4        0x100C8C9 
#define P5        0x1002829 
#define P6        0x100A8A9 

#define JVC1      0xFB05 //( FB05 ) это код кнопки пульта от видеокамеры JVC (ZOOM)
#define JVC2      0xFB85

IRsend irsend;

void setup()
{
  Serial.begin(9600);   //установка порта на скорость 9600 бит/сек
}
void loop()
{
  while (Serial.available() == 0); //функция  Serial.аvailable() проверяет, есть ли в COM порте доступные для чтения данные, мы будем «топтаться» на месте и ожидать данные.
  int val = Serial.read() - '0'; 
  if (val == 1) irsend.sendPanasonic(PanasonicAddress,P1);   //если с COM порта поступил символ (1), начинаем отправлять через пин №3 (там ИК передатчик),- код кнопки №1 - моего пульта от телевизора Panasonic 
  if (val == 2) irsend.sendPanasonic(PanasonicAddress,P2);
  if (val == 3) irsend.sendPanasonic(PanasonicAddress,P3); 
  if (val == 4) irsend.sendPanasonic(PanasonicAddress,P4);
  if (val == 5) irsend.sendPanasonic(PanasonicAddress,P5);
  if (val == 6) irsend.sendPanasonic(PanasonicAddress,P6);
  if (val == 7) irsend.sendJVC(JVC1, 16,0);
  if (val == 8) irsend.sendJVC(JVC2, 16,0);
    
 }  

Меняю на свои кнопки но ничего не получается. Я думаю проблема в

#define PanasonicAddress      0x4004  

У меня у пульта оно другое же должно быть да?

sergiocharm
Offline
Зарегистрирован: 01.02.2016

я не в тему написал. Но может все таки поможете?

пульт от колонок микролаб, как узнать его секретный код?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

секретный define код?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

секретный define код?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

секретный define код?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

секретный define код?

sergiocharm
Offline
Зарегистрирован: 01.02.2016

Это ж надо 4 раза простебался....

Протокол пульта как узнать?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

боьше никто не занимается управлялкой кондишина??

Artemiy
Offline
Зарегистрирован: 20.10.2014

Все уже зауправляли и сидят под ним прохлаждаются.

А в чем вопрос?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

есть примеры программ? Ну те, что давно в инете лежат - я видел, там больше недостатков.

Artemiy
Offline
Зарегистрирован: 20.10.2014

У меня исключительно под свои нужды. Одна прога через HTTP шлет сигнал, вторая через Vera и MySensors отсылает 2 сигнала. Включить и выключить кондей. Работает на "глючной" библиотеке IRLib.

Код через Ethernet шилд.

/*
  Web Server

 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe

 */

#include <SPI.h>
#include <Ethernet.h>
#include <IRLib.h>

int RECV_PIN =  8;
unsigned long rcvcode;
unsigned long rcvcode1;

boolean incoming = 0;

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 0, 202);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

IRsend irsend;

String readString;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
//  while (!Serial) {
//    ; // wait for serial port to connect. Needed for Leonardo only
//  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
//    HTTP_DEF http_def = readHTTPRequest(client);
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    readString="";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        if (readString.length() < 100) {

          //store characters to string 
          readString += c; 
        } 

//        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
//          client.println("Refresh: 60");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    char testChar1[11];
            if (readString.substring(0, 3)=="GET") {
            readString.substring(8, 18).toCharArray(testChar1, 11);
            rcvcode=strtol(testChar1, NULL, 16);
            Serial.println(rcvcode);
            Serial.println(rcvcode, HEX);

            irsend.send(NEC, rcvcode, 32);
            }
    Serial.println("client disconnected");
  }
}

Код для MySensors

#include <MySigningNone.h>
#include <MyTransportNRF24.h>
#include <MyTransportRFM69.h>
#include <MyHwATMega328.h>
#include <MySensor.h>
#include <SPI.h>
#include <IRLib.h>

#define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 1 // Total number of attached relays
#define RELAY_ON 1  // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay
#define switchOnIRcode  0x12481110  // On  IR code
#define switchOffIRcode 0x12484810  // Off IR code

IRsend irsend;
// NRFRF24L01 radio driver (set low transmit power by default) 
MyTransportNRF24 radio(RF24_CE_PIN, RF24_CS_PIN, RF24_PA_LEVEL_GW);  
//MyTransportRFM69 radio;
// Message signing driver (none default)
//MySigningNone signer;
// Select AtMega328 hardware profile
MyHwATMega328 hw;
// Construct MySensors library
MySensor gw(radio, hw);

void setup()  
{   
  // Initialize library and add callback for incoming messages
  gw.begin(incomingMessage, AUTO, true);
  // Send the sketch version information to the gateway and Controller
  gw.sendSketchInfo("IR Relay", "1.0");

  // Fetch relay status
  for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
    // Register all sensors to gw (they will be created as child devices)
    gw.present(sensor, S_LIGHT);
    // Then set relay pins in output mode
    pinMode(pin, OUTPUT);   
    // Set relay to last known state (using eeprom storage) 
    digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
  }
}

void loop() 
{
  // Alway process incoming messages whenever possible
  gw.process();
}

void incomingMessage(const MyMessage &message) {
  // We only expect one type of message from controller. But we better check anyway.
  if (message.type==V_LIGHT) {
     // Change relay state
     int incomingRelayStatus = message.getInt();
     // Emit the IR ON/OFF code
     irsend.send(NEC, (incomingRelayStatus == 1 ? switchOnIRcode : switchOffIRcode), 32);
     // Sync gateway of the light switch state
     gw.saveState(message.sensor, message.getInt());
   } 
}

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

можно более детальное обьяснение: что делают эти два кода?

Artemiy
Offline
Зарегистрирован: 20.10.2014

В первом открываешь в браузере http://192.168.0.200/?0x00012345

И он в кондей отправляет этот код.

Второй - работает через шлюз Vera от MicasaVerde и ардуиновский шлюз. Надо курить mysensors.org

Работает по принципу реле. Включил, Выключил. Соответственно коды включения я заменил на коды от своего кондиционера, предварительно считав их с родного пульта.

PS: Вообще тут такие специалисты сидят с яйцами до колен, что мне даже стыдно свой чайниковский код выкладывать, собранный по примерам из интернетов. ;)

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

спасибо. а чем считывалось?

 

а еще вопрос - удобно ли удаленно управлять, может достаточно приехать и включить?

Artemiy
Offline
Зарегистрирован: 20.10.2014

Считывал стандартной прогой из комлпекта скетчей к Arduino IDE
IRrecvDump

Вариант управления выбирает каждый сам по своему удобству и усмотрению. У меня шиншиллы живут. Для них приходится и удаленно включать, когда никого дома нет. Сами они не догадаются.

slideruno
Offline
Зарегистрирован: 26.06.2016

Short Circuit пишет:

боьше никто не занимается управлялкой кондишина??

День потратил на изучение  управление кондиционером с помощью ir и arduino. В итоге кондиционер сдался.

Вопросы, которые были сняты:

1. Как с помощью UNO реализовать ВКЛ\ВЫКЛ кондиционера.

2. Изменение состояния кондиционера (изменение температуры, режима работы и т.д.)

Инструменты: UNO + IR-диод + tsop(остался от lasertag) или CHQ1858 из набора

В итоге:

-частота работы передачтика/приемник - 38кГц. Пришлось выпаять ir-диод из пульта и заменить имеющимся (брал UNO + старт набор у китайцев), что бы доказать себе возможность работы;

-сигнал грабил стандартными примерами библиотеки IRremote.h. Сигналы от пульта телевизора, аудиоцентра и т.д. легко грабились и управлялись. С сигналом от кондиционера пришлось более подробно изучить передачу сигнала по ir(жаль нет осциллографа :( ). Оказалось, что длина сигнала от пульта кондиционера длинее, чем например от телевизора. Стандартные настройки библиотеки IRremote.h рубят значение буфера приема сигнала "Length of raw duration buffer" не более 100, остальное отсекает. В моем случае, сигнал ВКЛ кондиционера составляет 227. Значение буфера было увеличено на 300 "#define RAWBUF 300"

После отправки RAW кондиционеру он пикнул и включился. Код ниже.

\\вкл
IRsignal[227] = {3740, 1380, 600, 1120, 620, 1100, 620, 400, 600, 400, 620, 400, 600, 1120, 600, 420, 580, 420, 600, 1120, 600, 1120, 600, 420, 600, 1120, 600, 400, 600, 420, 600, 1120, 600, 1120, 600, 420, 580, 1140, 600, 1120, 600, 400, 600, 420, 600, 1120, 600, 420, 580, 420, 600, 1120, 600, 400, 600, 420, 600, 400, 600, 420, 600, 400, 600, 420, 600, 400, 600, 420, 580, 420, 600, 420, 580, 420, 580, 420, 600, 420, 600, 400, 600, 420, 600, 400, 600, 400, 620, 1120, 600, 400, 600, 420, 580, 1140, 600, 400, 600, 420, 600, 1120, 600, 1120, 600, 400, 600, 420, 600, 400, 600, 420, 600, 400, 600, 420, 600, 400, 600, 400, 620, 400, 580, 1140, 600, 420, 600, 400, 600, 420, 600, 400, 600, 400, 600, 1140, 600, 400, 600, 1120, 600, 420, 580, 420, 600, 420, 580, 420, 600, 400, 600, 420, 600, 400, 600, 420, 600, 400, 600, 420, 600, 400, 600, 420, 600, 400, 600, 420, 580, 420, 600, 400, 600, 420, 580, 420, 600, 420, 600, 400, 600, 1120, 600, 420, 600, 400, 600, 420, 600, 400, 600, 420, 600, 400, 600, 420, 580, 420, 600, 400, 600, 1140, 580, 420, 600, 420, 580, 420, 600, 400, 600, 420, 600, 1120, 600, 1120, 600, 420, 600, 400, 600, 1120, 600, 420, 580, 1140, 600, 400, 600};

Дальше дело за фантацией и возможностями...

Artemiy
Offline
Зарегистрирован: 20.10.2014

Интересно. А у меня как назло все проще получилось. И передатчик сразу на 38кГц подошел, и код в нормальном виде считался. Вот только выставлять температуру я еще не пробовал. Выставил один раз температуру и только вкл/выкл делаю.

bolotin.denis
bolotin.denis аватар
Offline
Зарегистрирован: 15.09.2013

Short Circuit пишет:

боьше никто не занимается управлялкой кондишина??

Мучаю cooper&hunter команды возпроизвожу. Ща разбираю протокол...

labor
Offline
Зарегистрирован: 20.11.2015

При помощи сканера получил 2 последовательности для включения и выключение кондиционера. Кондиционер Sensei.

// OFF
unsigned int IRsignalOFF[227] = {2980, 1540, 480, 1040, 480, 1040, 480, 300, 480, 300, 460, 320, 460, 1040, 480, 300, 480, 300, 480, 1040, 480, 1040, 460, 320, 480, 1020, 480, 300, 480, 300, 480, 1040, 480, 1040, 460, 320, 480, 1020, 480, 1040, 480, 300, 460, 320, 480, 1040, 460, 320, 480, 300, 480, 1020, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 1040, 480, 300, 480, 300, 480, 1020, 500, 280, 480, 320, 460, 1040, 480, 1040, 480, 300, 460, 320, 480, 280, 500, 280, 480, 320, 460, 320, 460, 1040, 480, 300, 480, 300, 480, 1040, 480, 300, 480, 300, 460, 320, 480, 300, 460, 1040, 480, 300, 480, 1040, 480, 300, 480, 300, 480, 300, 480, 1040, 480, 300, 480, 300, 480, 300, 460, 320, 480, 300, 480, 280, 500, 300, 460, 320, 480, 300, 460, 300, 480, 300, 500, 300, 460, 320, 460, 300, 480, 300, 500, 280, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 460, 320, 480, 1040, 460, 320, 460, 1040, 480, 300, 480, 300, 480, 300, 480, 1040, 480};
// ON
unsigned int IRsignalON[227] = {3000, 1540, 480, 1040, 480, 1020, 480, 300, 480, 300, 480, 300, 480, 1040, 480, 300, 480, 300, 480, 1040, 480, 1040, 460, 300, 480, 1040, 480, 300, 480, 300, 480, 1040, 480, 1040, 460, 320, 460, 1040, 480, 1040, 480, 300, 480, 300, 480, 1040, 480, 300, 460, 320, 480, 1020, 480, 300, 480, 300, 480, 300, 500, 280, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 1040, 480, 300, 480, 300, 480, 1040, 460, 320, 480, 300, 480, 1020, 500, 1020, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 300, 480, 1040, 480, 300, 480, 300, 480, 1020, 480, 300, 500, 300, 460, 320, 460, 320, 460, 1040, 480, 300, 480, 1040, 480, 300, 480, 300, 480, 300, 480, 1040, 480, 280, 480, 320, 480, 300, 460, 320, 460, 300, 480, 300, 500, 300, 460, 320, 460, 320, 460, 300, 500, 280, 480, 320, 460, 320, 460, 300, 480, 300, 480, 300, 480, 320, 460, 320, 460, 320, 480, 280, 500, 280, 500, 300, 460, 320, 480, 300, 460, 300, 500, 280, 480, 320, 480, 300, 460, 300, 480, 300, 480, 300, 500, 300, 460, 300, 480, 300, 480, 1040, 480, 300, 480, 1040, 480, 300, 480, 300, 480, 300, 460, 1040, 500};

проблема в том, что на команду включения кондиционер включился, но выключить его не получается. Может у кого есть какие соображения на этот счет? Спасибо.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

labor, Я любые коды снимаю логическим анализатором. И без всяких библиотек, по полученной картинке,  сразу пишу программу.

no_nic
Offline
Зарегистрирован: 12.06.2016

почитал тут , посмотрел на ютуб https://www.youtube.com/watch?v=Ez2rbGADazs , заработало , RAWBUF незабываем увеличивать, остальное не критично , даже то что  при нажатии на ВКЛЮчение несколько раз (с одними и теми же параметрами на пульте) код немного отличался