// Библиотека для хранения данных во флеше вместо 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); }