Программа для хранения ИК-команд

Я работаю над кодом, который способен отправлять необработанные данные в виде ИК-сигнала на ИК-передатчик, памяти arduino Nano недостаточно для хранения массива в памяти SRAM, поэтому я собираюсь использовать PROGMEM для хранения массивов во флэш-памяти.

это массивы для необработанной команды ИК-сигнала:

unsigned int irSignaloff[]={6060, 7420, 532, 1652, 544, 1668, 508, 1688, 508, 1688, 508, 1692, 532, 1664, 532, 1664, 532, 1664, 536, 604, 528, 588, 548, 580, 552, 580, 528, 636, 500, 600, 532, 588, 548, 580, 552, 1644, 552, 1644, 528, 1664, 532, 1668, 532, 1664, 532, 1668, 528, 1668, 528, 1668, 508, 624, 536, 600, 532, 600, 536, 576, 528, 600, 532, 604, 532, 604, 532, 580, 552, 1648, 548, 1648, 552, 1644, 552, 1648, 552, 1644, 552, 1640, 556, 1644, 528, 1668, 528, 600, 508, 624, 512, 620, 536, 600, 536, 604, 528, 576, 508, 624, 532, 604, 532, 1660, 536, 1660, 540, 596, 536, 1644, 552, 1648, 552, 1644, 552, 580, 524, 1672, 524, 604, 508, 624, 536, 1660, 536, 632, 504, 580, 552, 608, 500, 1668, 528, 600, 508, 1688, 512, 1684, 560, 1668, 504, 660, 500, 1660, 536, 604, 532, 1656, 540, 1660, 540, 584, 548, 580, 528, 596, 512, 1688, 508, 660, 500, 1660, 536, 596, 540, 584, 548, 604, 500, 1672, 528, 600, 512, 1684, 512, 620, 540, 1656, 540, 600, 536, 580, 552, 1644, 552, 576, 528, 1668, 532, 600, 508, 1688, 536, 596, 536, 1660, 540, 1660, 536, 7420, 536};



unsigned int irSignalon[]={6156, 7336, 592, 1588, 612, 1584, 612, 1588, 608, 1588, 608, 1588, 604, 1592, 604, 1592, 604, 1592, 604, 528, 504, 628, 588, 548, 588, 552, 580, 524, 608, 524, 572, 560, 592, 540, 588, 1608, 592, 1604, 592, 1604, 592, 1608, 592, 1604, 592, 1604, 592, 1604, 596, 1600, 596, 524, 608, 520, 584, 544, 596, 540, 596, 536, 596, 524, 608, 520, 604, 524, 588, 1608, 588, 1608, 588, 1608, 588, 1608, 588, 1612, 536, 1660, 572, 1624, 572, 1628, 564, 600, 504, 628, 504, 580, 528, 600, 636, 528, 540, 564, 532, 588, 548, 604, 504, 1664, 532, 604, 504, 624, 536, 1660, 532, 1664, 532, 1664, 532, 604, 532, 1660, 536, 584, 548, 1652, 548, 1644, 552, 580, 556, 572, 532, 604, 532, 1664, 532, 600, 532, 1668, 532, 1660, 536, 1688, 532, 600, 536, 1664, 532, 584, 620, 1576, 552, 1644, 552, 576, 532, 604, 608, 524, 532, 1664, 608, 512, 620, 1576, 548, 580, 556, 572, 600, 536, 604, 1588, 608, 528, 536, 1660, 536, 584, 620, 1580, 620, 508, 596, 532, 508, 1688, 512, 620, 536, 1660, 604, 532, 608, 1588, 604, 516, 620, 1576, 620, 1576, 624, 7308, 552}; 

и эта команда отправки использует IRemote.библиотека h:

 irSend.sendRaw(irSignalon, sizeon, FREQ_KHZ, false);

итак, как я могу использовать PROGMEM для хранения и чтения этого массива int, чтобы отправлять их? Спасибо

, 👍1

Обсуждение

Если ИК-библиотека не поддерживает чтение из PROGMEM, вы не можете использовать PROGMEM., @Majenko

Там вы используете 788 байт. Да, это много для Нано, но намного ниже предела. Возможно, вам следует сократить использование другой оперативной памяти, которая должна составлять больше, чем просто эти два массива, если у вас заканчивается память., @Majenko

Понимание/декодирование ИК-сигналов и отказ от использования необработанных таймингов также были бы более экономичными в пространстве., @Kwasmich

не используйте raw .... преобразуйте временные интервалы в фактические данные ... первая строка - unsigned int irSignaloff[]={start, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, end} ..... это то же самое, что шестнадцатеричное 00ff 00ff 00ff 22dd 14eb ab54, @jsotola

какова марка и модель устройства, которым вы управляете?, @jsotola

устройство представляет собой кондиционер,и сигнал не декодируется обычными библиотеками, поскольку содержит динамическую информацию о температуре, режиме и т.д., @M sayeh

вы не ответили на мой вопрос ... каково название производителя?, @jsotola


1 ответ


1

Если ваша ИК-библиотека не поддерживает отправку сигналов, хранящихся в PROGMEM, вам придется предоставить данные в оперативной памяти. Однако вам не обязательно постоянно хранить оба сигнала в оперативной памяти: там должен быть только тот, который вы собираетесь отправить.

Я предлагаю вам сохранить все данные ИК-сигнала в PROGMEM, не отправляя их. Всякий раз, когда вы хотите отправить сигнал, вы копируете его в буфер на основе оперативной памяти и передаете адрес этого буфера в библиотеку. Тот же буфер будет повторно использован для любого отправляемого вами сигнала. Это будет стоить вам некоторого процессорного времени для копирования и сэкономит 394 байта оперативной памяти. Экономия увеличится, если вы добавите больше сигналов в свой скетч.

const size_t signal_size = 197;

static PROGMEM const uint16_t irSignaloff[signal_size] = { ... };

static PROGMEM const uint16_t irSignalon[signal_size] = { ... };

/* Send an IR signal from PROGMEM. */
void send_signal(const uint16_t *signal) {
    static uint16_t signal_buffer[signal_size];
    memcpy_P(signal_buffer, signal, signal_size * sizeof *signal);
    irSend.sendRaw(signal_buffer, signal_size, FREQ_KHZ, false);
}

//...
send_signal(irSignalon);
send_signal(irSignaloff);

Здесь я предполагаю, что все ваши сигналы имеют одинаковую длину, что верно для примера, который вы показываете, но может оказаться ложным, если вы добавите больше сигналов позже. Затем вам может потребоваться определить размер буфера как самый длинный из всех ваших сигналов и указать длину сигнала в качестве дополнительного параметра для send_signal().

Обратите внимание, что буфер оперативной памяти не обязательно должен быть статическим. Я решил сделать его статичным здесь только для того, чтобы avr-размер дал вам хорошую оценку потребности программы в памяти.

,

большое спасибо, я просто добавил размер массива в качестве входных данных функции send_signal для покрытия нескольких команд и работал нормально. void send_signal(const uint16_t *signal,const size_t size) { unsigned int signal_buffer[размер]; memcpy_P(signal_buffer, signal, size * sizeof *signal); irsend.sendRaw(signal_buffer, размер, кГц); }, @M sayeh