ESPsmart » Блог » Управление кондиционером с ESP 8266

Управление кондиционером с ESP 8266

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

Управление кондиционером с ESP 8266


Принцип ИК передачи информации

Инфракрасное излучение не видно человеческому глазу, его регистрируют специальные болометры, фотодиоды, фоторезисторы. Принцип работы довольно прост: при нажатии на кнопку закодированная информация посылается в виде пучка инфракрасных лучей, а приемник принимает закодированный импульс и следует отправленной «инструкции».

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

Передатчик ИК сигнала

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

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

Приемник ИК сигнала

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

Форматы ИК передачи данных

Форматы передачи данных применяются в различных устройствах, чтобы другие приборы не реагировали на нажатие кнопок пульта. Используются 2 основных формата: RC5 протокол и NEC протокол.

Также устройства могут передавать информацию в других форматах: JVC, ITT, Mitsubishi, Nokia NRC 17, Philips RC 6, Philips RC-ММ, Samsung, Sharp, Sony SIRC, Philips RECS 80, RCA протокол, X-Sat протокол и другие

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

Схема подключения ИК приемника

Для начала соберем ИК приемник, согласно схеме ниже. На схеме представлен модуль IR Reciver, но можно собрать и на отдельном ИК приемнике


Скетч для IR Reciever

Загружаем на плату скетч ниже.

Примечание. В скетче представлено более детальное получение данных от ИК передатчика. Его удобно использовать, если HEX кода не достаточно и нужны дополнительные данные для управления устройством.
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRac.h>
#include <IRutils.h>

const uint16_t kRecvPin = 2; // D4, ПИН подсоединения ИК приемника  
const uint32_t kBaudRate = 115200; // Скорость соединения с последовательным портом
const uint16_t kCaptureBufferSize = 1024; //  Размер буфера

// kTimeout - задержка в милисекундах для в получении нескольких пакетов сообщений
// ИК протоколы кондиционеров часто используют значение 20-40 мс

#if DECODE_AC
const uint8_t kTimeout = 50; // Задержка в милисекундах для получения нескольких пакетов сообщений
#else
const uint8_t kTimeout = 15;
#endif

const uint16_t kMinUnknownSize = 12; // Минимальный размер неизвестных случайных данных, позволяет снизить инфракрасный шум

IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, true);
decode_results results;

void setup() {
#if defined(ESP8266)
  Serial.begin(kBaudRate, SERIAL_8N1, SERIAL_TX_ONLY);
#else
  Serial.begin(kBaudRate, SERIAL_8N1);
#endif
  while (!Serial)  // Ожидание установления соединения с последовательным портом
    delay(50);
  Serial.printf("\nОжидаем ИК сигнал для его считывания, ПИН: "
                "%d\n", kRecvPin);
#if DECODE_HASH
  irrecv.setUnknownThreshold(kMinUnknownSize);
#endif
  irrecv.enableIRIn();
}

void loop() {
  // Проверяем, есть ли ИК код
  if (irrecv.decode(&results)) {
    // Display a crude timestamp.
    uint32_t now = millis();
    Serial.printf("Timestamp : %06u.%03u\n", now / 1000, now % 1000);
    if (results.overflow)
      Serial.printf(
          "Предупреждение: ИК код превышает буфер (>= %d). "
          "Полученные значения неверные, увеличьте буфер kCaptureBufferSize.\n",
          kCaptureBufferSize);
    Serial.println("Library : v" _IRREMOTEESP8266_VERSION_ "\n");
    Serial.print(resultToHumanReadableBasic(&results));

    String description = IRAcUtils::resultAcToString(&results);
    if (description.length()) Serial.println("Description: " + description);
    yield();
    
    Serial.println(resultToTimingInfo(&results));
    yield();
    
    Serial.println(resultToSourceCode(&results));
    Serial.println();
    yield();
  }
}


Получение данных

Включаем устройство. Открываем монитор порта. Нажимаем на кнопку пульта управления, к примеру "Включение".

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




Схема подключения ИК передатчика


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

Скетч для IR Transmitter


В скетч представленный ниже вставляем ваши данные снятые с ИК пульта кондиционера. В зависимости от производителя необходимо выбрать метод библиотеки. У нас Panasonic, поэтому используем sendPanasonicAC. Список всех методов можно найти здесь в классе IRsend.

Включаем устройство и загружаем скетч.

#include <IRremoteESP8266.h> //  Подключаем библиотеку IRremoteESP8266
#include <IRsend.h>

const uint16_t kIrLed = 4;  // D2, рекомендованный ПИН ИК передатчика
IRsend irsend(kIrLed);

uint8_t state[27] = {0x02, 0x20, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x06, 0x02, 0x20, 0xE0, 0x04, 0x00, 0x3D, 0x26, 0x80, 0x72, 0x0C, 0x00, 0x0E, 0xE0, 0x00, 0x00, 0x81, 0x00, 0x00, 0xD6};

void setup() {
  Serial.begin(115200);
  irsend.begin();  // Инициализируем ИК передатчик
}

void loop() {
  irsend.sendPanasonicAC(state); // Отправляем данные на кондиционер
  delay(2000);
}

Оставить комментарий

  • Кликните на изображение чтобы обновить код, если он неразборчив