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 продублированы примеры из исходной библиотеки со всеми необходимыми изменениями.


  • 0
  • 12400

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

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