


Привет! Сегодня доработаем программу для обработки сигналов с ИК пульта. Подключим rgb светодиод к схеме и будем управлять Ардуино ДУ пультом.
Содержание
В прошлый раз мы делали обзор на приемник ик сигналов для Ардуино. В этом проекте мы будем его использовать, поэтому посмотрите тот пост, если пропустили.
Для выполнения этого урока нам понадобятся
- Ардуино UNO
- Макетная плата
- Перемычки
- IR модуль KY-022
- RGB светодиод
- 3 резистора 220 Ом
- Пульт ДУ
- Кабель USB
Принципиальная схема
Соберем схему с приемником ИК сигналов и RGB светодиодом.



Программа
А чтобы управлять светодиодом нам понадобиться доработать стандартную программу приема ИК сигнала.
Заведем нужные переменные для контактов rgb светодиода и для состояние каждого цвета. А так же, нам будет нужна переменная для сохранения состояние нажатой на пульте кнопки.
int RLED = 3;
int GLED = 5;
int BLED = 6;
int red = 0;
int green = 0;
int blue = 0;
int oldCode = 0;
В функции setup() настроим контакты на вывод
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(RLED, OUTPUT);
pinMode(GLED, OUTPUT);
pinMode(BLED, OUTPUT);
Serial.begin(115200);
IrReceiver.enableIRIn(); // Start the receiver
}
В функции loop() будем считывать сигналы от пульта. И передавать в нашу функцию принятое значение.
void loop() {
if (IrReceiver.decode()) {
Serial.println();
SetLED( IrReceiver.results.value );
IrReceiver.resume(); // Receive the next value
}
}
И теперь осталось написать функцию для обработки кодов.
Во-первых, выведем все коды, которые принимает модуль. Таким образом мы узнаем код, соответствующий нажатию каждой кнопки. Чтобы использовать его в программе.
Во-вторых, код -1 отвечает за повтор предыдущего кода. То есть, если нажать на кнопку и удерживать ее, то код будет -1. Нам понадобиться этот код, чтобы запрограммировать кнопки уменьшения и увеличения яркости на пульте.
Так же, в этом случае, нам нужно сохранить состояние нажатой кнопки до повтора, сохраним ее в конце функции в переменную oldCode.
И наконец, запрограммируем каждый код от пульта для включения своего цвета на RGB светодоиде.
void SetLED( int code ) {
Serial.print("CODE: \t");Serial.println(code);
switch (code) {
case -1:
SetLED(oldCode);
break;
case -16321:
red = 255; green = 255; blue = 255;
break;
case 16575:
red = 0; green = 0; blue = 0;
break;
case 8415:
red = 255; green = 0; blue = 0;
break;
case -24481:
red = 0; green = 255; blue = 0;
break;
case 24735:
red = 0; green = 0; blue = 255;
break;
case 10455:
red = 127; green = 127; blue = 0;
break;
case -22441:
red = 0; green = 127; blue = 127;
break;
case 26775:
red = 127; green = 0; blue = 127;
break;
case -32641:
red--;green--;blue--;
break;
case 255:
red++;green++;blue++;
break;
}
if( code != -1 ){oldCode = code;}
analogWrite(RLED, red = constrain(red, 0, 255));
analogWrite(GLED, green = constrain(green, 0, 255));
analogWrite(BLED, blue = constrain(blue, 0, 255));
Serial.print("RED: \t");Serial.println(red);
Serial.print("GREEN: \t");Serial.println(green);
Serial.print("BLUE: \t");Serial.println(blue);
}



Полный текст программы
#include <IRremote.h>
int RLED = 3;
int GLED = 5;
int BLED = 6;
int red = 0;
int green = 0;
int blue = 0;
int oldCode = 0;
#if defined(ESP32)
int IR_RECEIVE_PIN = 15;
#else
int IR_RECEIVE_PIN = 11;
#endif
IRrecv IrReceiver(IR_RECEIVE_PIN);
// On the Zero and others we switch explicitly to SerialUSB
#if defined(ARDUINO_ARCH_SAMD)
#define Serial SerialUSB
#endif
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(RLED, OUTPUT);
pinMode(GLED, OUTPUT);
pinMode(BLED, OUTPUT);
Serial.begin(115200);
#if defined(__AVR_ATmega32U4__) || defined(SERIAL_USB) || defined(SERIAL_PORT_USBVIRTUAL)
delay(2000); // To be able to connect Serial monitor after reset and before first printout
#endif
// Just to know which program is running on my Arduino
IrReceiver.enableIRIn(); // Start the receiver
}
void SetLED( int code ) {
Serial.print("CODE: \t");Serial.println(code);
switch (code) {
case -1:
SetLED(oldCode);
break;
case -16321:
red = 255; green = 255; blue = 255;
break;
case 16575:
red = 0; green = 0; blue = 0;
break;
case 8415:
red = 255; green = 0; blue = 0;
break;
case -24481:
red = 0; green = 255; blue = 0;
break;
case 24735:
red = 0; green = 0; blue = 255;
break;
case 10455:
red = 127; green = 127; blue = 0;
break;
case -22441:
red = 0; green = 127; blue = 127;
break;
case 26775:
red = 127; green = 0; blue = 127;
break;
case -32641:
red--;green--;blue--;
break;
case 255:
red++;green++;blue++;
break;
}
if( code != -1 ){oldCode = code;}
analogWrite(RLED, red = constrain(red, 0, 255));
analogWrite(GLED, green = constrain(green, 0, 255));
analogWrite(BLED, blue = constrain(blue, 0, 255));
Serial.print("RED: \t");Serial.println(red);
Serial.print("GREEN: \t");Serial.println(green);
Serial.print("BLUE: \t");Serial.println(blue);
}
void loop() {
if (IrReceiver.decode()) {
Serial.println();
SetLED( IrReceiver.results.value );
IrReceiver.resume(); // Receive the next value
}
}
Заключение
Таким образом мы написали программу для обработки ИК сигналов от пульта ДУ. Естественно, вместо rgb светодиода мы можем управлять любым другим оборудованием, с помощью управляющих сигналов от пульта. Хотя для света нужна прямая видимость между приемником и источником. Поэтому, возможно, использование беспроводной радио связи, например bluetooth, будет более предпочтительнее.