Управление на четири релета с Arduino и инфраред (IR)

Управление на четири релета с Arduino и инфраред (IR)

В тази статия ще разгледаме как да управляваме четири релета с помощта на Arduino UNO и инфраред (IR) сензор. Проектът позволява дистанционно управление на различни електрически устройства, свързани към релетата. В началото ще представим основния код за изчитане и принтиране на резултатите от IR сензора, който е основен елемент за разпознаване на командите от дистанционното управление. Тези резултати се използват за конфигуриране на управлението на релетата.

Изчитане на IR кодове с Arduino

Преди да преминем към управлението на релетата, е необходимо да изчетем и разпознаем IR кодовете, които се изпращат от дистанционното управление. Това се постига с помощта на следния код:

#include <IRremote.h>

int RECV_PIN = 9;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}

Този код има за цел да изчита и отпечатва резултатите, получени от IR сензора, като по този начин можем да разберем кодовете, които различните бутони на дистанционното управление изпращат. Кодовете се отпечатват в HEX формат, което улеснява последващото им използване в основния код за управление на релетата.

Има различни библиотеки за използването на инфраред (IR) с Arduino, ние сме използвали тази. Ако не знаете как да добавите библиотеката във вашето Arduino IDE прочетете нашата страница Arduino IDE бърз преглед.

Обяснение на кода:

Импортиране на библиотеката IRremote

#include <IRremote.h>
  1. Библиотеката IRremote съдържа функции, които улесняват работата с IR сензори и декодиране на сигнали от дистанционно управление.

Деклариране на пинове и обекти

int RECV_PIN = 9;

IRrecv irrecv(RECV_PIN);

decode_results results;
  1. Определя се пинът, към който е свързан IR сензорът (пин 9). Обектът irrecv се използва за приемане на сигнали, а обектът results съхранява декодираните данни.

Функция setup()

void setup() {

  Serial.begin(9600);

  irrecv.enableIRIn(); // Стартиране на приемника

}
  1. В setup() се активира серийна комуникация и се стартира IR приемникът.

Функция loop()

void loop() {

  if (irrecv.decode(&results)) {

    Serial.println(results.value, HEX);

    irrecv.resume(); // Приемане на следващата стойност

  }

}
  1. В loop() функцията се проверява дали има получен IR сигнал. Ако има, кодът на сигнала се отпечатва на серийния монитор в HEX формат, след което приемникът се подготвя за следващ сигнал.

Управление на релета с получените IR кодове и Arduino

След като вече сме изчели IR кодовете от дистанционното управление, можем да ги използваме в основния код за управление на релетата. Това е предложения от нас код:

#include "IRremote.h"

int receiver = 9; // IR сензор на пин 9

IRrecv irrecv(receiver); // Създаване на инстанция 'irrecv'
decode_results results;  // Създаване на инстанция 'decode_results'

int relay_1 = 2;
int relay_1_status = 0;

int relay_2 = 3;
int relay_2_status = 0;

int relay_3 = 4;
int relay_3_status = 0;

int relay_4 = 5;
int relay_4_status = 0;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();

  pinMode(relay_1 , OUTPUT);
  digitalWrite(relay_1 , HIGH);

  pinMode(relay_2 , OUTPUT);
  digitalWrite(relay_2 , HIGH);

  pinMode(relay_3 , OUTPUT);
  digitalWrite(relay_3 , HIGH);

  pinMode(relay_4 , OUTPUT);
  digitalWrite(relay_4 , HIGH);
}

void loop() {
  if (irrecv.decode(&results)) { // Проверка дали имаме получен IR сигнал 
    translateIR(); 
    irrecv.resume(); // Получаване на следваща стойност от IR приемника
  }  
}


void translateIR() {

  Serial.println(results.value);

  if (results.value == 0xFF22DD) {
    relay_1_status = relay_1_status + 1;
    Serial.println(relay_1_status);

      if (relay_1_status == 1) {
        digitalWrite(relay_1 , LOW);
        Serial.println("Relay 1 is ON");
      }
      if (relay_1_status == 2) {
        digitalWrite(relay_1 , HIGH);
        Serial.println("Relay 1 is OFF");
        relay_1_status = 0;
      }
  }

  if (results.value == 0xFFC23D) {
    relay_2_status = relay_2_status + 1;
    Serial.println(relay_2_status);

      if (relay_2_status == 1) {
        digitalWrite(relay_2 , LOW);
        Serial.println("Relay 2 is ON");
      }
      if (relay_2_status == 2) {
        digitalWrite(relay_2 , HIGH);
        Serial.println("Relay 2 is OFF");
        relay_2_status = 0;
      }
  }

  if (results.value == 0xFFE01F) {
    relay_3_status = relay_3_status + 1;
    Serial.println(relay_3_status);

      if (relay_3_status == 1) {
        digitalWrite(relay_3 , LOW);
        Serial.println("Relay 3 is ON");
      }
      if (relay_3_status == 2) {
        digitalWrite(relay_3 , HIGH);
        Serial.println("Relay 3 is OFF");
        relay_3_status = 0;
      }
  }

  if (results.value == 0xFF906F) {
    relay_4_status = relay_4_status + 1;
    Serial.println(relay_4_status);

      if (relay_4_status == 1) {
        digitalWrite(relay_4 , LOW);
        Serial.println("Relay 4 is ON");
      }
      if (relay_4_status == 2) {
        digitalWrite(relay_4 , HIGH);
        Serial.println("Relay 4 is OFF");
        relay_4_status = 0;
      }
  }

  if (results.value == 0xFFA25D) {
    digitalWrite(relay_1 , LOW);
    digitalWrite(relay_2 , LOW);
    digitalWrite(relay_3 , LOW);
    digitalWrite(relay_4 , LOW);
    Serial.println("ALL Relay is ON");
  }

  if (results.value == 0xFFE21D) {
    digitalWrite(relay_1 , HIGH);
    digitalWrite(relay_2 , HIGH);
    digitalWrite(relay_3 , HIGH);
    digitalWrite(relay_4 , HIGH);
    Serial.println("ALL Relay is OFF");
  }

  delay(200); // Изчакване на 0.2 секунди за следващата команда
}

В този кода вие лесно може да прибавите и друг вид комуникация с Arduino, като връска с компютър през USB или Bluetooth комуникация със вашия смартфон. Ако не знаете как да направите това може да разгледате нашата статия: Серийна комуникация с Arduino UNO чрез USB или Bluetooth HC-05.

Обяснение на кода

1. Импортиране на библиотеката за IR сензор

#include "IRremote.h"

Тази библиотека е необходима за работа с IR сензора и управление на релета въз основа на командите, изпратени от дистанционно управление.

2. Деклариране на променливи

int receiver = 9; // IR сензор на пин 9

IRrecv irrecv(receiver); // Създаване на обект 'irrecv'

decode_results results; // Създаване на обект 'decode_results'

int relay_1 = 2;  // Реле 1 на пин 2
int relay_1_status = 0;  // Променлива която я използваме за брояч

int relay_2 = 3;  // Реле 2 на пин 3
int relay_2_status = 0;  // Променлива която я използваме за брояч

int relay_3 = 4;  // Реле 3 на пин 4
int relay_3_status = 0;  // Променлива която я използваме за брояч

int relay_4 = 5;  // Реле 4 на пин 5
int relay_4_status = 0; // Променлива която я използваме за брояч

Тук се задават пиновете за IR сензора и релетата, както и се създават обекти за управление на приемането и декодирането на IR сигнали. Може да разгледате пин диаграмата на различните платформи Arduino като посетите или кликнете на нашия раздел: Ревюта.

3. Функция setup()

void setup() {

  Serial.begin(9600);

  irrecv.enableIRIn();  // Инициализация на IR приемникът

  pinMode(relay_1 , OUTPUT);  // Задаване на пин на реле_1 като изходен пин
  digitalWrite(relay_1 , HIGH);  // Вдигане на пин на реле_1 въс високо състояние защото релетата са оптронно разделени и подадения сигнал се инвертира

  pinMode(relay_2 , OUTPUT);
  digitalWrite(relay_2 , HIGH);

  pinMode(relay_3 , OUTPUT);
  digitalWrite(relay_3 , HIGH);
  
  pinMode(relay_4 , OUTPUT);
  digitalWrite(relay_4 , HIGH);

}

В setup() функцията се инициализира IR приемникът и се конфигурират пиновете на релетата като изходи. Начално състояние на всяко реле е “изключено(HIGH).

4. Функция loop()

void loop() {

  if (irrecv.decode(&results)) { // Проверка дали имаме получен IR сигнал 
    translateIR();
    irrecv.resume(); // Приема следващата стойност

  }  
}

Във функцията loop(), if (irrecv.decode(&results)) проверява дали има получен IR сигнал, и ако има, предава управлението на функцията translateIR() за обработка на сигнала.

5. Функция translateIR()

void translateIR() {

  Serial.println(results.value);

  if (results.value == 0xFF22DD) {
    relay_1_status = relay_1_status + 1;
    Serial.println(relay_1_status);

      if (relay_1_status == 1) {
        digitalWrite(relay_1 , LOW);
        Serial.println("Relay 1 is ON");
      }

      if (relay_1_status == 2) {
        digitalWrite(relay_1 , HIGH);
        Serial.println("Relay 1 is OFF");
        relay_1_status = 0;
      }
  }

  ...

  delay(200); // Изчакване на 0.2 секунди за следващата команда

}

Функцията translateIR() декодира IR сигнала и контролира състоянието на релетата според получените данни. Всяко натискане на бутон на дистанционното управление генерира уникален код. След проверка на кода с if (results.value == 0xFF22DD) се покачва стойността на брояча relay_1_status с 1. Следва проверка на стойността на брояча if (relay_1_status == 1). Ако брояча отговаря на съответната стойност 1, релето се включва digitalWrite(relay_1 , LOW). Ако брояча отговаря на стойността 2, релето се изключва digitalWrite(relay_1 , HIGH) и брояча се нулира relay_1_status = 0.

Кратка видео презентация на проекта

Arduino infrared (IR) Relay control

Заключение

С този проект “Управление релета с Arduino и IR” можете да управлявате различни електрически устройства с помощта на дистанционно управление и Arduino. Изчитането на IR кодовете в началото на процеса е ключова стъпка, която позволява правилното конфигуриране на командите за всяко реле. Този подход е особено полезен за домашна автоматизация и други проекти, изискващи дистанционен контрол на устройства. На същата тема може да разгледате и този проект.