![Управление на четири релета с Arduino и инфраред (IR)](http://ardudevelop.eu/wp-content/uploads/2024/08/Управление-на-четири-релета-с-Arduino-и-инфраред-IR.png)
В тази статия ще разгледаме как да управляваме четири релета с помощта на 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>
- Библиотеката IRremote съдържа функции, които улесняват работата с IR сензори и декодиране на сигнали от дистанционно управление.
Деклариране на пинове и обекти
int RECV_PIN = 9;
IRrecv irrecv(RECV_PIN);
decode_results results;
- Определя се пинът, към който е свързан IR сензорът (пин 9). Обектът irrecv се използва за приемане на сигнали, а обектът results съхранява декодираните данни.
Функция setup()
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // Стартиране на приемника
}
- В setup() се активира серийна комуникация и се стартира IR приемникът.
Функция loop()
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // Приемане на следващата стойност
}
}
- В 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 и IR” можете да управлявате различни електрически устройства с помощта на дистанционно управление и Arduino. Изчитането на IR кодовете в началото на процеса е ключова стъпка, която позволява правилното конфигуриране на командите за всяко реле. Този подход е особено полезен за домашна автоматизация и други проекти, изискващи дистанционен контрол на устройства. На същата тема може да разгледате и този проект.