Arduino - два независимых ИК-приёмника и передатчика

1

arduino ir


В статье рассказано о том, как подключить к ардуине два независимых инфракрасных приёмника и передатчика.



Предполагается использование в составе «Умного дома».



Зачем это нужно


Например можно разнести приёмники в разные комнаты (подключив их к ардуине витой парой, у меня работает на длине ~15м) и включать разные устройства одним и тем же пультом, одной и той же кнопкой.

В процессе эксплуатации замечено, что если в сети есть некачественные энергосберегающие лампы или какие-либо трансформаторы, то приёмник на длинном проводе ловит помехи и система плохо работает.


Конечно, ситуация с одним однокнопочным пультом встречается крайне редко   и можно просто подключить эти два приёмника к одному пину, но тем не менее, эта ситуация возникла, и послужила поводом для того, чтоб «склонировать» существующую библиотеку IRremote и сделать возможным использование двух библиотек в одном скетче.


Теперь к делу…





Подключение


Только приёмники:



Схема верна для приёмников TSOP2ххх и TSOP32хх, наиболее предпочтительный вариант — TSOPxx38 (38kHz).

tsop








Приёмники и передатчики:


ик ардуино
Резисторы 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
  • 18514
Telegram-канал istarik

Известит Вас о новых публикациях...



Комментарии (6)

0
Круто! Как раз то, что искал. Сегодня попробую на своей Nano)
  • avatar
  • Ryt
0
Если что, пишите.
0
подключил первый приемник на d10, второй на d12. Передатчики на d3 и d9. Всё на Uno.
второй приемник работает, считывает сигналы от обоих передатчиков, первый приемник никак не реагирует на сигналы передатчиков.
Проверял приемники в другом скетче, оба рабочие.
Что подскажите?
0
Подскажите, во второй библиотеки изменения коснулись только irremote.h? у меня есть необходимость в подключении 4-х датчиков, вот думаю как это сделать.
0
Изменения коснулись всех файлов.
0
доброго времени суток…
как можно подключить восемь ик приемник ардуино и соответственно восемь инфракрасный диод…
собрал так называемую ик сенсорную площадку 50 см на 50 см…
если поставит на ик сенсорную площадку предмет то хочу зафиксировать…
заранее благодарен за ответ…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.