проблема хранения
Я создал программу Arduino для управления моим кондиционером (модель: GREE Lomo) с помощью ПК. Для этого я скачал библиотеку IRremote отсюда здесь.
#include "IRremote.h"
IRsend irsend;
int irPin = 3; // pin IR led
int khz = 38; // 38kHz carrier frequency for the NEC protocol
const unsigned int irSignalOn[] = {8972, 4492, 644, 1664, 640, 564, 644, 564, 640, 1668, 636, 568, 640, 1664, 644, 560, 644,
560, 644, 564, 640, 564, 644, 560, 644, 1664, 640, 564, 644, 564, 640, 564, 640, 1668, 640, 1664, 640, 564, 644,
1664, 640, 564, 644, 564, 640, 1668, 640, 1664, 640, 564, 644, 564, 640, 564, 640, 564, 644, 564, 640, 1664, 644,
560, 644, 1664, 640, 564, 644, 564, 640, 1668, 640, 560, 644, 19980, 640, 564, 644, 1664, 640, 1668, 640, 564, 640,
564, 644, 1660, 644, 560, 644, 564, 644, 560, 644, 564, 640, 564, 644, 560, 644, 564, 640, 1664, 640, 564, 644, 564,
640, 564, 640, 564, 644, 564, 640, 564, 644, 560, 644, 564, 640, 564, 644, 564, 640, 564, 640, 564, 644, 560, 644, 564,
640, 564, 640, 564, 644, 1664, 640, 564, 644, 39972, 8976, 4496, 640, 1664, 644, 560, 644, 564, 640, 1668, 640, 564, 640,
1668, 640, 564, 640, 564, 644, 560, 644, 564, 640, 564, 644, 1664, 640, 564, 644, 564, 640, 564, 644, 1664, 640, 1668, 640,
564, 640, 1668, 640, 564, 640, 564, 644, 1668, 636, 1668, 640, 564, 640, 564, 640, 564, 644, 560, 644, 564, 644, 560, 644,
1668, 640, 1664, 640, 564, 644, 564, 640, 1668, 640, 564, 640, 19980, 640, 564, 644, 564, 640, 564, 644, 560, 644, 564, 640,
564, 644, 560, 644, 564, 640, 564, 640, 564, 644, 564, 640, 1668, 636, 568, 640, 1664, 640, 564, 640, 1672, 636, 1664, 640,
564, 644, 564, 640, 564, 640, 1668, 640, 564, 640, 564, 640, 568, 640, 1664, 640, 564, 640, 564, 644, 564, 640, 1692, 616,
1664, 640, 564, 640, 1664, 640, 39980, 8972, 4492, 644, 1664, 640, 568, 636, 564, 644, 1664, 640, 564, 640, 1668, 640, 564,
640, 564, 644, 564, 640, 564, 640, 564, 640, 1668, 640, 564, 640, 568, 640, 560, 644, 1664, 640, 1664, 644, 564, 640, 1668,
640, 564, 640, 564, 644, 1660, 644, 1664, 640, 564, 644, 560, 644, 564, 640, 564, 640, 564, 644, 1664, 640, 1664, 644, 1664,
644, 560, 644, 564, 640, 1668, 640, 560, 644, 19984, 640, 564, 644, 560, 644, 564, 640, 564, 640, 564, 640, 564, 644, 564, 640,
564, 644, 564, 640, 564, 640, 564, 640, 568, 640, 564, 644, 560, 644, 564, 640, 564, 644, 560, 644, 564, 640, 564, 644, 564,
640, 1664, 640, 1668, 640, 564, 640, 564, 640, 564, 644, 564, 640, 568, 640, 560, 644, 1668, 640, 1664, 640, 564, 640, 564, 644
};
const unsigned int irSignalOff[] = {8996, 4496, 640, 1688, 616, 568, 636, 568, 640, 568, 636, 568, 640, 1688, 616, 568, 640, 564, 640, 564, 640, 564, 644, 564,
640, 1688, 616, 1692, 616, 568, 640, 568, 636, 1668, 640, 1688, 616, 1692, 616, 568, 636, 568, 640, 564, 640, 1692, 616,
568, 636, 568, 636, 568, 640, 564, 640, 568, 636, 568, 640, 1688, 616, 564, 640, 1692, 616, 568, 636, 564, 640, 1672, 636,
564, 644, 19980, 640, 568, 636, 1692, 616, 1688, 616, 568, 636, 568, 640, 1688, 616, 572, 636, 564, 640, 568, 640, 564, 640,
568, 636, 568, 636, 568, 640, 1688, 616, 568, 640, 564, 640, 568, 636, 564, 640, 568, 640, 564, 640, 564, 640, 568, 640, 568,
636, 568, 636, 568, 640, 564, 640, 564, 640, 568, 636, 568, 640, 1688, 616, 568, 636, 1692, 616, 39980, 8972, 4496, 640, 1688,
616, 568, 636, 568, 640, 568, 636, 568, 636, 1692, 616, 564, 640, 568, 640, 564, 640, 564, 640, 568, 640, 1688, 616, 1692, 612,
568, 640, 564, 640, 1692, 612, 1692, 616, 1692, 616, 564, 640, 568, 640, 564, 640, 1692, 612, 568, 640, 568, 636, 568, 636, 568,
640, 564, 640, 564, 640, 568, 640, 1692, 612, 1692, 616, 568, 640, 564, 640, 1688, 616, 568, 636, 19984, 640, 564, 640, 568, 640,
564, 640, 568, 636, 568, 636, 568, 640, 564, 640, 568, 636, 568, 640, 564, 640, 564, 644, 1688, 616, 568, 640, 564, 640, 568, 636,
568, 640, 564, 640, 568, 636, 1672, 636, 1692, 612, 568, 640, 564, 640, 568, 636, 568, 640, 1692, 612, 568, 640, 568, 636, 568, 640,
564, 640, 1692, 616, 1668, 632, 568, 640, 39980, 8972, 4500, 640, 1688, 616, 568, 636, 568, 640, 564, 640, 568, 636, 1668, 640, 568,
636, 568, 640, 568, 636, 564, 640, 568, 636, 1692, 616, 1688, 616, 568, 636, 568, 640, 1668, 636, 1688, 620, 1692, 612, 568, 640, 564,
640, 564, 640, 1692, 612, 568, 640, 564, 644, 564, 640, 564, 640, 552, 652, 568, 640, 1688, 616, 1688, 616, 1692, 616, 564, 640, 568,
640, 1664, 640, 564, 640, 19988, 636, 568, 640, 564, 640, 568, 636, 568, 640, 564, 640, 568, 636, 568, 640, 564, 640, 564, 640, 568,
636, 568, 640, 568, 636, 568, 640, 568, 640, 564, 636, 568, 640, 568, 636, 568, 636, 568, 636, 568, 640, 1668, 636, 1692, 616, 568,
640, 564, 640, 564, 640, 568, 636, 568, 640, 564, 640, 1692, 616, 564, 640, 568, 636, 1692, 616
};
void setup() {
pinMode(irPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
char letter = Serial.read();
if (letter == '1') {
irsend.sendRaw(irSignalOn, sizeof(irSignalOn) / sizeof(irSignalOn[0]), khz); //Note the approach used to automatically calculate the size of the array.
Serial.println("ON");
} else if (letter == '0') {
irsend.sendRaw(irSignalOff, sizeof(irSignalOff) / sizeof(irSignalOff[0]), khz); //Note the approach used to automatically calculate the size of the array.
Serial.println("OFF");
}
}
}
У меня возникла ошибка для arduino uno: Глобальные переменные используют 2080 байт (101%) динамической памяти, оставляя -32 байта для локальных переменных. Максимум - 2048 байт.
как я могу это исправить?
РЕДАКТИРОВАНИЕ 26.07:
Я знаю, что с платой типа ATmega2560 проблема будет решена, но я хочу использовать Arduino Uno.
Я пытался сохранить данные в памяти программы, но не знаю, как ее прочитать.
@Morteza Mirzai, 👍1
Обсуждение3 ответа
Лучший ответ:
Решение — переместить таблицы в программную память (также известную как PROGMEM). Используйте следующее:
const unsigned int irSignalOn[] PROGMEM = {
...
};
И измените вызов sendRaw()
на sendRaw_P()
.
irsend.sendRaw_P(irSignalOn, sizeof(irSignalOn) / sizeof(irSignalOn[0]), khz);
Более подробную информацию см. в документации библиотеки.
Ура!
Я использовал библиотеку IRremote от Shirriff's, и компилятор не находит функцию sendRaw_P?, @Morteza Mirzai
@MortezaMirzai Пожалуйста, дополните свой вопрос всей соответствующей информацией., @Mikael Patel
Можно также перейти на плату на базе Atmega1284P с ее 16K SRAM, что в 8 раз больше, чем 2K у '328P и в 2 раза больше, чем 8K у Mega. Также есть два аппаратных последовательных порта, если они понадобятся вашему проекту.
или esp8266 подешевле, с в 4 раза большим объемом оперативной памяти и в десятки раз большим объемом флэш-памяти..., @dandavis
Но работа ограничена напряжением 3,3 В, и я думаю, что на входе/выходе ток будет гораздо меньше, если это необходимо проекту., @CrossRoads
не ответ
пожалуйста, попробуйте это
дайте мне знать, включается ли кондиционер при нажатии 1
#include "IRremote.h"
IRsend irsend;
int irPin = 3; // контакт ИК-светодиода
int khz = 38; // Несущая частота 38 кГц для протокола NEC
void setup() {
pinMode(irPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
char letter = Serial.read();
if (letter == '1') {
irsend.sendNEC(0x4A08D3052, 35);
irsend.sendNEC(0x64040002, 32);
irsend.sendNEC(0x4A08D3032, 35);
irsend.sendNEC(0x0015888D, 32);
irsend.sendNEC(0x4A08D3072, 35);
irsend.sendNEC(0x00000C0C, 32);
Serial.println("ON");
}
}
}
Я проверяю это, но это не работает (возможно, это моя вина), и компилятор выдает предупреждение., @Morteza Mirzai
и все? .... компилятор выдает предупреждение
.... ничего о предупреждении? .... вам нужна помощь или нет?, @jsotola
предупреждение: большое целое число неявно усечено до беззнакового типа [-Woverflow] irsend.sendNEC(0x4A08D3052, 35);, @Morteza Mirzai
- Считывание байтов из массива PROGMEM
- Я думаю, что израсходовал всю свою память Arduino Uno
- Получить доступ к EEPROM ATtiny с помощью кода Arduino?
- Глобальные переменные занимают много места в динамической памяти.
- Выделение строковой памяти Arduino
- Как очистить кучу памяти в esp32
- Есть ли способ подключить оперативную память компьютера к Arduino?
- Последовательная печать из флэш-памяти (F() macro, PROGMEM, sprintf_P, SPTR)
Найдите «PROGMEM»., @Edgar Bonet
https://arduinoprosto.ru/q/54150/locally-declared-variable-takes-up-global-variable-space-in-dynamic-memory-sram, @Juraj
Какая марка и модель кондиционера?, @jsotola
данные сигнала могут быть значительно уменьшены .... https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol, @jsotola
Re “Я не знаю, как это читать”: 1. Поищите в Интернете “Arduino PROGMEM” или “AVR PROGMEM”. 2. Внимательно прочитайте найденные вами ресурсы и **попробуйте сами**. 3. Если вы все еще не можете, приложив все усилия, задайте здесь **еще один** вопрос., @Edgar Bonet