Управляем бытовой техникой из консоли

Проекты на Arduino Uno и Slot Shield

Управлять бытовой техникой из консоли монитора порта очень просто. Просканируйте сигналы, которые отпраляет пульт с помощью ИК-приёмника и повторите их светодиодом. Вот и вся наука.

Устройство построено на оригинальной Arduino Uno. Плата управляет бытовой техникой с помощью ИК-передатчика. Коды команд управления заранее считываются ИК-приёмником.

Видеоинструкция

Что потребуется

Полный сет компонентов проекта. В сет входят:

Как собрать

Установите Troyka Slot Shield на Arduino Uno

Вставьте ИК-приёмник в разъём С. Ножка S должна подключится к пину 4. Аналогично подключите ИК-передатчик к пину 9 слота E.

Скетч

Как прошить контроллер через Arduino IDE.

ir-remote.ino
// Библиотека для хранения данных во флеше вместо RAM
#include <avr/pgmspace.h>
 
// Библиотека для работы с ИК-приёмником и передатчиком
#include <IRremote.h>
 
// Имя пина, которому подключен приёмник
#define RECV_PIN 4
// Имя пина, к которому подключен передатчик
#define SEND_PIN 9
 
// Создаём объект для ИК-приёмника
IRrecv irrecv(RECV_PIN);
 
// Создаём объект для ИК-передатчика
IRsend irsend;
 
// Создаём объект для декодированных команд с ИК-пульта
decode_results results;
 
// Массивы для хранения ИК-команд: On и Off
const unsigned int PROGMEM irSignalOn [] = {9050, 4400, 600, 1600, 650, 1600, 650, 450, 650, 450, 650, 500, 600, 500, 600, 1600, 650, 1600, 650, 1600, 600, 1650, 600, 1600, 650, 1600, 650, 450, 600, 500, 650, 450, 650, 1600, 650, 450, 650, 450, 650, 450, 650, 500, 600, 500, 600, 1600, 650, 1600, 650, 1600, 600, 500, 600, 500, 650, 450, 650, 450, 650, 450, 650, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 650, 450, 650, 1600, 600, 1650, 600, 500, 600, 500, 600, 550, 600, 500, 600, 500, 600, 450, 650, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 600, 500, 600, 1600, 600, 550, 600, 500, 600, 500, 600, 500, 550, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 550, 600, 500, 550, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 550, 600, 500, 550, 550, 600, 1600, 600, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 600, 500, 550, 1650, 600, 550, 550, 1650, 600, 500, 600, 550, 550, 550, 550, 550, 600, 500, 600, 1600, 650, 1600, 600, 1650, 600, 500, 600, 1600, 650, 450, 650, 1600, 650, 1600, 650},
    PROGMEM irSignalOff [] = {9050, 4400, 650, 1600, 600, 1650, 600, 500, 600, 500, 600, 500, 600, 550, 550, 1650, 600, 1600, 600, 1650, 650, 1600, 600, 1650, 600, 1600, 600, 550, 600, 500, 600, 500, 600, 1600, 650, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 1650, 600, 1600, 650, 1600, 650, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 550, 550, 550, 550, 600, 450, 650, 500, 600, 450, 650, 1600, 650, 1600, 600, 500, 600, 500, 650, 450, 650, 500, 550, 500, 650, 450, 600, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 650, 450, 600, 1650, 650, 450, 650, 450, 650, 450, 650, 450, 650, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 600, 450, 650, 500, 600, 450, 650, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 600, 500, 650, 450, 600, 500, 650, 450, 600, 500, 650, 1600, 650, 500, 600, 1600, 600, 550, 600, 500, 600, 500, 600, 500, 600, 500, 600, 1600, 650, 1600, 600, 1650, 600, 500, 600, 1650, 600, 1600, 650, 500, 550, 1650, 650};
 
// Переменная для хранения состояния режима "запись ИК-сигнала"
bool recordState = /*true;*/ false;   // true - для режима чтения, false - для игнорирования режима чтения
 
// Частота (КГц) с которой будут передаваться сигналы
int khz = 38;
 
// Строка с хранением данных введенных в последовательный порт
String command = "";
 
void setup() {
  // открываем последовательный порт
  Serial.begin(9600);
  // если состояния режима "чтение ИК-сигнала", true
  if (recordState) {
    // Запускаем работу ИК-приёмника
    irrecv.enableIRIn();
    // производим процесс декодирование принятых сигналов
    reading (&results);
  }
}
 
void loop() {
  // пока в Serial port поступают символы...
  while (Serial.available() > 0) {
    // ...символ записываем в переменную
    char symbol = Serial.read();
    // если приходит символ разрыва строки...
    if (symbol == '\n') {
      // выводим полученную команду
      Serial.println(command);
      // идентифицируем полученную команду
      if ( command == "ON") {
        // если пришла команда ON, выполняем отправку соответствующей команды
        sending (irSignalOn);
        // выводим сообщение об отправке
        Serial.println("Signal \"ON\" sent.");
      } else if (command == "OFF") {
        // если пришла команда OFF, выполняем отправку соответствующей команды
        sending (irSignalOff);
        // выводим сообщение об отправке
        Serial.println("Signal \"OFF\" sent.");
      }
 
      for (int i = 0; i < sizeof(irparams.rawbuf) / sizeof(irparams.rawbuf[0]); i++) {
        irparams.rawbuf[i] = 0;
      }
      command = "";
    } else  {
      // ... если символ не является символом разрыва строки, то вписываем его в последовательность
      command += symbol;
    }
  }
}
 
// функция отправки ИК-команд
void sending (unsigned int irSygnal[]) {
  // если пришла команда , извлекаем массив команды из флеш памяти
  for (int i = 0; i < sizeof(irparams.rawbuf) / sizeof(irparams.rawbuf[0]); i++) {
    irparams.rawbuf[i] = pgm_read_word_near(irSygnal + i);
  }
  // выполняем отправку команды
  irsend.sendRaw(irparams.rawbuf, sizeof(irparams.rawbuf) / sizeof(irparams.rawbuf[0]), khz);
  // выводим сообщение об отправке
 
}
 
// функция режима "чтение ИК-сигнала"
void reading (decode_results *results) {
  // "Введите команду с пульта дистанционного управления"
  Serial.println("Enter the command from the remote control. ");
  while (1) {
    // ожидаем, пока придет команда с пульта
    if (irrecv.decode(results)) {
      Serial.print("irSygnal[");                // имя массива
      Serial.print(results->rawlen - 1, DEC);  // размер массива
      Serial.print("] = {");
      // Дамп данных
      for (int i = 1;  i < results->rawlen;  i++) {
        Serial.print(results->rawbuf[i] * USECPERTICK, DEC);
        if ( i < results->rawlen - 1 ) Serial.print(","); // ',' не нужна на последнем
        if (!(i & 1))  Serial.print(" ");
      }
      Serial.println("};");
      // перезапустим ИК-приёмник
      irrecv.resume();
      break;
    }
  }
  // запускаем функцию вновь
  reading (results);
}

Часто задаваемые вопросы

Где скачать необходимые библиотеки и как их установить?

Что дальше

  • Добавьте Power Shield — контроллер можно будет переносить по разным помещениям.
  • Вставьте устройство в корпус из #cтруктора. Slot Box придаст игре законченный вид.