Arduino - два независимых ИК-приёмника и передатчика
1
В статье рассказано о том, как подключить к ардуине два независимых инфракрасных приёмника и передатчика.
Предполагается использование в составе «Умного дома».
Зачем это нужно
Например можно разнести приёмники в разные комнаты (подключив их к ардуине витой парой, у меня работает на длине ~15м) и включать разные устройства одним и тем же пультом, одной и той же кнопкой.
В процессе эксплуатации замечено, что если в сети есть некачественные энергосберегающие лампы или какие-либо трансформаторы, то приёмник на длинном проводе ловит помехи и система плохо работает.
Конечно, ситуация с одним однокнопочным пультом встречается крайне редко и можно просто подключить эти два приёмника к одному пину, но тем не менее, эта ситуация возникла, и послужила поводом для того, чтоб «склонировать» существующую библиотеку IRremote и сделать возможным использование двух библиотек в одном скетче.
Теперь к делу…
Подключение
Только приёмники:
Схема верна для приёмников TSOP2ххх и TSOP32хх, наиболее предпочтительный вариант — TSOPxx38 (38kHz).
Приёмники и передатчики:
Резисторы 100-400ом.
Программирование
Скачайте библиотеки IRremote и IRstD, установите их стандартным способом и залейте тестовый скетч:
// Первая библиотека
#include <IRremote.h>
IRrecv irrecv(12); // пин приёмника (можно любой кроме пина передатчика и 13)
IRsend irsend; // пин передатчика для Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, Uno - (3), для Мега - (9), для ATmega32U4 - (10).
decode_results results;
// Вторая библиотека
#include <IRstD.h>
IRrecvstd irrecvstd(10); // пин приёмника (можно любой кроме пина передатчика и 13)
IRsendstd irsendstd; // пин передатчика для Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, Uno, ATmega32U4 - (9), для Мега - (5).
decode_resultsstd res_std;
byte incomingbyte;
void setup()
{
Serial.begin(57600);
irrecv.enableIRIn(); // старт первый приёмник
irrecvstd.enableIRInstd(); // старт второй приёмник
}
void loop()
{
if(irrecv.decode(&results)) // первый приёмник
{
Serial.print("1:");
Serial.println(results.value);
results.value = 0;
irrecv.resume();
}
if(irrecvstd.decodestd(&res_std)) // второй приёмник
{
Serial.print("2:");
Serial.println(res_std.valuestd);
irrecvstd.resumestd();
res_std.valuestd = 0;
}
if(Serial.available() > 0)
{
incomingbyte = Serial.read();
if(incomingbyte == 'A')
{
irsend.sendSony(15415119, 12); // посылаем ик-сигнал для Sony первым ик-передатчиком
Serial.println("Send IR 1");
}
if(incomingbyte=='B')
{
irsendstd.sendNECstd(615415119, 38); // посылаем ик-сигнал для NEC вторым ик-передатчиком
Serial.println("Send IR 2");
}
}
}
Откройте монитор последовательного порта, возьмите пульт и понажимайте кнопки. Вы увидите коды кнопок считаные первым и вторым приёмниками.
Отправьте ардуине символ A:
Отработает первый передатчик.
Отправьте символ B:
Отработает второй передатчик.
Чтоб убедится в работе передатчиков, можно посмотреть через видеокамеру телефона.
Теперь предположим, что у вас есть ик-пульт с одной кнопкой и вы хотите включать этим пультом свет в разных помещениях.
Считываем код кнопки:
Разносим приёмники в разные места и заливаем в ардуину вот такой скетч:
// Первая библиотека
#include <IRremote.h>
IRrecv irrecv(12); // пин приёмника (можно любой кроме пина передатчика и 13)
IRsend irsend; // пин передатчика для Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, Uno - (3), для Мега - (9), для ATmega32U4 - (10).
decode_results results;
// Вторая библиотека
#include <IRstD.h>
IRrecvstd irrecvstd(10); // пин приёмника (можно любой кроме пина передатчика и 13)
IRsendstd irsendstd; // пин передатчика для Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, Uno, ATmega32U4 - (9), для Мега - (5).
decode_resultsstd res_std;
byte incomingbyte;
void setup()
{
irrecv.enableIRIn(); // старт первый приёмник
irrecvstd.enableIRInstd(); // старт второй приёмник
pinMode(7, OUTPUT);
pinMode(13, OUTPUT);
}
void loop()
{
if(irrecv.decode(&results)) // первый приёмник
{
if(results.value == 83593335)
{
digitalWrite(7, HIGH);
}
results.value = 0;
irrecv.resume();
}
if(irrecvstd.decodestd(&res_std)) // второй приёмник
{
if(res_std.valuestd == 83593335)
{
digitalWrite(13, HIGH);
}
irrecvstd.resumestd();
res_std.valuestd = 0;
}
}
В результате если послать сигнал первому приёмнику, то загорится D7, а если послать тот же сигнал второму приёмнику, то загорится D13.
Что же касается независимых передатчиков, то я пока что не нашёл им применения, однако надеюсь кому-то это может пригодится…
В архиве IRstD продублированы примеры из исходной библиотеки со всеми необходимыми изменениями.
Вступайте в Telegram-группу Arduino
- +484
- stD
44639
Поддержать автора
Комментарии (6)