Pull to refresh

DIY: Делаем тупой кондиционер умным и управляем им через телеграм бот

Level of difficultyMedium
Reading time7 min
Views9.1K

Статья от чайника для полных чайников в ней мы:

  1. Подберем компоненты для устройства управления кондиционером

  2. Соберем устройство управления кондиционером

  3. Узнаем каким протоколом пользуется кондиционер

  4. Напишем код для управления кондиционером и телеграм бот к нему

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

Наступило лето, а вместе с ним и жара. И вот тут-то и приходит на помощь кондиционер. Но что делать, если у вас нет умного кондиционера, а обычный кондиционер не позволяет управлять им удаленно? Ответ прост: сделать его умным своими руками!

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

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

Каждый кондиционер использует свой собственный протокол для передачи команд, поэтому нам нужно будет выяснить, каким именно протоколом пользуется ваш кондиционер. Для этого мы будем использовать инфракрасный приемник, который позволит нам "послушать" команды, отправляемые пультом. Я думаю в 90% вам повезет и протокол будет известен и уже реализован в библиотеке для Arduino. Если не повезет, можете сами попробовать его расшифровать, но это уже другая история.

Для начала нам понадобятся следующие компоненты:

  1. esp8266 node mcu - это микроконтроллер с Wi-Fi, который будет управлять нашим кондиционером.

  2. Инфракрасный приемник - для "прослушивания" команд от пульта кондиционера.

  3. Инфракрасный передатчик - для отправки команд на кондиционер.

  4. Провода для подключения компонентов.

  5. Источник питания для esp8266 (можно использовать USB-кабель) - но мне не пригодился.

  6. Резистор 220 Ом для инфракрасного светодиода.

  7. Макетная плата для удобства сборки breadboard.

  8. Транзистор NPN (например, 2N2222) для управления инфракрасным светодиодом.

Конкретно мои компоненты

Список конкретно моих компонентов
Список конкретно моих компонентов

Для начала разберемся с макетной платой (breadboard)

Она выглядит примерно так:

Макетная плата
Макетная плата

Макетная плата состоит из ряда горизонтальных и вертикальных соединений, которые позволяют легко подключать компоненты без пайки. Буквы и цифры обозначают ряды и колонки. На фотографии ряды a,b,c,d,e - это горизонтальные соединения, а цифры 1,2,3,4,5 - вертикальные соединения. Обычно макетные платы имеют две длинные полосы по бокам для питания (плюс и минус), которые можно использовать для подключения источника питания.
Горизонтальные соединения обычно используются для подключения компонентов, а вертикальные - для питания. Важно помнить, что горизонтальные ряды соединены между собой, а вертикальные - нет. Поэтому, если вы хотите подключить компонент к питанию, нужно использовать горизонтальный ряд.

Ниже изображение моей схемы, которую подробно объясню ниже

Начну с объяснения пинов на esp8266 node mcu. У него есть несколько пинов, которые можно использовать для подключения компонентов. Важно помнить, что некоторые пины могут быть заняты другими функциями, поэтому лучше использовать пины D1, D2, D5, D6, D7 и т.д.
Также есть пины GND (земля) или минус, 3v3 питание на 3.3 вольта, Vin (питание) - 5 вольт. Другие пины в этой статье не будем рассматривать, так как они не нужны для управления кондиционером.

LED - инфракрасный светодиод, который будет передавать команды кондиционеру. У меня диод 940 нм, не стоит пытаться им поморгать, он не виден невооруженным глазом.

У диода две ножки: анод (длинная ножка) и катод (короткая ножка). Анод подключается к плюсу питания, а катод - к минусу. Но так как мы будем использовать транзистор для управления диодом, то катод подключается к коллектору транзистора.

Транзистор NPN (например, 2N2222) используется для управления инфракрасным светодиодом. Он позволяет управлять большим током, который нужен для работы светодиода, с помощью небольшого тока от микроконтроллера.

Транзистор имеет три ножки: коллектор (C), База и эмиттер (E). База подключается к выходу микроконтроллера, коллектор - к катоду инфракрасного светодиода, а эмиттер - к минусу питания.

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

Конкретно у нас провод от резистора подключается к D1 на esp8266, а резистор подключается к базе транзистора. Коллектор транзистора подключается к катоду инфракрасного светодиода (короткая ножка), а анод (длинная ножка) подключается к плюсу питания. Коллектор транзистора подключается к катоду инфракрасного светодиода, а эмиттер - к минусу питания.

Теперь перейдем к инфракрасному приемнику. Он нужен для того, чтобы "прослушивать" команды от пульта кондиционера. У него также есть две ножки: VCC (питание) и GND (земля), а также выходной пин, который будет подключен к микроконтроллеру.

Выходной пин обозначен буквой S (Signal). Он подключается к пину D5 на esp8266. Питание (VCC) подключается к плюсу питания, а земля (GND) - к минусу питания.

Теперь, когда мы разобрались с подключением компонентов, давайте перейдем к программированию. Мы будем использовать Arduino IDE для написания кода, который будет управлять кондиционером и телеграм-ботом.

Для начала нужно установить библиотеку для работы с инфракрасным передатчиком и приемником. В Arduino IDE перейдите в "Инструменты" -> "Управление библиотеками" и установите библиотеку "IRremoteESP8266" и "IRsend".

Теперь нужно считать команды от пульта кондиционера и понять какой у нас протокол. Для этого используем следующий код:

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>

const uint16_t kRecvPin = 14; // d5 пин для приемника
const uint16_t kIrLedPin = 4; // пин для мигания синим на самом контроллере
const uint32_t kBaudRate = 115200;
const uint16_t kCaptureBufferSize = 1024;
const uint8_t kTimeout = 50;
const uint16_t kFrequency = 38000;
IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, false);
decode_results results;

void setup() {
  irrecv.enableIRIn();
  irsend.begin();

  Serial.begin(kBaudRate, SERIAL_8N1);
  while (!Serial)
    delay(50);
  Serial.println();

  Serial.print("SmartIRRepeater is now running and waiting for IR input "
               "on Pin ");
  Serial.println(kRecvPin);
}

void loop() {
  if (irrecv.decode(&amp;results)) {
    irrecv.resume();
    Serial.println(resultToHumanReadableBasic(&amp;results));
    Serial.println(resultToSourceCode(&amp;results));
  }
  yield();
}

Этот код позволяет нам "слушать" команды от пульта кондиционера и выводить их в консоль Arduino IDE. Подключите инфракрасный приемник к пину D5 на esp8266, а инфракрасный передатчик к пину D1. Загрузите код на esp8266 и откройте монитор порта в Arduino IDE.

Теперь, когда вы нажимаете кнопки на пульте кондиционера, вы должны увидеть команды в консоли. Эти команды будут выглядеть примерно так:

Protocol  : ELECTRA_AC
Code      : 0x1FE48B7

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

Теперь, когда мы получили команды от пульта кондиционера, нам нужно понять, какой протокол используется. В данном случае это ELECTRA_AC. Если ваш кондиционер использует другой протокол, то вам нужно будет найти его в документации или в интернете.

Я делал так - зашел в сырцы библиотеки - https://github.com/crankyoldgit/IRremoteESP8266/tree/master/src

и нашел файл ir_Electra.h, в котором описан протокол ELECTRA_AC. В этом файле есть все сигнатуры для управления именно вашим кондиционером.
Если ваш кондиционер использует другой протокол, то вам нужно будет найти соответствующий файл в библиотеке IRremoteESP8266.

Теперь, когда мы знаем протокол, мы можем написать код для управления кондиционером.
давайте доставим библиотеку для работы с кондиционером. В данном случае мы будем использовать библиотеку IRremoteESP8266 и UniversalTelegramBot для управления кондиционером и телеграм-ботом соответственно.
Для этого откройте Arduino IDE, перейдите в "Инструменты" -> "Управление библиотеками" и установите следующие библиотеки:

  • UniversalTelegramBot - вместе с зависимостями Вот пример кода, который позволяет включать и выключать кондиционер, а также управлять его температурой, учтите что этот код работает с протоколом ELECTRA_AC, если у вас другой протокол, то вам нужно будет изменить его на свой и использовать соответствующие методы для вашего протокола.:

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <ir_Electra.h>  // Замените на нужную библиотеку для вашего протокола

const char* ssid = "";
const char* password = "";

#define BOT_TOKEN ""
#define CHAT_ID ""

const uint16_t SEND_PIN = 5;  // D1
IRsend irsend(SEND_PIN);
IRElectraAc ac(SEND_PIN);
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);

unsigned long lastTime = 0;
const unsigned long interval = 1000;


void setCoolSilent18() {
  ac.setPower(true);
  ac.setTemp(18);
  ac.setMode(kElectraAcCool);
  ac.setFan(kElectraAcFanLow);
  ac.setQuiet(true);
  ac.setSwingV(false);
  ac.setSwingH(false);
}


void setup() {
  Serial.begin(115200);
  irsend.begin();
  ac.begin();
  setCoolSilent18();
  Serial.println();
  Serial.println();

  WiFi.begin(ssid, password);
  Serial.print("Подключение к Wi-Fi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500); Serial.print(".");
  }
  Serial.println("Wi-Fi подключен: " + WiFi.localIP().toString());

  secured_client.setInsecure();  // Отключает проверку SSL сертификатов
  bot.sendMessage(CHAT_ID, "ЗАПУЩЕНО", "");
}

void loop() {
  if (millis() - lastTime &gt; interval) {
    lastTime = millis();
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    while (numNewMessages) {
      handleMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }
  }
}

void handleMessages(int num) {
  for (int i = 0; i &lt; num; i++) {
    String text = bot.messages[i].text;
    String chat_id = bot.messages[i].chat_id;
    String response;

    if (chat_id != CHAT_ID) continue;

    if (text == "/on") {
      ac.setPower(true); ac.send();
      response = "Включено.";
    } else if (text == "/off") {
      ac.setPower(false); ac.send();
      response = "Выключено.";
    } else if (text.startsWith("/temp ")) {
      int t = text.substring(6).toInt();
      if (t &gt;= 16 &amp;&amp; t &lt;= 30) {
        ac.setTemp(t); ac.send();
        response = "Температура установлена: " + String(t) + "°C";
      } else {
        response = "Укажите температуру от 16 до 30.";
      }
    } else if (text == "/cool") {
      ac.setMode(kElectraAcCool); ac.send();
      response = "Режим охлаждения.";
    } else if (text == "/default") {
      setCoolSilent18(); ac.send();
      response = "Дефолтный режим";
    } else if (text == "/fan_min") {
      ac.setFan(kElectraAcFanLow); ac.send();
      response = "Минимальная скорость вентилятора.";
    } else if (text == "/status") {
      response = ac.toString();
    } else {
      response = "Доступные команды:\n/on\n/off\n/temp 22\n/cool\n/fan_min\n/status\n/default";
    }

    bot.sendMessage(chat_id, response, "");
  }
}

Ну вот и все, теперь у вас есть код для управления кондиционером через телеграм-бота. Вы можете отправлять команды /on, /off, /temp 22, /cool, /fan_min, /status и /default в чат с ботом, чтобы управлять кондиционером.
Не забудьте заменить ssid, password, BOT_TOKEN и CHAT_ID на свои значения. Также убедитесь, что вы используете правильный протокол для вашего кондиционера, если он отличается от ELECTRA_AC.

Чтобы не питать плату от ноутбука, подойдет обычная зарядка от телефона на 5 вольт. Просто подключите ее к микроконтроллеру.

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

Tags:
Hubs:
+17
Comments24

Articles