Arduino: управление светом с пульта дистанционного управления

Arduino + IR приёмник

В этой статье я расскажу, как можно управлять освещением в комнате с помощью пульта дистанционного управления.

Необходимые компоненты

  • Arduino
  • Реле на 5 вольт
  • IR-приёмник TSOP1xxx
  • Любой подходящий пульт ДУ

Сборка
Собираем следующую схему:
Схема соединения для управления светом

Внимание! Если код кнопки будет считываться с ошибками, либо не считываться совсем, необходимо собрать схему с фильтром:
Схема соединения для управления светом2

Распиновка IR-приёмника TSOP1xxx:

Распиновка TSOP1xxx

С реле возможны варианты. Обычное реле без обвязки подключать напрямую к Arduino нельзя! Обязательно необходимо использовать либо транзисторы, либо оптопару. Можно взять и готовую сборку, например такую:
Сдвоенное реле с обвязкой
Здесь два реле с обвязкой, можно подключать напрямую к микроконтроллеру (контакты IN1 и IN2). На контакты GND и VCC подаётся питание 5 вольт. Только необходимо иметь ввиду, что у некоторых таких сборок «логика наоборот». То есть при подаче сигнала реле отключается, при снятии — включается.
Также можно использовать и твердотельное реле, что я и сделал. Они хоть и дороже, но обладают рядом преимуществ: абсолютно бесшумная работа, очень малое энергопотребление, можно подключать напрямую к микроконтроллеру, широкий диапазон управляющего напряжения. Вот пример твердотельного реле для нагрузки переменного тока 24-380 В и управляющим напряжением от 3 до 32 вольт:

Твёрдотельное реле FOTEK SSR-25 DA
Пульт можно использовать практически любой. У меня был такой:
IR ПДУ

Для начала, нам необходимо узнать коды кнопок пульта, на которые мы хотим назначить управление освещением. Для этого заливаем в память Arduino следующий скетч:

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
/*************************************************************
project: IR to Serial
author: Gladyshev Dmitriy
description: Выводит в консоль код нажатой кнопки пульта
IDE: Arduino 1.0.1
*************************************************************/
 
#include <IRremote.h>
 
int RECV_PIN = 3; //пин подключения IR приёмника
 
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup()
{
  Serial.begin(9600);
  pinMode(7,OUTPUT);
  irrecv.enableIRIn(); // Start the receiver
}
 
void loop()
{
  if (irrecv.decode(&results)) 
  {
    Serial.println(results.value);
    irrecv.resume(); // Receive the next value
  }
}

Теперь при нажатии кнопок на пульте, в консоли должны появляться числа. Это и будет код кнопки. Запишите необходимый код.
Теперь заливаем в Arduino другой скетч:

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
/*************************************************************
project: IR Light v1.0
author: Gladyshev Dmitriy
description: Управление освещением с IR ПДУ
IDE: 1.0.1
2 марта 2013
*************************************************************/
 
#include <IRremote.h>
 
int RECV_PIN = 3; //пин подключения IR приёмника
int RELAY_PIN = 7; //пин подключения реле
 
IRrecv irrecv(RECV_PIN);
decode_results results;
bool LampState = false;
 
void setup()
{
  pinMode(RELAY_PIN,OUTPUT);
  digitalWrite(RELAY_PIN,LOW);
  irrecv.enableIRIn(); // Включаем ресивер
}
 
void loop()
{
  if (irrecv.decode(&results)) 
  {
	  if (results.value == 16713975) //Код кнопки
	  {
		  LampState = !LampState;
		  if (LampState)
		  {
			  digitalWrite(RELAY_PIN,HIGH);
		  }
		  else
		  {
			  digitalWrite(RELAY_PIN,LOW);
		  }
	  }
    irrecv.resume(); // Получаем следующее значение
  }
}

При необходимости изменяем номера пинов, к которым подключены IR-приёмник и реле:

11
12
int RECV_PIN = 3; //пин подключения IR приёмника
int RELAY_PIN = 7; //пин подключения реле

Также заменяем в следующей строчке код кнопки (на тот, который вы записали ранее):

29
if (results.value == 16713975) //Код кнопки

При включении питания лампа изначально не горит. При каждом нажатии кнопки на пульте будет включаться/выключаться.

Файлы
Скетч для чтения кода кнопок (713 bytes)
Основной скетч (1.01 KB)
Библиотеки:
IRRemote (23.21 KB)

Работа проверялась с Arduino IDE v1.0.1

Предупреждение!
Автор не несёт ответственности за возможную порчу оборудования. Всё, что вы делаете — вы делаете на свой страх и риск!

Похожие записи:

38 Комментарии “Arduino: управление светом с пульта дистанционного управления

    1. Самый простой способ — параллельно реле. Но тогда при включенном выключателе теряется возможность выключить свет с пульта. И наоборот — если свет включен с пульта, то его не удастся выключить выключателем.
      Способ второй — выключатель подключить к Arduino. Тогда потребуется небольшая модификация программы, чтобы ардуина реагировала на него. В этом случае свет можно будет включать/выключать с любого устройства. Если необходимо, могу в ближайшие дни написать код такой программы.

      1. Наверное лучше будет кнопку к ардуино подключить? А где бы взять такой выключатель который бы работал как кнопка т.е. непостоянно бы держал контакты замкнутыми, а только когда его держишь. это я думаю был бы выход…

        1. Таких много, достаточно ввести в гугл-картинках запрос «кнопка электрическая». Но вообще это не обязательно. Можно и выключатель с фиксацией контактов, а в программе делать проверку на не замыкание, а на изменение состояния кнопки (замкнута/разомкнута).

  1. Здравствуйте,
    Подскажите пожалуйста как сделать чтобы на выходе был сигнал только когда кнопка на ду нажата. Хочу сделать регулятор громкости в усилителе.

    1. Я надеюсь инфракрасный датчик запитываете от 3 вольт? Иначе просто сожгёте (если уже не сожгли) порты ардуины. Да и 3 вольт может не хватить для срабатывания некоторых реле.
      Ещё одна возможная причина: несоответствие таймингов из-за другой частоты процессора.

      1. Да я работаю с 3,3В. Приемник ИК нормально работает с таким напряжением, на выходе хорошо формируются пачки импульсов (смотрел осциллографом). В программе Arduino как только выбираю в настройках плату DUE, так сыпятся ошибки компиляции ( если стоит UNO — компиляция проходит без ошибок). Спасибо.

          1. «Библиотека «Arduino-IRremote-Due-master» не может быть использована. Имена библиотек должны содержать только основные буквы и цифры. (Только ASCII, без пробелов, причём имя не может начинаться с пробела.»)
            🙁 🙁

          2. Так название библиотеки не поменялось, имя файла то же самое. Просто замените файлы той библиотеки файлами этой.

  2. Есть возможность добавить дополнительно пару кнопок управления в данный слетчь ? если да прошу помочь как решыть задачу … Спасибо

    1. Да, конечно можно. Вот часть кода на две кнопки. Дальше думаю по аналогии добавите сколько вам нужно.

      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
      
        if (irrecv.decode(&results)) 
        {
      	  if (results.value == 16713975) //Код кнопки
      	  {
      		  LampState = !LampState;
      		  if (LampState)
      		  {
      			  digitalWrite(RELAY_PIN,HIGH);
      		  }
      		  else
      		  {
      			  digitalWrite(RELAY_PIN,LOW);
      		  }
      	  }
       
                if (results.value == 12345678) //Код другой кнопки
      	  {
      		  LampState2 = !LampState2;
      		  if (LampState2)
      		  {
      			  digitalWrite(RELAY_PIN2,HIGH);
      		  }
      		  else
      		  {
      			  digitalWrite(RELAY_PIN2,LOW);
      		  }
      	  }
          irrecv.resume(); // Получаем следующее значение

      Конечно же не забудьте добавить новые переменные LampState2 и RELAY_PIN2. Если возникнут вопросы — обращайтесь.

      1. Спасибо Вам огромное! правельно я зделал или надо чтото добавить?

        #include

        int RECV_PIN = 11; //пин подключения IR приёмника pin 11
        int RELAY_PIN = 7; //пин подключения реле pin 7
        int RELAY_PIN2 = 6; //пин подключения реле pin 6

        IRrecv irrecv(RECV_PIN);
        decode_results results;
        bool LampState = false;
        bool LampState2 = false;

        void setup()
        {
        pinMode(RELAY_PIN,OUTPUT);
        digitalWrite(RELAY_PIN,LOW);
        irrecv.enableIRIn(); // Включаем ресивер
        }

        void loop()
        {
        if (irrecv.decode(&results))
        {
        if (results.value == 16713975) //Код кнопки
        {
        LampState = !LampState;
        if (LampState)
        {
        digitalWrite(RELAY_PIN,HIGH);
        }
        else
        {
        digitalWrite(RELAY_PIN,LOW);
        }
        }

        if (results.value == 12345678) //Код другой кнопки
        {
        LampState2 = !LampState2;
        if (LampState2)
        {
        digitalWrite(RELAY_PIN2,HIGH);
        }
        else
        {
        digitalWrite(RELAY_PIN2,LOW);
        }
        }
        irrecv.resume(); // Получаем следующее значение
        }
        }

        1. Для второго реле в процедуре setup
          имеет смысл добавить pinMode(RELAY_PIN2,OUTPUT);
          ну и может быть (если вам нужно чтоб она по умолчанию не горела.)
          digitalWrite(RELAY_PIN2,LOW);

  3. Здравствуйте. Извините, если вопрос не по теме. У меня комната, по периметру 32 лампы LED в потолке. Хочу поиграться светом. В идеале нужно сделать, чтобы лампочки загорались одна за другой. Как в пульте от телевизора. Нажал, к примеру, на кнопку переключения каналов — одна лампочка, нажал на эту же кнопку — две горят, нажал еще раз — горят три и так до последней. Спасибо.

    1. Здравствуйте Валерий я думаю это возможно , я не спец в этом но я примерно подумал как это зделать:

      [code]
      #include

      int RECV_PIN = 11; //Вход для ИК приёмника
      IRrecv irrecv(RECV_PIN);
      decode_results results;
      int a=0;
      int b=0;
      int c=0;
      int d=0;
      int e=0;
      int f=0;
      int g=0;

      void setup()
      {
      irrecv.enableIRIn();

      pinMode(13, OUTPUT); //Выход сигнала 13,2,3,4,5,6,7… пины
      pinMode(2, OUTPUT);
      pinMode(3, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(7, OUTPUT);

      }

      void loop() {
      if (irrecv.decode(&results)) {
      delay(300);

      if (results.value == 0xE13DDA28) {a=a+1;} //Код кнопки 1
      if (results.value == 0xAD586662) {b=b+1;} //Код кнопки 2
      if (results.value == 0x273009C4) {c=c+1;} //Код кнопки 3
      if (results.value == 0xF5999288) {d=d+1;} //Код кнопки 4
      if (results.value == 0x731A3E02) {e=e+1;} //Код кнопки 5
      if (results.value == 0x2C452C6C) {f=f+1;} //Код кнопки 6
      if (results.value == 0x4592E14C) {g=g+1;} //Код кнопки 7

      if (a==1){digitalWrite(13, LOW);} else {digitalWrite(13, HIGH); a=0;}
      if (b==1){digitalWrite(2, LOW);} else {digitalWrite(2, HIGH); b=0;}
      if (c==1){digitalWrite(3, LOW);} else {digitalWrite(3, HIGH); c=0;}
      if (d==1){digitalWrite(4, LOW);} else {digitalWrite(4, HIGH); d=0;}
      if (e==1){digitalWrite(5, LOW);} else {digitalWrite(5, HIGH); e=0;}
      if (f==1){digitalWrite(6, LOW);} else {digitalWrite(6, HIGH); f=0;}
      if (g==1){digitalWrite(7, LOW);} else {digitalWrite(7, HIGH); g=0;}

      {
      delay(50);
      }
      irrecv.resume();

      }

      }
      [/code]

      1. Вы его не так поняли. Необходимо управлять двумя кнопками, 32 светодиода.
        Есть два варианта:
        1. Arduino Mega. Заводим глобальную переменную int, которую увеличиваем/уменьшаем при нажатии на кнопки. И соответственно значению этой переменной включаем необходимое количество выходов.
        2. Arduino Uno/Duemilanove и другие. Необходимо 4 микросхемы PCF8574 (расширители для шины I2C). Каждая даст по 8 выходов. И соответственно уже управляем не выходами ардуины, а выходами этих микросхем по шине I2C.

  4. СПАСИБО огромное! Делаю управление 8-ю группами освещения дома, сначала 2 недели мучался с библиотекой мр1051 (купил пульт от мастеркит мр1094, а там она прилагалась), настолько она кривая. И тут, о чудо наткнулся на ваш скетч (при прочесывании инета). За вечер сделал нормально работающую программу и, самое главное, без дребезга кнопок на пульте ДУ.

  5. Делаю управление от пульта для люстры с выключателем на две клавиши, т.е. две кнопки на пульте и также оставить возможность включать и выключать выключателем — чтоб включать или выключать независимо или пультом или выключателем, НО как добавить отслеживание состояния выключателя не пойму (выключатель обычный двухклавишный, с фиксацией).
    Первое что пришло в голову добавить в выключатель пружину, чтоб нажав выключатель он вернулся в исходное состояние, но вроде можно сделать и програмнно на ардуине как я понял.
    Помогите плиз с скетчем для ардуины, увенрен уже кто то делал.
    Саму схему уже спаял, нужна прошивка 🙂

  6. NightFlashб выложите пожалуйста скетч для выключателя с фиксацией контактов, в программе проверка на не замыкание, а на изменение состояния кнопки (замкнута/разомкнута).

    1. Проверяйте. Переключатель подключается ко второму пину и земле.

      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
      
      /*************************************************************
      project: IR Light v2.0
      author: Gladyshev Dmitriy
      description: Управление освещением с IR ПДУ
      IDE: 1.0.5
      2 марта 2015
      http://student-proger.ru/2013/03/arduino-upravlenie-svetom-s-pulta-distancionnogo-upravleniya/
      *************************************************************/
       
      #include <IRremote.h>
       
      int RECV_PIN = 3; //пин подключения IR приёмника
      int RELAY_PIN = 7; //пин подключения реле
      int BUTTON_PIN = 2; //пин выключателя
       
      IRrecv irrecv(RECV_PIN);
      decode_results results;
      bool LampState = false;
      unsigned long time = millis();
      int lastButtonState;
       
      void setup()
      {
        pinMode(RELAY_PIN, OUTPUT);
        pinMode(BUTTON_PIN, INPUT);
        digitalWrite(RELAY_PIN, LOW);
        digitalWrite(BUTTON_PIN, HIGH);
        irrecv.enableIRIn(); // Включаем ресивер
        lastButtonState = digitalRead(BUTTON_PIN);
      }
       
      void loop()
      {
        if ((lastButtonState!=digitalRead(BUTTON_PIN)) && (millis() - time > 500))
        {
          LampState = !LampState;
          if (LampState)
          {
            digitalWrite(RELAY_PIN,HIGH);
          }
          else
          {
            digitalWrite(RELAY_PIN,LOW);
          }
          time = millis();
          lastButtonState=digitalRead(BUTTON_PIN);
        }
       
        if (irrecv.decode(&results)) 
        {
          if (results.value == 16713975) //Код кнопки
          {
            LampState = !LampState;
            if (LampState)
            {
              digitalWrite(RELAY_PIN,HIGH);
            }
            else
            {
              digitalWrite(RELAY_PIN,LOW);
            }
          }
          irrecv.resume(); // Получаем следующее значение
        }
      }
      1. А можно модифицировать для двух переключателей, двух кнопок ИК пульта и двух реле? У меня люстра с двойным выключателем…

          1. RC фильтр поставил изначально, имеется ввиду не кнопка ИК пульта, с пульта все как танк работает)), а вот выключатель который с фиксацией, иногда включая или выключая его «меняются местами функции», т.е. если замкнуто то по началу включено, а пару раз клацнеш туда сюда и в замкнутом состоянии получается выключено и так туда сюда меняется переодически. несколько сумбурное пояснил наверное я…

          2. Там стоит время задержки 500 мс. Если за эти полсекунды сменить два и более раза состояние кнопки, то изменится только один раз. Это сделано для исключения дребезга контактов. Можно это время чуть меньше выставить. Если конечно я правильно понял, что имелось ввиду)

  7. Собственно уже не первый месяц эта схема у меня работает на выключателе света в комнате, но есть одно НО: если при выключенном свете, на этой же линии 220 включают/выключают другую лампу или работает холодильник, то в момент переключения лампы у меня мигают — не могу понять как это исправить, можно конешно тупо обычные реле поставить и все исправится, но реле будут «клацать»

  8. Доброго времени суток!
    подскажите по программному коду…
    у меня есть радио пульт на 4 кнопки 315 мГц с модулем декодером, у не го по пинам +5v, земля и 4 сигнальных.
    интересует скейтч для подключение к модулю реле на 4 канала, чтоб при каждом нажатии на кнопку включалось реле и выключалось при нажатии на ту же клавишу.
    помогите, а то уже совсем запутался в коде…

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *