ИК пульт проблема в кодировке

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

Здравствуйте Участники форума, помогите разобраться.

Собрал схему на ардуино нано с ик приемником, и есть пульт от кондиционера. При попытке с читывания с него кодов кнопок некоторые выдаются с одинаковым кодом, например выбор температуры на +16 градусов совпадает с 1-ой скоростью вентилятора, а температура +18 градусов, с кнопкой выбора автоматической регулировки скорости вентилятора. Иззачего такое возможно ведь посути у каждой кнопки должен быть свой код. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А какова разрядность кода?

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

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

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

Приемник вроде на 36 библиотека стандартная ардуиновская, из всех кодов пульта повторяются только три кода всего 27, коды выдаются стабильно. Пульт универсальный для кондиционеров (HUAYU Q-1000E)

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

про разрядность незнаю, а как его можно проверить

 

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Dragon_Kursk пишет:

Здравствуйте Участники форума, помогите разобраться.

Собрал схему на ардуино нано с ик приемником, и есть пульт от кондиционера. При попытке с читывания с него кодов кнопок некоторые выдаются с одинаковым кодом, например выбор температуры на +16 градусов совпадает с 1-ой скоростью вентилятора, а температура +18 градусов, с кнопкой выбора автоматической регулировки скорости вентилятора. Иззачего такое возможно ведь посути у каждой кнопки должен быть свой код. 

Учтите только одну вещь, с пультами от любого кондиционере есть одна проблемка. Когда вы нажимаете на любую кнопку, пульт посылает весь пакет информации который в нём есть. То есть например пульт настроен на 24°С,охлаждение и т.д. . Когда вы читаете (записываете) код команды ВКЛ/ВЫКЛ, на самом деле вы записываете команду 24°С,охлаждение, ВКЛ/ВЫКЛ и т.д. . После, я так понимаю вы собираетесь управлять кондиционером при помощи ардуинки, так вот если он был настроен на 30°С, нагрев , и т.д. и т.п. и вы пошлёте эту команду думая что вы просто включаете его, на самом деле вы его перенастроете на 24°С,охлаждение, ВКЛ.

Примите это к сведенью :).

Вот пара ссылок, почитай на досуге

https://vk.com/topic-54138417_30293323

https://www.youtube.com/watch?v=Ez2rbGADazs

http://geektimes.ru/post/258012/

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

Затея втом что бы сделать самодельную электронику для управления кондиционером (Переделка оконного кондицыонера) с управлением от пульта. Примерно как https://www.youtube.com/watch?v=KOk0yA-wkGY

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

Тс, коды в студию.

для более точного распознавания надо несколько раз тыкать в считыватель родным пультом. Универсальный дает погрешность. На то он и угиверсальный. Я свой кондей завел с ардуины. Там посылается один код. Только вкл, например. И только выкл. Если последняя установленная температура была 22 градуса, то он так и оставляет. Поэтому заранее выставив нужную температуру, можно только включать и выключать кондей. Использовал библиотеку irlib.

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

Про кодировку: ик отсылает 16-ричный код команды. В чем отсылать - не важно. Можно послать 10-чный аналог - число все равно будет то же.

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

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

вот код


#include "IRremote.h"

//вход ик приёмника к 11
const 
int IR_PIN = 11; // пин ик приемника
int ind = 5; // пин диод индикатора

//создаём объект ик приёмника
IRrecv irrecv(IR_PIN);
decode_results results;

void setup (){
 Serial.begin(9600);
 Serial.println("ready TYPE 057");
 //начинаем прослушивание ик сигналов
 irrecv.enableIRIn(); //запуск приемника
 pinMode(ind, OUTPUT);
}

void loop() {
  if (irrecv.decode(&results)) {
    //Serial.println(results.value);
    Serial.println(results.value, HEX);
      if (results.value== 0x1643BCF0) {//кнопка выключения
       Serial.println("Off");
    //digitalWrite(2,HIGH);
    //digitalWrite(3,LOW);
    }
    if (results.value== 0x164DB2F0) {//Кнопка включения
    Serial.println("On");
    }
    if (results.value== 0x164AB5F0) {//кнопка открытия заслонки
    Serial.println("A.SWING");
    }
    if (results.value== 0x1646B9F0) {//кнопка авто движения заслонки
    Serial.println("M.SWING");
    }
    if (results.value== 0x1648B78F) {//
    Serial.println("+ 16");
    }
    if (results.value== 0x1648B780) {//
    Serial.println("+ 17");
    }
    if (results.value== 0x1648B788) {//Код совпадает с hol FAN 3
    Serial.println("+ 18");
    }
    if (results.value== 0x1648B784) {//Код совпадает с hol FAN 2
    Serial.println("+ 19");
    }
    if (results.value== 0x1648B78C) {//
    Serial.println("+ 20");
    }
    if (results.value== 0x1648B782) {//Код совпадает с hol FAN 1
    Serial.println("+ 21");
    }
    if (results.value== 0x1648B78A) {//
    Serial.println("+ 22");
    }
    if (results.value== 0x1648B786) {//
    Serial.println("+ 23");
    }
    if (results.value== 0x1648B78E) {//
    Serial.println("+ 24");
    }
///////////////Охлаждение 
    if (results.value== 0x1648B7F0) {//Кнопка MODE выбранного режима охлаждения
    Serial.println("hol");
    }
    if (results.value== 0x1648B782) {//Кнопка вентилятор 1
    Serial.println("hol FAN 1");
    }
    if (results.value== 0x1648B784) {//Кнопка вентилятор 2
    Serial.println("hol FAN 2");
    }
    if (results.value== 0x1648B788) {//Кнопка вентилятор 3
    Serial.println("hol FAN 3");
    }
    if (results.value== 0x1648B781) {//Кнопка вентилятор 2
    Serial.println("hol FAN Avto");
    }
    irrecv.resume(); // Receive the next value
  }
}
 
Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

При загрузке такого текста в микроконтроллер

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  } 
  else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  } 
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  } 
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  } 
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == PANASONIC) {
    Serial.print("Decoded PANASONIC: ");
  }
  else if (results->decode_type == JVC) {
    Serial.print("Decoded JVC: ");
  }
  
  int val1 = results->value;
  Serial.print(val1, HEX);
  Serial.print(" (");
  int valbits = results->bits;
  Serial.print(valbits, DEC);
  Serial.println(" bits)");
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");

  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      int valen = results->rawbuf[i]*USECPERTICK;
      Serial.print(valen, DEC);

    } 
    else {
      int negvalen =-(int)results->rawbuf[i]*USECPERTICK;
      Serial.print(negvalen, DEC);
    }
    Serial.print(", ");
  }
  Serial.println("");
}

void loop() {
  if (irrecv.decode(&results)) {
    int hexen = results.value;
    Serial.println(hexen, HEX);
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}

 

 
на нажатие тех двух кнопок которые повторяются терминал выдал такую писанину
 
Decoded NEC: FFFFB788 (32 bits)
Raw (84): 5764, 9050, -4450, 550, -500, 550, -500, 550, -500, 550, -1750, 550, -500, 550, -1700, 550, -1750, 550, -500, 550, -500, 500, -1750, 550, -500, 550, -550, 500, -1750, 550, -500, 550, -500, 550, -450, 500, -1750, 550, -500, 550, -1700, 550, -1750, 550, -500, 550, -1700, 550, -1750, 500, -1750, 550, -1700, 550, -500, 550, -500, 550, -500, 550, -1750, 550, -500, 550, -500, 550, -400, 550, -550, 500, -1750, 550, -1700, 550, -1700, 550, -550, 550, -1700, 550, -1700, 550, -1650, 650, 

Decoded NEC: FFFFB788 (32 bits)
Raw (84): 5966, 9050, -4450, 550, -500, 550, -500, 550, -500, 550, -1750, 550, -500, 550, -1700, 550, -1750, 550, -500, 500, -550, 500, -1750, 550, -500, 550, -500, 550, -1750, 550, -500, 550, -500, 550, -450, 500, -1750, 550, -500, 550, -1750, 500, -1750, 550, -500, 550, -1700, 550, -1750, 550, -1750, 500, -1750, 550, -450, 600, -500, 500, -550, 550, -1700, 550, -550, 550, -500, 500, -500, 500, -550, 550, -1700, 500, -1750, 550, -1700, 600, -500, 500, -1750, 550, -1700, 550, -1650, 600, 

 

 
что это
 
 
Radjah
Offline
Зарегистрирован: 06.08.2014
Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

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

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

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

давайте по порядку разберем. Код, который у вас распознает сигналы с универсального пульта - работает? Он на нажатие одной клавиши выдает в сериал один результат или несколько? То есть в буфере "+20" или что-то еще?

Потом, во втором примере какие два кода вы посылаете? Вкл и выкл? Тогда он совсем не то распознает... Числа разные получаются.

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

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

во втором примере да я нажималь две разны клавиши это температура +18 и 1-ая скорость вентилятора это те кнопки которые повторяются, по первым строчкам  ( Decoded NEC:) видно они одинаковые 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

А может не обращать внимание например на то, что совпадает код температуры с кодом скорости. Если скорость будет ВАРИО, сделайте это в режиме авто, а код будет задавать только температуру.

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

P.S. Рад что мои труды так Вас вдохновили.

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

нехотелось бы урезать функфионал пульта.

Подругим также совподают и тажа кенетель а вы с какого кондея брали пульт может такая же кодировка в моем есть. 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

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

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

в данном универсальном пульте по заявлению производителя вшито 1000 моделей, чтож попробую дальше перебрать, может повезет

 

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

Перебрал все модели в универсальном пульте, все тоже самое (попадаются одинаковые кодировки кнопок), кто нибудь подскажите, что делать а то я его скоро раскалю((((.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Т.е. Меняются коды со сменой модели но всё равно коды с некоторыми кнопками одинаковые?

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

нет, сами коды разные, но взависимости от модели коды совпадают на некоторых режимах, это выбор температуры и  выбор скорости вентилятора, теесть если я ставлю одну модель то у нее похожие команды это на выбор температуры +18 совпадает с 1-ой скорость вентилятора, + 20 и скорость вентилятора авто, а если выбираю другую модель то +24 с 3-ей скоростью, а есть модель где коды совпадают сразу с +19 и 1-ая скорость, +21 и 2-скорость, +22 и 3-я скорость. и так по всем моделям где совпадает 2-е команды, где сразу четыре, некоторые модели кондицыонеров вообще не определяет или при нажатии одной и тойже кнопки код каждый раз новый. Мне кажется что стандартная библиотека не отлавливает весь код.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

пульт такой?

 

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

Нет, вот такой

 

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

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

Dragon_Kursk
Offline
Зарегистрирован: 01.09.2015

hugoboss317  А почему вы в своем проэкте использовали отдельный микроконтроллер для ик датчика.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Потому что:

Во-первых  на контроллере Atm32 библиотеки ИК и сервы конфликтовали между собой и мне пришлось их корректровать под таймеры вышеупомянутого контроллера, или нужно было переписывать бибу под использование другого таймера но это не главная причина...

во-вторых когда на одном контроллере навешано много железа, то ему нужно время чтоб всё обработать и в это время "летит" ИК импульс который просто игнорируется, а если ИК приёмник будет обрабатываться отдельным контроллером и только он, вероятность выполнения команды почти 100%

inspiritus
Offline
Зарегистрирован: 17.12.2012

На логическом анализаторе наблюда могочисленные пакеты при нажатии кнопки пульта кондея митсубиши

skoctehs
Offline
Зарегистрирован: 27.02.2016

тут мой код (не использую  IRremote.h)

http://arduino.ru/forum/programmirovanie/sketch-dlya-pokupnogo-ik-pulta#comment-173491

раскоментируйте serial.print = через терминал увидите код своих кнопок