====== Управляем бытовой техникой из консоли ====== **[[arduino-projects:start|Проекты на Arduino Uno и Slot Shield]]** Управлять бытовой техникой из консоли монитора порта очень просто. Просканируйте сигналы, которые отпраляет пульт с помощью ИК-приёмника и повторите их светодиодом. Вот и вся наука. {{ :arduino-projects:ir-remote-with-noise-sensor:smarthomefin1.png |}} Устройство построено на оригинальной [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|Arduino Uno]]. Плата управляет бытовой техникой с помощью [[amp>product/troyka-ir-transmitter-5mm-led-module?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|ИК-передатчика]]. Коды команд управления заранее считываются [[amp>product/troyka-ir-receiver?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|ИК-приёмником]]. * Платформы: [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|Arduino Uno]], [[amp>product/arduino-leonardo?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|Arduino Leonardo]], [[amp>product/iskra-neo?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|Iskra Neo]] * Язык программирования: Arduino (C++) ===== Видеоинструкция ===== {{youtube>vK16efpSEi8?large}} ===== Что потребуется ===== [[amp>collection/ir-remote?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki | Полный сет]] компонентов проекта. В сет входят: * [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|Arduino Uno]] * [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|Troyka Slot Shield]] * [[amp>product/troyka-ir-transmitter-5mm-led-module?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|ИК-передатчик]] * [[amp>product/troyka-ir-receiver?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|ИК-приёмник]] ===== Как собрать ===== Установите [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|Troyka Slot Shield]] на [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|Arduino Uno]] {{ :arduino-projects:ir-remoute-with-temperature-sensor:smarthome0.png |}} Вставьте [[amp>product/troyka-ir-receiver?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|ИК-приёмник]] в разъём ''С''. Ножка ''S'' должна подключится к пину ''4''. Аналогично подключите [[amp>product/troyka-ir-transmitter-5mm-led-module?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|ИК-передатчик]] к пину ''9'' слота ''E''. {{ :arduino-projects:ir-remoute-with-temperature-sensor:smarthome1.png |}} ===== Скетч ===== [[articles:arduino-ide-install|Как прошить контроллер через Arduino IDE]]. // Библиотека для хранения данных во флеше вместо RAM #include // Библиотека для работы с ИК-приёмником и передатчиком #include // Имя пина, которому подключен приёмник #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-projects:ir-remote-with-temperature-sensor:arduino-irremote.7z |}} * библиотека для работы с [[https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html|флеш-памятью]] * [[программирование:библиотеки|Как устанавливать библиотеки]] ===== Что дальше ===== * Добавьте [[amp>product/arduino-power-shield-li-ion?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|Power Shield]] — контроллер можно будет переносить по разным помещениям. * Вставьте устройство в корпус из #cтруктора. [[amp>product/structor-slot-box?utm_source=proj&utm_campaign=arduino-slot-proj-16&utm_medium=wiki|Slot Box]] придаст игре законченный вид.