В современном мире практически каждый человек имеет сотовый телефон. Большая часть этих сотовых телефонов является смартфонами, которые помимо функций сотовой связи имеют много других разнообразных применений.
На нашем сайте мы уже рассматривали универсальный пульт ДУ различными домашними устройствами на основе Arduino и приложения на Android, однако рассмотренный пульт ДУ (дистанционного управления) не сможет управлять кондиционером, поскольку дистанционное управление кондиционером имеет некоторые особенности по сравнению с другими домашними устройствами. Поэтому в данной статье мы устраним пробел предыдущей статьи и рассмотрим пульт дистанционного управления кондиционером на основе платы Arduino и смартфона на операционной системе Android.
Необходимые компоненты
- Плата Arduino Mega 2560 (купить на AliExpress) (Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158).
- Инфракрасный приемник TSOP1738 (HS0038) (купить на AliExpress).
- Инфракрасный светодиод (IR Led) (купить на AliExpress).
- Светодиод любого цвета (опционально) (купить на AliExpress).
- Резистор 1 кОм (опционально) (купить на AliExpress).
- Bluetooth модуль HC-06 (купить на AliExpress) (Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158).
- Макетная плата.
- Соединительные провода.
Убедитесь в том, что у вас есть плата Arduino Mega потому что код программы достаточно объемный. Также установите в вашу Arduino IDE библиотеку (если она у вас еще не установлена) IR Remote Library для работы с TSOP и инфракрасным светодиодом (передатчиком).
Общие принципы работы проекта
Все пульты дистанционного управления (ДУ), которые есть у нас дома, обязательно содержат в своем составе инфракрасный передатчик (IR Blasters) – по своей сути это просто инфракрасный светодиод, который может передавать полезный сигнал с помощью последовательности импульсов, которая считывается приемником радиоэлектронного устройства, которым вы хотите управлять. Каждая кнопка на пульте ДУ приводит к формированию своей уникальной последовательности импульсов, которая приемником используется для выполнения заранее определенной задачи. Если вы можете принять этот инфракрасный сигнал, то вы можете его и повторить (скопировать) с помощью инфракрасного светодиода, чтобы заставить устройство выполнить нужную вам задачу. Аналогичный проект мы уже рассматривали на нашем сайте – это универсальный пульт ДУ для всех домашних устройств на основе Arduino. Также можно посмотреть во многом похожий на этот проект автоматического управления температурой кондиционера с помощью Arduino и датчика DHT11.
TSOP представляет собой инфракрасный приемник, который может быть использован для декодирования сигналов, поступающих от пультов ДУ. С помощью него и Arduino можно принять и декодировать сигнал, формирующийся при нажатии любой кнопки на пульте ДУ, а затем этот сигнал мы можем скопировать (повторить) с помощью инфракрасного диода. Таким образом, мы можем управлять любой функцией кондиционера.
Принципы дистанционного управления кондиционером
Прежде чем переходить к работе нашего проекта давайте немного остановимся на принципах работы пульта ДУ кондиционера. Он работает немного по другому чем пульты ДУ для телевизора, DVD проигрывателя и т.д. На пульте ДУ кондиционера может быть всего 10-12 кнопок, однако с их помощью пульт ДУ кондиционера может передавать огромное множество сигналов. То есть при нажатии одной и той же кнопки в разных ситуациях могут формироваться разные сигналы. К примеру, когда вы нажимаете кнопку уменьшения температуру чтобы снизить температуру в кондиционере до 24°C, вы формируете определенный набор данных. Но когда вы нажимаете ее же чтобы снизить температуру до 25°C, вы получите уже другой набор данных поскольку в данном случае будет уже 25°C, а не 24°C. Не будем тратить время на все возможные опции кондиционера (будем считать их неизменными), а сконцентрируемся только на управлении температурой.
Другой проблемой при работе с пультом ДУ кондиционера является большой объем передаваемых данных. Если для обычных пультов ДУ объем данных передаваемых при нажатии одной кнопки обычно составляет 24 или 48 бит, то для пульта ДУ этот объем данных может доходить до 228 бит поскольку в нем закодированы данные о температуре, скорости вентилятора, времени засыпания, режиме работы и т.д. По этой причине мы и используем в нашем проекте именно плату Arduino Mega – чтобы можно было хранить большие объемы данных.
Работа схемы
Схема устройства представлена на следующем рисунке. Схема достаточно проста и ее сравнительно легко можно разместить на макетной плате.
Номер п/п | Контакт компонента | Контакт Arduino |
1 | TSOP – Vcc | 5V |
2 | TSOP – Gnd | Gnd |
3 | TSOP — Signal | 8 |
4 | IR Led – Cathode | Gnd |
5 | IR Led – Anode | 9 |
6 | HC-05 — Vcc | 5V |
7 | HC05 – Gnd | Ground |
8 | HC05 – Tx | 10 |
9 | HC05 – Rx | 11 |
После соединения всех элементов у вас должна получиться примерно следующая картина:
Декодирование сигналов от пульта ДУ кондиционера
Первое, что нам необходимо сделать в нашем проекте – это декодировать сигналы с пульта ДУ кондиционера. Убедитесь в том, что все соединения в схеме сделаны и все необходимые библиотеки в Arduino IDE установлены. Теперь откройте пример программы под названием “IRrecvDumpV2”, который можно найти по адресу File -> Examples -> IRremote -> IRrecvDumpV2.
Найдите в этом примере строки вида:
int recvPin = 8;
IRrecv irrecv(recvPin);
Поскольку у нас инфракрасный приемник TSOP подключен к контакту 8 платы Arduino, то измените 9-ю строку примера на int recvPin=8 как показано в представленном участке кода. После этого загрузите этот пример в Arduino Mega и откройте окно монитора последовательной связи (Serial Monitor).
После этого направьте ваш пульт ДУ кондиционера в сторону TSOP и нажмите любую кнопку, для каждой нажатой кнопки соответствующий сигнал будет считан TSOP, декодирован Arduino и отображен в окне монитора последовательной связи. Для каждого изменения температуры ваш пульт ДУ будет генерировать различный набор данных. Сохраните эти данные для последующего использования в нашей основной программе. Ваше окно монитора последовательной связи при этом должно выглядеть примерно так, как показано на следующем рисунке. Также на рисунке мы отобразили снимок файла в Word, в который мы копировали данные для их последующего сохранения.
Скриншот показывает формируемый код для установки температуры 26°C для используемого нами пульта ДУ кондиционера. Для вашего пульта ДУ вы получите другой набор кодов. Аналогичным образом скопируйте эти коды для различных уровней температуры. Также вы можете посмотреть все инфракрасные коды для удаленного управления кондиционером, которые приведены в конце данной статьи (они для нашего пульта).
Основная программа для Arduino
Полный код программы для Arduino приведен в конце данной статьи, но вам нельзя просто так копировать ее и загружать в свою плату Arduino – скорее всего у вас она не заработает. Чтобы она заработала, вы должны заменить в ней коды управления кондиционером на свои, которые вы получили и сохранили в предыдущем разделе этой статьи (в ходе работы демонстрационного примера). Откройте программу в Arduino IDE и найдите в ней то место, где записаны массивы кодов, полученных от используемого пульта ДУ кондиционером. Замените в ней эти массивы на массивы своих кодов, для вашего пульта ДУ.
Заметьте, что мы использовали всего 10 массивов кодов, 2 из которых используются для включения и выключения кондиционера, а остальные 8 – для установки различных значений температуры. К примеру, массив Temp23 используется для установки температуры 23°C. Поэтому когда нам нужно установить на кондиционере температуру 23°C, мы должны использовать коды именно из этого массива. Когда вы все это сделаете (замените массивы кодов на свои), можете загружать программу в плату Arduino.
Также нам в программе необходимо подключить две библиотеки – одна для управления нашими инфракрасными устройствами (ссылка на ее скачивание приведена выше в статье), а вторая – это встроенная в Arduino IDE библиотека последовательной связи (Software Serial Library), которая поможет нам при взаимодействии с Bluetooth модулем.
1 2 |
#include <IRremote.h> // библиотека для работы с инфракрасными передатчиком и приемником #include <SoftwareSerial.h>// библиотека последовательной связи |
Далее мы должны инициализировать Bluetooth модуль для работы через контакты 10 и 11 платы Arduino и создать объект с именем irsend для реализации функций библиотеки инфракрасной связи.
1 2 |
SoftwareSerial BT_module(10, 11); // RX, TX IRsend irsend; |
Далее в программе идут коды дистанционного управления кондиционером – они для нашего кондиционера, вы должны заменить их на коды для своего кондиционера.
Далее в функции void setup нам необходимо инициализировать два вида последовательной связи. Одна будет использоваться для обмена данными с Bluetooth модулем на скорости 9600 бод/с, а вторая – для передачи информации в окно монитора последовательной связи (Serial monitor) со скоростью 57600 бод/с.
1 2 3 4 5 |
void setup() { BT_module.begin(9600); // Bluetooth модуль работает на скорости 9600 Serial.begin(57600); //Serial Monitor работает на скорости 57600 } |
Внутри функции void loop (бесконечный цикл) мы будем непрерывно проверять не поступила ли какая либо информация от Bluetooth модуля. Если поступила, то сохраняем ее в переменной BluetoothData.
1 2 3 4 5 |
while (BT_module.available()) //если данные поступили { BluetoothData=BT_module.read(); //считываем и сохраняем их Serial.println(BluetoothData); // передаем их в окно монитора последовательной связи для целей отладки } |
Информация, которая будет поступать от Bluetooth модуля, будет определяться тем, какую клавишу мы будем нажимать в приложении на Android (рассмотрено далее в статье). Далее в зависимости от принятой по Bluetooth информации мы должны выполнить какие-нибудь заранее определенные действия, например:
1 2 3 4 |
if (BluetoothData == '2') { irsend.sendRaw(Temp23, sizeof(Temp23) / sizeof(Temp23[0]), khz); delay(2000);//передать сигнал для установки температуры 23 градуса } |
То есть если мы приняли ‘2’, мы должны установить температуру на кондиционере 23°C. Аналогично и для всех других кодов от 0 до 9 – см. полный код программы в конце статьи.
Установка приложения на Android
Данное приложение было создано с помощью Processing Android Mode. Программная среда Processing является отличным инструментом для создания исполнимых (.EXE) файлов или APK файлов для различных проектов со встраиваемой электроникой (Embedded projects). Это абсолютно бесплатная система, которую можно скачать и установить на свой компьютер.
Если вы не хотите вникать в тонкости работы Processing, то вы можете просто скачать готовый APK файл для нашего проекта по этой ссылке в виде zip файла и непосредственным образом установить ее в свой мобильный телефон (в настройках телефона необходимо разрешить установку приложений из непроверенных источников). После установки и запуска приложения вы увидите на мобильном телефоне экран, показанный на следующем рисунке.
Но если вы хотите изменить это приложение под свои нужды, то тогда вам необходимо установить программную среду Processing и скачать исходные файлы этого приложения (та же самая ссылка для скачивания — внутри архива находится и само приложение, и его исходный код). После того как вы сделаете это откройте следующие строчки кода чтобы адаптировать их под свои нужды:
1 2 3 |
bt.start(); //старт прослушивания Bluetooth соединений bt.getPairedDeviceNames(); bt.connectToDeviceByName("HC-05"); //соединение с нашим bluetooth модулем HC-06 |
В принципе, Processing очень похожа на Arduino. Программа на Processing также имеет в своем составе функции void setup и void loop. Внутри функции void setup мы задаем настройки для Bluetooth смартфона чтобы он соединился с Bluetooth модулем, подключенным к плате Arduino. Имя использованного нами устройства “HC-05”, что видно из приведенной строчки программы.
Далее внутри функции load_buttons() вы можете нарисовать так много кнопок, сколько вы захотите. Мы нарисовали 10 кнопок. Далее в функции read_buttons() мы проверяем какая кнопка была нажата. Каждая кнопка имеет свой определенный цвет, поэтому когда пользователь прикасается к экрану мы определяем цвет экрана в точке его прикосновения и, таким образом, распознаем нажатую кнопку. Фрагмент кода, в котором мы создаем кнопку определенного цвета и затем определяем какой символ передавать при нажатии этой кнопки, выглядит следующим образом:
1 2 3 4 5 |
fill(255,145,3); rect(width/2-width/4,height/2,width/4,height/12); fill(255); text("25C",width/2-width/4,height/2); //button 5 if (color_val==-13589993) {byte[] data = {'0'}; bt.broadcast(data);} |
Строка кода “byte[] data = {‘0’};” является очень важной строкой. С ее помощью мы определяем какой код передать Arduino по Bluetooth. Здесь если эта кнопка нажата, то будет передаваться символ “0” по Bluetooth в Arduino. Аналогичным способом мы можем сформировать коды для всех остальных кнопок. В программе для Arduino эти коды (символы) будут распознаваться и на основе этого будут выполняться определенные действия.
Работа проекта
Когда вся аппаратная часть проекта будет готова загрузите приведенный ниже код программы в плату Arduino и разместите устройство напротив вашего кондиционера. Запустите наше android-приложение на своем мобильном телефоне. Если все нормально, то вы увидите на экране смартфона надпись “Connected to: device_name (some code)” как показано на следующем рисунке.
Теперь нажмите какую-нибудь кнопку в приложении и кондиционер должен выполнить эту команду как будто вы передали ему команду с его пульта ДУ. Изменяя исходный код нашего приложения вы можете создать любое количество кнопок, а также изменить их назначение в зависимости от ваших предпочтений. Более подробно процессы работы нашего проекта показаны на видео, приведенном в конце статьи.
Исходный код программы
Если у вас возникнут какие либо вопросы по тексту данной программы, вы можете задать их в комментариях к данной статье – постараюсь на них ответить.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
#include <IRremote.h> //библиотека для работы с инфракрасными передатчиком и приемником #include <SoftwareSerial.h>// библиотека последовательной связи SoftwareSerial BT_module(10, 11); // RX, TX IRsend irsend; int khz = 38; // несущая частота 38 кГц для протокола NEC char BluetoothData; // переменная, в которую мы будем сохранять символ, принятый по Bluetooth int PevData; //Decoded Remote Signals For my AC ##измените эти коды для вашей модели кондиционера unsigned int ACoff[] = {2950,1750, 400,1100, 450,1050, 450,400, 400,400, 400,400, 450,1100, 400,400, 400,400, 450,1100, 400,1100, 450,350, 450,1100, 400,400, 400,400, 450,1100, 400,1100, 450,400, 400,1100, 400,1100, 450,400, 400,400, 400,1100, 450,350, 450,400, 400,1100, 450,400, 400,400, 400,400, 450,350, 450,350, 450,400, 400,400, 450,350, 450,400, 400,400, 400,400, 450,350, 450,400, 400,400, 400,400, 450,400, 400,400, 400,400, 450,350, 450,350, 450,1100, 400,400, 450,400, 400,1100, 450,1050, 450,400, 400,400, 400,400, 450,350, 450,400, 400,400, 450,350, 450,400, 400,400, 400,1100, 450,350, 450,400, 400,400, 400,400, 450,400, 400,1100, 450,350, 450,400, 400,400, 400,400, 400,1100, 450,400, 400,400, 450,350, 450,400, 400,400, 400,400, 450,350, 450,350, 450,400, 400,400, 450,350, 450,400, 400,400, 400,400, 450,350, 450,400, 400,400, 450,350, 450,400, 400,400, 400,400, 450,350, 450,350, 450,400, 450,350, 450,350, 450,400, 450,350, 450,350, 450,350, 450,400, 450,350, 450,350, 450,400, 400,1100, 450,350, 450,350, 450,400, 450,350, 450,350, 450,1100, 450}; unsigned int ACon[] = {2950,1700, 450,1100, 400,1100, 450,350, 450,350, 450,400, 450,1050, 450,350, 450,400, 450,1050, 450,1100, 400,400, 450,1050, 450,350, 450,400, 400,1100, 450,1100, 450,350, 450,1050, 450,1100, 450,350, 450,350, 450,1100, 450,350, 400,400, 450,1100, 450,350, 450,350, 450,400, 400,400, 450,350, 450,350, 450,400, 400,400, 450,350, 450,350, 450,400, 400,400, 450,350, 450,350, 450,400, 450,350, 450,350, 450,1100, 400,400, 450,350, 450,1100, 400,400, 450,350, 450,1100, 400,1100, 450,350, 450,400, 400,400, 450,350, 500,300, 450,400, 450,350, 400,400, 450,1100, 400,400, 450,350, 450,350, 450,400, 400,400, 450,350, 450,1100, 450,350, 400,400, 450,350, 450,400, 450,350, 400,400, 450,400, 450,350, 450,350, 450,350, 450,400, 400,400, 450,350, 450,400, 400,400, 400,400, 400,400, 450,350, 450,400, 450,350, 450,350, 450,400, 450,350, 450,350, 450,350, 450,400, 400,400, 400,400, 450,350, 450,400, 450,350, 400,400, 450,350, 450,400, 450,350, 450,350, 450,350, 450,400, 450,350, 450,1100, 400,400, 400,400, 450,350, 450,350, 450,1100, 400,400, 450}; unsigned int Temp23[] = {3000,1650, 550,950, 550,1000, 500,300, 550,250, 550,250, 550,1000, 500,300, 550,300, 500,1000, 550,950, 550,300, 550,950, 550,250, 550,300, 500,1000, 500,1050, 500,300, 500,1000, 550,1000, 500,300, 500,300, 550,1000, 450,350, 500,300, 500,1050, 450,350, 450,350, 450,350, 450,400, 450,350, 450,350, 450,400, 400,400, 450,350, 450,350, 450,350, 450,400, 400,400, 400,400, 450,400, 400,400, 400,400, 450,1100, 400,400, 400,400, 450,1050, 450,400, 400,400, 450,1100, 400,1100, 400,400, 450,350, 450,400, 400,400, 400,400, 450,400, 400,400, 400,400, 450,350, 450,1100, 400,400, 400,400, 450,350, 450,400, 400,400, 450,1100, 400,400, 400,1100, 450,1100, 400,1100, 450,350, 450,400, 400,400, 450,350, 450,350, 450,400, 400,400, 400,400, 450,350, 450,400, 400,400, 450,350, 450,400, 400,400, 400,400, 450,350, 450,400, 400,400, 450,350, 450,350, 450,400, 450,350, 400,400, 450,350, 450,400, 450,350, 450,350, 450,400, 450,350, 450,350, 450,350, 450,400, 400,400, 400,400, 450,350, 450,1100, 400,1100, 450,1100, 400,1100, 450,1100, 400,1100, 400,400, 450}; unsigned int Temp24[] = {3000,1650, 500,1050, 500,1000, 500,300, 500,300, 500,350, 500,1000, 500,300, 500,350, 500,1000, 500,1050, 500,300, 500,1000, 500,300, 500,350, 500,1000, 500,1050, 500,300, 500,1000, 500,1050, 500,300, 500,300, 500,1050, 500,300, 500,300, 500,1050, 500,300, 500,300, 500,350, 500,300, 500,300, 500,300, 500,350, 500,300, 500,300, 500,300, 500,350, 500,300, 500,300, 500,300, 500,350, 500,300, 500,300, 500,1050, 500,300, 500,300, 500,1050, 500,300, 500,300, 500,1050, 500,1000, 500,300, 500,350, 500,300, 500,300, 500,300, 500,350, 500,1000, 500,1050, 500,1000, 500,300, 500,350, 450,350, 500,300, 500,300, 500,350, 500,1000, 500,300, 500,1050, 500,1000, 500,1050, 500,300, 500,300, 500,350, 500,300, 500,300, 500,300, 500,300, 500,350, 500,300, 450,350, 500,350, 450,350, 450,350, 450,350, 450,400, 400,400, 400,400, 450,400, 400,400, 400,400, 400,400, 450,350, 450,400, 400,400, 450,350, 450,400, 450,350, 450,350, 450,350, 450,400, 450,350, 450,350, 450,350, 500,350, 450,1050, 500,300, 500,1050, 500,1000, 500,1050, 500,1000, 500,1000, 500,350, 550}; unsigned int Temp25[] = {3050,1650, 500,1000, 550,950, 550,300, 500,300, 500,300, 550,1000, 500,300, 500,300, 550,1000, 550,950, 550,250, 550,1000, 500,300, 550,250, 550,1000, 500,1000, 550,300, 550,950, 550,950, 550,300, 500,300, 500,1000, 550,250, 550,300, 550,950, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 550,250, 550,250, 600,250, 500,300, 550,250, 550,250, 550,300, 550,250, 500,300, 550,300, 500,300, 500,1000, 550,250, 550,300, 500,1000, 550,250, 550,300, 500,1000, 550,1000, 500,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,300, 500,1000, 550,950, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 550,950, 550,300, 500,1000, 550,1000, 500,1000, 500,300, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 550,250, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,250, 550,250, 550,300, 550,250, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 500,300, 500,350, 500,1000, 500,1000, 500,1050, 500,1000, 500,1050, 500,300, 550}; unsigned int Temp26[] = {3000,1650, 500,1000, 500,1050, 500,300, 500,300, 500,350, 500,1000, 500,300, 500,350, 500,1000, 500,1050, 450,350, 500,1000, 500,300, 500,350, 500,1000, 500,1050, 500,300, 500,1000, 500,1050, 500,300, 500,300, 500,1050, 500,300, 500,300, 500,1050, 500,300, 500,300, 500,300, 500,350, 500,300, 500,300, 500,350, 500,300, 500,300, 500,300, 500,350, 500,300, 500,300, 500,300, 500,350, 500,300, 500,300, 500,1050, 500,300, 500,300, 500,1050, 450,350, 500,300, 500,1050, 500,1000, 500,300, 500,350, 500,300, 500,300, 500,300, 500,350, 500,1000, 500,300, 500,1050, 500,300, 500,300, 500,300, 500,350, 500,300, 500,300, 500,1050, 500,300, 500,1050, 450,1050, 500,1000, 500,350, 500,300, 500,300, 500,350, 450,350, 500,300, 500,300, 500,300, 500,350, 500,300, 500,300, 500,350, 500,300, 500,300, 500,300, 500,350, 450,350, 500,300, 500,350, 450,350, 500,300, 500,300, 500,300, 500,350, 500,300, 500,300, 500,350, 500,300, 500,300, 500,300, 500,350, 500,300, 500,300, 500,350, 450,1050, 500,1000, 500,350, 500,1000, 500,1000, 500,1050, 500,1000, 500,350, 500}; unsigned int Temp27[] = {3050,1600, 550,1000, 500,1000, 550,300, 500,300, 550,250, 550,1000, 500,300, 550,300, 500,1000, 550,1000, 500,300, 550,1000, 550,250, 500,300, 550,1000, 500,1050, 500,300, 500,1000, 550,1000, 500,300, 550,250, 550,1000, 550,250, 550,300, 500,1000, 550,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,300, 500,300, 500,300, 550,300, 500,300, 500,1000, 550,300, 500,300, 550,1000, 500,300, 500,300, 550,1000, 550,1000, 500,300, 500,300, 550,250, 550,300, 500,300, 550,300, 500,300, 500,300, 550,1000, 500,300, 550,250, 550,300, 500,300, 500,300, 500,350, 500,300, 550,250, 550,1000, 500,1000, 550,1000, 500,300, 550,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,300, 500,300, 500,300, 550,300, 500,300, 550,250, 550,300, 500,300, 500,300, 500,300, 550,300, 550,250, 550,300, 500,300, 500,300, 550,300, 500,300, 500,300, 550,300, 500,300, 500,300, 550,300, 500,300, 500,300, 500,300, 500,350, 500,300, 500,350, 500,300, 500,300, 500,1050, 500,1000, 500,1050, 500,1000, 500,350, 500}; // PANASONIC C4D3:64800024 unsigned int Temp28[] = {3100,1600, 550,950, 550,1000, 550,250, 550,250, 550,250, 550,1000, 500,300, 500,300, 550,1000, 500,1000, 550,250, 550,1000, 500,300, 550,250, 550,1000, 550,950, 550,300, 500,1000, 550,950, 550,300, 550,250, 500,1000, 550,300, 500,300, 550,950, 550,300, 500,300, 500,300, 550,250, 550,300, 550,250, 500,300, 550,300, 500,300, 500,300, 550,250, 550,250, 600,250, 500,300, 500,300, 550,300, 500,300, 500,1000, 550,300, 500,300, 500,1000, 550,250, 550,300, 500,1000, 550,1000, 550,250, 550,250, 550,250, 550,300, 500,300, 550,250, 550,1000, 500,1000, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 550,1000, 500,300, 500,1000, 550,1000, 500,1000, 550,250, 550,300, 500,300, 550,250, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 550,250, 550,300, 550,250, 500,300, 550,250, 550,250, 550,300, 550,250, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,250, 550,250, 550,300, 500,300, 550,1000, 500,300, 500,300, 550,950, 550,1000, 500,1000, 550,1000, 500,300, 550}; unsigned int Temp29[] = {3100,1550, 600,950, 500,1000, 550,300, 500,300, 500,300, 550,950, 550,300, 550,250, 550,1000, 500,1000, 550,250, 550,1000, 500,300, 550,250, 550,950, 600,950, 550,250, 550,1000, 500,1000, 550,250, 600,250, 550,950, 550,250, 550,300, 550,950, 550,250, 550,300, 550,250, 550,250, 550,250, 550,300, 550,250, 550,250, 550,300, 500,300, 550,250, 550,250, 550,300, 500,300, 550,250, 550,250, 600,250, 550,950, 550,250, 550,300, 500,1000, 550,250, 550,300, 550,950, 550,1000, 500,300, 500,300, 550,250, 550,250, 550,300, 500,300, 550,250, 550,1000, 500,300, 550,250, 550,300, 500,300, 550,250, 550,250, 550,300, 500,1000, 550,250, 550,1000, 500,1000, 550,1000, 500,300, 500,300, 550,300, 500,300, 500,300, 550,250, 550,250, 550,300, 500,300, 500,300, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,300, 500,300, 500,300, 550,250, 550,250, 550,300, 500,300, 500,300, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 550,250, 550,250, 550,1000, 500,1000, 550,1000, 500,1000, 550,300, 500}; unsigned int Temp30[] = {3000,1650, 500,1000, 550,1000, 500,300, 500,300, 550,250, 550,1000, 500,300, 500,300, 550,1000, 550,950, 550,250, 550,1000, 550,250, 550,250, 550,1000, 550,950, 550,300, 500,1000, 550,950, 550,300, 500,300, 550,950, 550,300, 550,250, 550,1000, 500,300, 500,300, 550,250, 550,250, 550,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,300, 500,300, 500,300, 550,950, 550,300, 500,300, 500,1000, 550,250, 550,300, 550,950, 550,1000, 500,300, 550,250, 550,250, 600,250, 500,300, 550,250, 550,1000, 500,300, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 550,950, 550,300, 500,1000, 550,950, 550,1000, 500,300, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,250, 550,250, 550,300, 500,300, 550,250, 550,300, 500,300, 500,300, 550,250, 550,300, 500,300, 550,950, 500,1050, 500,1000, 500,350, 500,1000, 500,1000, 500,1050, 500,300, 500}; //Change it for your remote void setup() { BT_module.begin(9600); // Bluetooth модуль работает на скорости 9600 Serial.begin(57600); //Serial Monitor работает на скорости 57600 } void loop() { while (BT_module.available()) //если данные поступили { BluetoothData=BT_module.read(); //считываем их и сохраняем Serial.println(BluetoothData); //печатает их в окно монитора последовательной связи для целей отладки } if (BluetoothData != PevData) { if (BluetoothData == '0') { irsend.sendRaw(ACon, sizeof(ACon) / sizeof(ACon[0]), khz); delay(2000);//передать сигнал на включение кондиционера } if (BluetoothData == '1') { irsend.sendRaw(ACoff, sizeof(ACoff) / sizeof(ACoff[0]), khz); delay(2000);// передать сигнал на выключение кондиционера } if (BluetoothData == '2') { irsend.sendRaw(Temp23, sizeof(Temp23) / sizeof(Temp23[0]), khz); delay(2000);//передать сигнал на установку температуры 23C } if (BluetoothData == '3') { irsend.sendRaw(Temp24, sizeof(Temp24) / sizeof(Temp24[0]), khz); delay(2000);// передать сигнал на установку температуры 24C } if (BluetoothData == '4') { irsend.sendRaw(Temp25, sizeof(Temp25) / sizeof(Temp25[0]), khz); delay(2000);// передать сигнал на установку температуры 25C } if (BluetoothData == '5') { irsend.sendRaw(Temp26, sizeof(Temp23) / sizeof(Temp26[0]), khz); delay(2000);// передать сигнал на установку температуры 26C } if (BluetoothData == '6') { irsend.sendRaw(Temp27, sizeof(Temp27) / sizeof(Temp27[0]), khz); delay(2000);// передать сигнал на установку температуры 27C } if (BluetoothData == '7') { irsend.sendRaw(Temp28, sizeof(Temp28) / sizeof(Temp28[0]), khz); delay(2000);// передать сигнал на установку температуры 28C } if (BluetoothData == '8') { irsend.sendRaw(Temp29, sizeof(Temp29) / sizeof(Temp29[0]), khz); delay(2000);// передать сигнал на установку температуры 29C } if (BluetoothData == '9') { irsend.sendRaw(Temp30, sizeof(Temp30) / sizeof(Temp30[0]), khz); delay(2000);// передать сигнал на установку температуры 30C } } PevData = BluetoothData; delay(100);// подготовка к приему следующих данных } |
6 ответов к “Пульт управления кондиционером на основе Arduino и смартфона”
Нахрена мне IR приемник? Приемник уже в кондиционере есть
Он необходим для того, чтобы коды кнопок с пульта кондиционера считать. После этого его можно исключить из схемы
Здравствуйте, не подскажете, я давно это освоил, но у меня забивается SRAM, в зависимости от колличества таких переменных. Не знаете, можно ли это «переместить» на карту памяти, или память ардуино для скетчей? У меня не получилось.
Добрый вечер. Не подскажите каких именно переменных? И кнопка сброса разве не решает проблему очистки памяти?
У кондиционеров на пульте нет кнопок с конкретной температурой. У них есть кнопка + и -. Плюс как минимум при установке температуры может быть 2 варианта: обогрев или охлаждение.
Ну значит у каких то кондиционеров есть, не с пустого же места эта статья написана. Используя описанный в данной статье подход можно смоделировать любой пульт кондиционера, ведь мы же сначала считываем необходимые коды этих кнопок, а потом имитируем их в программе