Как управлять Ардуино ДУ пультом. Проекты. Ардуино

Как управлять Ардуино ДУ пультом.
Как управлять Ардуино ДУ пультом.
Как управлять Ардуино ДУ пультом.

Привет! Сегодня доработаем программу для обработки сигналов с ИК пульта. Подключим rgb светодиод к схеме и будем управлять Ардуино ДУ пультом.

В прошлый раз мы делали обзор на приемник ик сигналов для Ардуино. В этом проекте мы будем его использовать, поэтому посмотрите тот пост, если пропустили.

Для выполнения этого урока нам понадобятся

  • Ардуино UNO
  • Макетная плата
  • Перемычки
  • IR модуль KY-022
  • RGB светодиод
  • 3 резистора 220 Ом
  • Пульт ДУ
  • Кабель USB

Принципиальная схема

Соберем схему с приемником ИК сигналов и RGB светодиодом.

Принципиальная схема RGB LED и Ик приемник
Принципиальная схема RGB LED и Ик приемник

Программа

А чтобы управлять светодиодом нам понадобиться доработать стандартную программу приема ИК сигнала.

Заведем нужные переменные для контактов 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, будет более предпочтительнее.

Где купить

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

Ваш адрес email не будет опубликован.