Сегодня мы подключим библиотеку IRremoteESP8266 к нашему проекту.
Теперь скетч будет обладать функцией отправки команд на бытовую технику по ИК интерфейсу.
Команды будем получать с использованием библиотеки aREST. Для этого допишем маленькую функцию, которая будет взаимодействовать с ИК светодиодом. Функция будет вызываться по GET запросу вида: http://ipadres:8080/irc?volume=551520375, где число после знака равно – код команды который будет передан на IR излучатель.
Как подключить излучатель?
ИК светодиод подключаем непосредственно, без резистора, анод к контакту 14 ESP8266, катод подключаем к GND. Внимание! ИК сигнал формируется короткими импульсами, это позволяет сформировать мощный ИК сигнал. Если подать на контакт 14 логическую 1, на долгое время светодиод выйдет из строя.
Как подключить приемник?
OUT подключаем на 12 ногу ESP8266
Скетч чтения команд с пульта:
/* * IRremoteESP8266: IRrecvDemo - demonstrates receiving IR codes with IRrecv * An IR detector/demodulator must be connected to the input RECV_PIN. * Version 0.1 Sept, 2015 * Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009, Copyright 2009 Ken Shirriff, http://arcfn.com */ #include <IRremoteESP8266.h> int RECV_PIN = 12; //an IR detector/demodulatord is connected to GPIO pin 2 IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } void loop() { if (irrecv.decode(&results)) { Serial.print(results.value, HEX); Serial.print(" = "); Serial.println(results.value, DEC); irrecv.resume(); // Receive the next value } delay(100); }
Скетч проекта:
#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino //needed for library #include <DNSServer.h> #include <ESP8266WebServer.h> #include <WiFiManager.h> //https://github.com/tzapu/WiFiManager #include <ESP8266SSDP.h> #include <aREST.h> #include <IRremoteESP8266.h> const char* serverIndex = "<form method='POST' action='/' enctype='multipart/form-data'><input type='submit' value='Update'></form>"; // Web интерфейс для устройства ESP8266WebServer HTTP(80); // aREST и сервер для него WiFiServer SERVERaREST(8080); aREST rest = aREST(); IRsend irsend(14); void setup() { // Настраиваем вывод отладки Serial.begin(115200); //Включаем WiFiManager WiFiManager wifiManager; //Если не удалось подключиться клиентом запускаем режим AP // доступ к настройкам по адресу http://192.168.4.1 wifiManager.autoConnect("AutoConnectAP"); //если подключение к точке доступа произошло сообщаем Serial.println("connected...yeey :)"); //настраиваем HTTP интерфейс HTTP_init(); //запускаем SSDP сервис Serial.printf("Starting SSDP...\n"); SSDP_init(); Serial.printf("SSDP Ready!\n"); // регистрируем функцию irControl rest.function("irc",irControl); // включаем aREST и сервер к нему AREST_init(); Serial.println("aREST Server started"); Serial.println(ESP.getFreeHeap()); irsend.begin(); } void loop() { // put your main code here, to run repeatedly: HTTP.handleClient(); delay(1); // Handle REST calls WiFiClient client = SERVERaREST.available(); if (!client) { return; } while (!client.available()) { delay(1); } rest.handle(client); } void SSDP_init(void){ SSDP.setSchemaURL("description.xml"); SSDP.setHTTPPort(80); SSDP.setName("IRC+aREST"); SSDP.setSerialNumber("001788102201"); SSDP.setURL("index.html"); SSDP.setModelName("IRC+aREST"); SSDP.setModelNumber("000000000001"); SSDP.setModelURL("http://esp8266-arduinoide.ru/irremoteesp8266/"); SSDP.setManufacturer("Tretyakov Sergey"); SSDP.setManufacturerURL("http://www.esp8266-arduinoide.ru"); SSDP.begin(); } void HTTP_init(void){ HTTP.on("/index.html", HTTP_GET, [](){ HTTP.send(200, "text/plain", "Test aREST"); }); HTTP.on("/description.xml", HTTP_GET, [](){ SSDP.schema(HTTP.client()); }); HTTP.on("/", HTTP_GET, [](){ HTTP.sendHeader("Connection", "close"); HTTP.sendHeader("Access-Control-Allow-Origin", "*"); HTTP.send(200, "text/html", serverIndex); }); HTTP.begin(); } void AREST_init(void){ // Определяем имя name и ИД ID устройства aREST rest.set_id("1"); rest.set_name("aRest"); // Запускаем сервер SERVERaREST.begin(); } // Отправка кода через IRremote int irControl(String command) { // Get state from command unsigned long state = command.toInt(); Serial.println(state); irsend.sendNEC(state, 36); return 1; }
Библиотека IRremoteESP8266: https://github.com/markszabo/IRremoteESP8266
Библиотека WiFiManager: https://github.com/tzapu/WiFiManager
Библиотека aREST: https://github.com/marcoschwartz/aREST
Программа пульта: aREST-pult
Приветствую!
Функция toInt(), возвращает знаковый long, соответственно числа больше 2147483647, не работают. У самсунгов коды большие, например включения 3772793023.
Если вместо 115 строки поставить так:
char __command[sizeof(command)];
command.toCharArray(__command, sizeof(__command));
unsigned long state = strtoul(__command,NULL,10);
то считает правильно…
Подскажите,а библиотечка RCSWICH будет ли адаптироваться под ESP?
Что то с библиотекой не так? У меня нет устройств для этой библиотеки. Поставил библиотеку примеры собираются.
Подскажите пожалуйса, ИК приёмник обязательно подключать на 12-й GPIO, или можно на другие? На 16-м почему-то не захотер работать.
На любой кроме GPIO16.
А как сделать чтобы было можно выбрать протоколы
Такая штука не работает:
int irControl(String cmnd, * int p) // Отправка кода через IRremote
{
int p;
unsigned long state = cmnd.toInt();
switch (p){
case 0: irsend.sendNEC(state, 32);
case 1: irsend.sendPanasonic(0x4004, state, 48, 38); // PANASONIC
}
delay(100);
return 1;
}
Вы задачу подробно опишите. На нормальном человеческом языке. Хочу … нажимать на кнопки на веб страницах и при этом бла бла бла…
Я не про веб страницу. Я про универсальную функцию отправки ИК кодов на ИК диод, как для пультов НЕК, Панасоник и других.
Зачем вы объявляете переменную p, если указатель на неё уже передан в параметрах функции.
Arduino: 1.6.5 (Windows 8.1), Плата”NodeMCU 0.9 (ESP-12 Module), 80 MHz, 115200, 4M (3M SPIFFS)”
sketch_jan21a.ino:8:19: fatal error: aREST.h: No such file or directory
compilation terminated.
Ошибка компиляции.
Чё делать?
Первый скетч сработал нормально
Вопрос решён!
Оказывается я плохо импортировал библиотеку.
Скетч – Подключить библиотеку – Добавить .ZIP библиотеку — помогло.
У меня очень много ИК шума выводится в мониторе порта!
Что делать?
Я использовал только первый скетч.
Причём я сперва ошибся и приёмник припаял к 14 ноге.
А потом припаял к 12.
Передатчик не припаивал вообще.
И в обоих случаях в ком порт выводилась примерно такая инфа:
25AE7EE3 = 632192739
25AE7EE0 = 632192736
25AE7EE3 = 632192739
FCABFFBF = 4239130559
25AE7EE3 = 632192739
24AE7D4C = 615415116
C25B17F8 = 3260749816
FDAC0152 = 4255908178
FD4AB5 = 16599733
22AE7A2A = 581859882
FEAC02E5 = 4272685797
FD4AB5 = 16599733
FFFFFFFF = 4294967295
Это я нажимал всего одну кнопку на пульте.
Пробовал нажимать другие.
Не возможно понять где именно мой ИК код.
Так почему так получается, что на 14 и на 12 ноге показывало сигнал?
И как решить проблему?
После переустановки библиотек шума стало сильно меньше.
А то фотодиод/фотоприёмник выдавал много шума.
Теперь мало.
Примерно на 4 команды 1 шум.
В принципе так уже можно жить
Проблема такая:
ТВ и приставка к ТВ (IP телевидение от МТС/МГТС) не реагируют на посылы ИК команд.
Через камеру телефона вижу, что светодиод моргает.
Но ТВ не реагирует вообще никак.
Обычно на ТВ светодиод помаргивает если команда хотя бы приблизительно из его набора команд. Но оно даже не моргает.
Как найти проблему?
в IRremoteESP8266.h есть:
void sendMitsubishiAC(unsigned char data[]);
может кто разбирался? 🙂
задумка: в офисе кондиционер mitsubishi научить включаться и урегулировать климат до начала рабочего времени, с контролем температуры и влажности + вывод данных и управление через web.
есть:
wemos d1 r2
ик приемник KY-022
ик передатчик KY-005
часы реального времени DS3231
датчик температуры и влажности AM2320
lcd keypad shield до кучи 🙂
Библиотеку недавно расширили. Нужно разбираться. Точную марку кондиционера напишите.
пульт RYA502A006C
кондей MITSUBISHI DAIYA SRK28HJ (цифры вроде 28, высоко висит 🙂
А не подскажите в чем может быть печалька, залил в есп 12-2, а шлет какуюто ересь и на телике не работает, пульт такой же как у вас. А библиотеки случайно нет той которой вы использовали?
#include “IRsend.h”
Без неё не работает…
#include
Без этой библиотеки вообще не работает
#include “IRutils.h”