Написать пост

Управление кондиционером через интернет на базе ESP8266

Как управлять сплит-системой не оснащенной WiFi со смартфона? Превращаем обычный кондиционер в умный. 

Пришло лето, а следом и жара. Температура растет, а вместе с ней и желание включить кондиционер. Нет ничего проще, чем нажать кнопку на пульте и выставить комфортную температуру.

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

В этой статье мы рассмотрим, как с помощью современных технологий, а главное за «копейки» научить наш бюджетный кондиционер работать через Интернет. Все просто — DIY: покупаем у китайцев микроконтроллер ESP8266 NodeMcu (160 рублей), ИК-приемник/передатчик (70 рублей), заливаем прошивку, устанавливаем приложение на Android.

Принцип работы

Пульт от кондиционера включает в себя инфракрасный передатчик — ИК светодиод, через который передается сигнал на ИК приемник. Каждая кнопка пульта передает уникальный сигнал — последовательность импульсов. В нашем проекте мы будем считывать сигнал с пульта и повторять его через приложение на Android, тем самым управляя кондиционером.

Управление будет происходить на примере самой бюджетной сплит-системы DEXP AC-R07OMA/W.


Шаг 1. Перехват сигнала с пульта

Перехватывать сигнал будем при помощи контроллера и ИК-приемника. 

Контроллер можно использовать любой, будь то ESP или arduino. В моем случае использовалась Arduino Nano. 

Собираем на макетной плате по следующей схеме (data в D2):

Фото вдогонку:


Заливаем на ардуину следующий скетч:

// Выход ИК приемника подкючаем к пину D2
#define LEDPIN 13     // Индикатор приема - зажигаем светодиод
#define maxLen 800   //Длина приемного буфера,можно увеличить это значение для Arduino с более чем 2k SRAM
volatile  unsigned int irBuffer[maxLen]; //Буфер хранения данных (времени срабатывания прерываний)
volatile unsigned int x = 0;
void setup() {
  Serial.begin(9600);
  attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);//Настройка прерывания для приема ИК-сигнала
}
void loop() {
  Serial.println(F("Ожидаем нажатия кнопки на пульте"));
  delay(5000); // Пауза 5 сек
  if (x) { // если сигнал захвачен
    digitalWrite(LEDPIN, HIGH);// Зажечь индикатор приема сигнала
    Serial.println();
    Serial.print(F("Raw: (")); // Заголовок raw  дампа
    Serial.print((x - 1));
    Serial.print(F(") "));
    detachInterrupt(0);
    for (int i = 1; i < x; i++) {
      if (!(i & 0x1)) Serial.print(F(""));
      Serial.print(irBuffer[i] - irBuffer[i - 1]);
      Serial.print(F(","));
    }
    Serial.println();
     for (int n = 3; n < x; n++) {
      if (!(n & 0x1)) {
        if ( (irBuffer[n] - irBuffer[n - 1]) > 1000 ) {
          Serial.print("1");
        } else {
          Serial.print("0");
        }
        if ( ((n -2) % 8 ) == 0 ) {
          Serial.print(" ");
        }
      }
    }
    x = 0;
    Serial.println();
    Serial.println();
    digitalWrite(LEDPIN, LOW);//Выключение индикатора приема
    attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);//Переназначить прерывание для приема ИК-сигнала
  }
}
void rxIR_Interrupt_Handler() {
  if (x > maxLen) return; // игнорировать, если irBuffer уже заполнен
  irBuffer[x++] = micros(); // Запись времени изменения сигнала
}

Далее открываем монитор порта в Arduino IDE, подносим пульт от кондиционера к ИК-приемнику, нажимаем кнопку, которой хотим управлять дистанционной, смотрим перехваченный сигнал кнопки в строке «Raw»:


Запоминаем все считанные сигналы и переходим к следующему шагу.

Шаг 2. Собираем устройство

Для передачи сигнала на кондиционер нам понадобится плата esp8266 nodemcu v3 (можно использовать другие версии esp8266) с WiFi модулем на борту и ИК-светодиод.


Для удобства и при наличии 3d-принтера можно распечатать корпус для платы:

ИК-светодиод паяем длинной ногой к пин D2, короткой к GND:


Скачиваем приложение на свой смартфон «Blynk». Регистрируемся в приложении, указав свой E-mail адрес. После регистрации, в настройках приложения отправляем на свой почтовый адрес токен/ключ (в разделе «Create New Project» — «AUTH TOKEN»). Токен нам понадобится далее в скетче. Для создания проекта нажимаем в приложении кнопку «Create», затем в новом окне в верхней части экрана кликаем по кнопке «Добавить» (круглая кнопка с плюсом). В меню «Widget Box» выбираем «Button».

Добавляем четыре кнопки, как указано на скриншоте:


Отредактировав виртуальные кнопки, кликаем по кнопке «Пуск» (кнопка в виде треугольника). Все, наше приложение готово:


Для того, чтобы наше приложение начало работать, необходимо залить скетч на контроллер ESP8266.

Вставляем в скетч вместо «ХХХ....», отправленный ранее на почту токен, а также логин и пароль от домашней WiFi сети.

В переменных «buttonON», «buttonOFF», «button24», «button20», «button18» вставляем сигналы, полученные в первом шаге статьи с кнопок пульта. Не забываем указывать длину (например buttonON[199]). Думаю, здесь все понятно.

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char auth[] = "XXXXXX";

// WiFi настройки
char ssid[] = "XXXXXX"; // Название сети
char pass[] = "XXXXXX"; // Пароль

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>

const uint16_t kIrLed = 4;  // ESP8266 GPIO. Пин по умолчанию: 4 (D2).

IRsend irsend(kIrLed);
uint16_t buttonON[199] = {4388,4428,552,1632,548,524,572,1640,576,1608,548,544,548,548,548,1636,552,544,552,544,576,1612,548,548,552,544,548,1636,576,1608,548,544,552,1640,548,548,548,548,548,520,576,1632,548,1612,572,1636,548,1636,544,1616,548,1664,548,1636,548,1636,520,572,524,576,520,572,500,596,548,548,552,548,520,1668,520,576,520,572,524,1660,496,600,520,576,520,576,524,1660,524,572,548,1640,520,1664,520,572,496,1696,496,1684,524,1660,524,5272,4336,4460,496,1684,496,580,492,1716,496,1688,496,600,496,576,544,1636,548,576,544,552,548,1640,520,572,552,544,496,1688,520,1660,524,572,524,1664,524,576,496,600,544,548,500,1684,524,1660,520,1660,496,1664,572,1636,496,1692,524,1660,548,1632,496,600,500,596,524,572,472,624,496,600,496,600,472,1716,524,572,496,596,524,1660,472,624,496,600,496,600,496,1688,472,624,524,1664,496,1684,524,572,472,1716,472,1712,520,1664,520};
uint16_t buttonOFF[199] = {4412,4388,548,1660,496,596,500,1664,524,1656,500,596,524,596,496,1660,524,600,524,548,496,1712,528,568,500,572,524,1684,500,1656,524,572,552,1660,500,596,476,1708,500,1684,472,1712,500,1680,504,568,500,1688,552,1632,576,1640,552,540,528,568,552,544,528,568,524,1632,552,544,576,548,552,1636,552,1604,528,1660,520,596,528,568,528,544,548,544,552,572,500,596,500,572,528,592,500,1688,524,1636,524,1656,552,1656,500,1660,496,5296,4384,4412,496,1712,472,624,496,1688,500,1684,500,572,524,596,500,1680,476,624,552,520,552,1660,552,520,548,568,504,1680,500,1684,472,624,500,1664,524,596,500,1684,500,1684,500,1656,524,1684,524,572,500,1684,504,1680,504,1684,552,520,552,544,496,624,472,624,500,1680,500,596,528,572,496,1668,552,1652,552,1608,548,572,524,544,552,568,528,544,524,596,500,600,524,544,528,592,500,1664,520,1684,500,1660,524,1684,496,1688,472};
uint16_t button24[199] = {4360,4436,476,1684,576,544,500,1664,524,1680,476,624,496,572,528,1680,500,572,552,572,500,1688,552,520,572,520,528,1656,576,1632,524,544,528,1688,500,596,500,596,528,544,576,1632,524,1656,504,1680,528,1656,500,1684,528,1664,524,1632,576,1632,524,572,528,544,548,544,528,596,496,600,524,572,500,1688,528,568,524,568,528,1632,576,520,576,520,524,596,528,1660,500,592,500,1688,528,1632,576,516,552,1636,524,1660,552,1632,496,5324,4360,4412,496,1712,472,620,472,1692,496,1688,496,596,528,592,476,1708,504,596,524,572,500,1688,500,596,500,568,528,1684,496,1684,524,544,500,1692,528,592,504,592,500,596,500,1684,524,1656,528,1656,552,1608,548,1660,500,1664,496,1712,552,1628,528,568,500,596,524,572,500,592,504,596,500,596,528,1660,500,596,500,592,504,1680,500,596,524,548,548,572,528,1656,476,620,500,1664,496,1708,552,520,496,1716,500,1684,552,1632,476};
uint16_t button20[199] = {4360,4468,500,1684,472,600,520,1664,500,1708,472,624,472,624,520,1640,496,624,524,548,500,1712,496,600,520,572,476,1684,500,1708,472,600,496,1692,496,600,496,600,496,600,496,1688,496,1600,580,1712,472,1688,496,1688,496,1688,500,1684,548,1660,496,576,520,576,496,596,548,548,548,552,496,600,496,596,500,1688,496,596,500,1688,572,520,500,600,544,552,572,1640,472,1684,520,576,544,1640,524,572,496,1692,544,1660,472,1688,548,5244,4360,4432,500,1684,524,568,528,1664,548,1632,524,572,500,596,500,1680,528,572,524,572,524,1664,500,596,524,572,524,1656,524,1660,524,568,528,1664,524,572,500,596,524,568,528,1656,524,1660,500,1684,524,1656,524,1664,524,1660,528,1656,524,1660,524,572,524,572,524,572,524,568,524,572,528,568,528,572,524,1660,524,572,524,1660,524,572,524,572,524,572,528,1656,528,1656,528,568,524,1664,524,568,528,1660,524,1660,524,1660,524};
uint16_t button18[199] = {4364,4436,500,1684,472,624,524,1660,528,1628,528,596,500,596,496,1684,528,572,500,596,500,1688,496,600,500,592,552,1632,500,1684,496,596,528,1660,528,572,524,572,500,592,528,1632,548,1632,552,1632,524,1684,496,1664,576,1636,472,1688,520,1684,528,568,500,596,524,572,500,568,524,600,496,600,500,596,500,596,524,1664,496,1684,472,624,500,572,524,572,524,1684,524,1656,500,1684,500,596,524,572,548,1632,524,1660,552,1628,500,5272,4384,4384,496,1712,500,592,528,1660,528,1656,548,544,552,544,552,1632,552,544,528,568,552,1612,548,572,552,540,528,1656,552,1632,552,544,552,1636,552,548,552,516,524,596,552,1632,528,1652,556,1604,576,1632,552,1632,552,1636,576,1580,552,1656,552,544,552,544,552,520,524,592,500,600,500,596,552,520,524,596,548,1636,552,1632,552,544,552,544,552,544,552,1612,520,1684,552,1632,548,520,580,516,576,1632,552,1628,528,1656,504};
void setup()
{
  irsend.begin();
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
}

void loop()
{
  Blynk.run();
}

// Переключатель ВКЛ/ВЫКЛ
BLYNK_WRITE(V1)
{
  int value = param.asInt(); // Получить значение как целое число
  Serial.println(value);
  if(value == 0){
    irsend.sendRaw(buttonON, 199, 38);
    Serial.println("Включение кондиционера");
  }else if(value == 1){
    irsend.sendRaw(buttonOFF, 199, 38);
    Serial.println("Выключение кондиционера");
  }
}

// 24 градуса
BLYNK_WRITE(V2)
{
  int value = param.asInt(); // Получить значение как целое число
  Serial.println(value);
  if(value == 0){
    irsend.sendRaw(button24, 199, 38);
    Serial.println("24 градуса");
  }
}

// 20 градусов
BLYNK_WRITE(V3)
{
  int value = param.asInt(); // Получить значение как целое число
  Serial.println(value);
  if(value == 0){
    irsend.sendRaw(button20, 199, 38);
    Serial.println("20 градусов");
  }
}

// 18 градусов
BLYNK_WRITE(V4)
{
  int value = param.asInt(); // Получить значение как целое число
  Serial.println(value);
  if(value == 0){
    irsend.sendRaw(button18, 199, 38);
    Serial.println("18 градусов");
  }
}
Скетч залит. Вот такое устройство у нас получилось, по цене примерно 230 рублей. Подключаем к зарядке 5v, например телефонной, направляем в сторону кондиционера.  

Теперь у нас все должно работать. Заходим в приложение Blynk на смартфоне, клацаем по кнопке «Вкл» и вауля, кондиционер включается без родного ДУ!

Ссылки на компоненты из проекта

1. Плата ESP8266 nodemcu v3 CP2102 serial port

https://aliexpress.ru/item/4000550036826.html

2. ИК-приемник/передатчик HX1838

https://aliexpress.ru/catalog/komplekt-distantsionnogo-upravlenija.html

3. Arduino Nano v3 Atmega328

https://aliexpress.ru/item/4000587268145.html

4. Макетная плата MB102

https://aliexpress.ru/item/850064380.html

5. 3d-модель бокса для платы ESP8266

https://www.thingiverse.com/thing:2786523

19 июля в 04:07

Коментарии

Настройка Cura для 3d печати на Anycubic i3 MegaАноним25 июля в 21:14

Аноним, Что это за версия программы ?
4.7.0

Настройка Cura для 3d печати на Anycubic i3 MegaАноним25 июля в 19:19

Аноним, 2.1.3
неа

Настройка Cura для 3d печати на Anycubic i3 MegaАноним25 июля в 15:54

Аноним, Что это за версия программы ?
2.1.3

Настройка ip-камеры Mi Home Security Camera 360 1080PАноним23 июля в 15:35

Подскажите пожалуйста подключила все ок пол дня работает, записывает. А потом бац пишет не в сети, и мигает синяя лампочка :(

Как удалить Kaspersky Endpoint Security 11, если забыл пароль?Аноним09 июля в 18:18

Аноним, Не помогло. Перепробовал всё. Один фиг запрашивает логин и пароль...Аналогично

Настройка ip-камеры Mi Home Security Camera 360 1080PВадим Красновский06 июля в 23:24

Так, проблема решилась! Изначально mi home был у меня на русском регионе и первая камера подключилась на отлично, а вторая вот упиралась в финальный шаг - уже все настроено, код камерой с телефона прочитан, она подключилась к роутеру, сказала что девайс онлайн, но на телефоне была бесконечная ошибка таймаута, хоть связь и отличная.
Проблема решилась переключением в настройках михоума региона с российского на китайский. Камера приконнектилась без сучка и задоринки.

Настройка ip-камеры Mi Home Security Camera 360 1080PВадим Красновский06 июля в 23:08

Вадим Красновский, Такая же проблема - камера подключается и настраивается ровно до момента, когда появляется сообщение "поднесите телефон ближе к роутеру" (глухая или слепая что ли?) И после этого - бесконечная ошибка по таймауту подключения, соответственно процесс настройки не завершен и камера недоступна. Роутер туполинк с вайфаем, ни у смартов, ни у второй камеры проблем таких нет. Мне кажется, это сломалось после обновления прошивки ((а, еще - сканирование qr кода, который на дне указан, сообщает "устройства не найдены".

Настройка ip-камеры Mi Home Security Camera 360 1080PВадим Красновский06 июля в 23:07

Такая же проблема - камера подключается и настраивается ровно до момента, когда появляется сообщение "поднесите телефон ближе к роутеру" (глухая или слепая что ли?) И после этого - бесконечная ошибка по таймауту подключения, соответственно процесс настройки не завершен и камера недоступна. Роутер туполинк с вайфаем, ни у смартов, ни у второй камеры проблем таких нет. Мне кажется, это сломалось после обновления прошивки ((

Настройка Cura для 3d печати на Anycubic i3 MegaАноним02 июля в 21:26

Что это за версия программы ?

Настройка Cura для 3d печати на Anycubic i3 MegaАноним25 июня в 18:05


Код для стола чтобы правильно выезжал
Scripts > Ending Script > добавить в конец строчку
G1 Y150 F5000 ;move bed forward (Y)150mm to remove part at (F)5000 feed rate
Значения y поменять на свои