Управляем бытовой техникой из консоли
Проекты на Arduino Uno и Slot Shield
Управлять бытовой техникой из консоли монитора порта очень просто. Просканируйте сигналы, которые отпраляет пульт с помощью ИК-приёмника и повторите их светодиодом. Вот и вся наука.
Устройство построено на оригинальной Arduino Uno. Плата управляет бытовой техникой с помощью ИК-передатчика. Коды команд управления заранее считываются ИК-приёмником.
- Язык программирования: Arduino (C++)
Видеоинструкция
Что потребуется
Полный сет компонентов проекта. В сет входят:
Как собрать
Установите 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); }
Часто задаваемые вопросы
Где скачать необходимые библиотеки и как их установить?
- Библиотека эмуляции ИК-пультов: arduino-irremote.7z
- библиотека для работы с флеш-памятью
Что дальше
- Добавьте Power Shield — контроллер можно будет переносить по разным помещениям.
- Вставьте устройство в корпус из #cтруктора. Slot Box придаст игре законченный вид.