Проблема с Global Variables

Arduiner001
Offline
Зарегистрирован: 15.06.2015

Я решил управлять телевизором Samsung  с Arduino UNO R3.

Прочитал на Хабре, что на самсунги нужно посылать коды RAW.

Компиляция с ошибками. Говрит "Global variables use 2 115 bytes (103%) of dynamic memory, leaving -67 bytes for local variables. Maximum is 2 048 bytes.", а в конце "Not enough memory; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing your footprint.".

Вот код:


#include <IRremote.h>
IRsend irsend;
unsigned long a;
void setup() {
Serial.begin(9600);
Serial.setTimeout(4);
pinMode(3, OUTPUT);
}

unsigned int one[78]={4450,4550,400,1800,450,650,450,1800,450,600,500,650,450,650,450,700,450,650,450,1750,450,650,500,1750,450,650,450,650,500,650,450,650,450,700,450,650,450,650,450,1750,450,650,500,650,450,650,500,650,450,650,450,1750,450,1750,500,650,450,1700,500,1750,450,1750,450,1800,450,1700,450};
unsigned int two[78]={4450,4550,450,1750,450,650,500,1750,500,600,450,650,450,650,500,650,450,650,500,1700,500,650,450,1800,450,600,500,650,450,650,450,650,500,650,450,1750,450,650,500,1750,450,650,450,650,450,700,450,650,450,650,450,700,450,1750,450,650,450,1700,500,1750,500,1750,450,1750,500,1650,500};
unsigned int three[78]={4450,4500,450,1750,450,700,450,1750,450,650,450,650,500,650,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,650,450,1750,500,1750,450,650,450,650,500,650,450,650,450,650,450,1750,500,650,450,650,500,1700,450,1800,450,1700,500,1750,500,1650,500};
unsigned int four[78]={4450,4550,450,1750,450,700,450,1750,450,650,450,650,500,650,450,650,450,650,500,1700,500,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,650,450,650,500,650,450,1700,500,600,500,650,450,650,500,600,500,1750,450,1750,500,1750,450,600,500,1750,500,1700,500,1750,500,1650,500};
unsigned int five[78]={4450,4550,450,1750,450,650,500,1750,450,650,450,650,500,650,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,1750,450,650,500,650,450,1700,500,650,450,650,450,650,450,700,450,650,450,1750,500,1750,450,650,450,1750,500,1750,450,1750,500,1650,500};

unsigned int six[78]={4400,4550,450,1800,400,700,400,1800,450,650,450,700,400,700,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,700,400,700,450,650,450,1750,500,650,450,1700,500,650,450,650,450,700,400,700,450,1750,450,650,450,1800,450,650,450,1750,500,1750,450,1750,450,1700,500};
unsigned int seven[78]={4450,4550,450,1750,450,650,450,1800,450,650,450,650,450,650,500,650,450,650,450,1750,500,600,500,1750,500,600,500,600,500,650,450,650,500,600,500,650,450,650,500,1750,450,1700,500,600,500,650,450,650,450,650,500,1750,450,1750,500,600,500,650,450,1700,550,1700,500,1750,450,1700,500};
unsigned int eight[78]={4400,4550,450,1750,450,650,450,1800,450,650,450,650,450,700,400,650,500,650,450,1750,450,700,450,1750,500,600,450,700,450,650,450,650,450,700,450,1750,450,650,450,1800,450,1700,500,650,450,650,450,700,450,600,500,650,450,1750,500,650,450,650,450,1750,450,1800,400,1800,450,1700,450};
unsigned int nine[78]={4450,4500,450,1750,500,650,450,1800,450,600,450,650,500,650,450,650,450,700,450,1750,450,650,450,1800,450,650,450,650,450,650,500,600,500,650,450,650,500,1750,450,1750,500,1700,450,650,500,650,450,650,450,650,450,1800,450,650,450,650,450,650,450,1800,450,1750,450,1750,500,1650,500};
unsigned int zero[78]={4450,4500,500,1750,450,650,450,1800,450,650,450,650,450,650,500,650,450,650,450,1750,450,650,500,1750,500,600,450,650,500,650,450,650,450,650,500,1750,450,650,450,650,500,650,450,1750,450,650,450,650,500,650,450,650,450,1750,500,1750,450,1750,450,650,450,1750,500,1750,450,1700,450};

unsigned int on[78]={4450,4550,450,1750,450,650,450,1800,450,650,450,650,450,650,450,700,450,650,450,1750,450,700,450,1750,500,600,450,650,500,650,450,650,450,700,450,650,450,1750,450,650,450,700,450,650,450,650,500,650,450,650,450,1750,450,700,450,1750,450,1750,400,1800,450,1800,400,1800,450,1700,450};

void S1() {irsend.sendRaw(one,78,38);delay(500);}
void S2() {irsend.sendRaw(two,78,38);delay(500);}
void S3() {irsend.sendRaw(three,78,38);delay(500);}
void S4() {irsend.sendRaw(four,78,38);delay(500);}
void S5() {irsend.sendRaw(five,78,38);delay(500);}

void S6() {irsend.sendRaw(six,78,38);delay(500);}
void S7() {irsend.sendRaw(seven,78,38);delay(500);}
void S8() {irsend.sendRaw(eight,78,38);delay(500);}
void S9() {irsend.sendRaw(nine,78,38);delay(500);}
void S0() {irsend.sendRaw(zero,78,38);delay(500);}

void Son() {irsend.sendRaw(on,78,38);delay(500);}

void loop()
{ a = Serial.parseInt(); 

if (a==101) {Son ();}

if (a==1) {S1();}
if (a==2) {S2();}
if (a==3) {S3();}
if (a==4) {S4();}
if (a==5) {S5();}
if (a==6) {S6();}
if (a==7) {S7();}
if (a==8) {S8();}
if (a==9) {S9();}
if (a==10) {S1();S0();}

maksim
Offline
Зарегистрирован: 12.02.2012

И что вам не понятно из сообщения компилятора?

http://www.arduino.cc/en/Reference/PROGMEM

Arduiner001
Offline
Зарегистрирован: 15.06.2015

maksim пишет:

И что вам не понятно из сообщения компилятора?

http://www.arduino.cc/en/Reference/PROGMEM

Спасибо, почитаю

Arduiner001
Offline
Зарегистрирован: 15.06.2015

Arduino IDE зависает на этапе компиляции(

Вот текущее состояние кода:

#include <IRremote.h>
#include <avr/pgmspace.h>
//const PROGMEM uint16_t variableName[] = {};
IRsend irsend;
unsigned long a;
void setup() {
Serial.begin(9600);
Serial.setTimeout(4);
pinMode(3, OUTPUT);
}

const PROGMEM uint16_t one[78]={4450,4550,400,1800,450,650,450,1800,450,600,500,650,450,650,450,700,450,650,450,1750,450,650,500,1750,450,650,450,650,500,650,450,650,450,700,450,650,450,650,450,1750,450,650,500,650,450,650,500,650,450,650,450,1750,450,1750,500,650,450,1700,500,1750,450,1750,450,1800,450,1700,450};
const PROGMEM uint16_t two[78]={4450,4550,450,1750,450,650,500,1750,500,600,450,650,450,650,500,650,450,650,500,1700,500,650,450,1800,450,600,500,650,450,650,450,650,500,650,450,1750,450,650,500,1750,450,650,450,650,450,700,450,650,450,650,450,700,450,1750,450,650,450,1700,500,1750,500,1750,450,1750,500,1650,500};
const PROGMEM uint16_t three[78]={4450,4500,450,1750,450,700,450,1750,450,650,450,650,500,650,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,650,450,1750,500,1750,450,650,450,650,500,650,450,650,450,650,450,1750,500,650,450,650,500,1700,450,1800,450,1700,500,1750,500,1650,500};
const PROGMEM uint16_t four[78]={4450,4550,450,1750,450,700,450,1750,450,650,450,650,500,650,450,650,450,650,500,1700,500,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,650,450,650,500,650,450,1700,500,600,500,650,450,650,500,600,500,1750,450,1750,500,1750,450,600,500,1750,500,1700,500,1750,500,1650,500};
const PROGMEM uint16_t five[78]={4450,4550,450,1750,450,650,500,1750,450,650,450,650,500,650,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,1750,450,650,500,650,450,1700,500,650,450,650,450,650,450,700,450,650,450,1750,500,1750,450,650,450,1750,500,1750,450,1750,500,1650,500};

const PROGMEM uint16_t six[78]={4400,4550,450,1800,400,700,400,1800,450,650,450,700,400,700,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,700,400,700,450,650,450,1750,500,650,450,1700,500,650,450,650,450,700,400,700,450,1750,450,650,450,1800,450,650,450,1750,500,1750,450,1750,450,1700,500};
const PROGMEM uint16_t seven[78]={4450,4550,450,1750,450,650,450,1800,450,650,450,650,450,650,500,650,450,650,450,1750,500,600,500,1750,500,600,500,600,500,650,450,650,500,600,500,650,450,650,500,1750,450,1700,500,600,500,650,450,650,450,650,500,1750,450,1750,500,600,500,650,450,1700,550,1700,500,1750,450,1700,500};
const PROGMEM uint16_t eight[78]={4400,4550,450,1750,450,650,450,1800,450,650,450,650,450,700,400,650,500,650,450,1750,450,700,450,1750,500,600,450,700,450,650,450,650,450,700,450,1750,450,650,450,1800,450,1700,500,650,450,650,450,700,450,600,500,650,450,1750,500,650,450,650,450,1750,450,1800,400,1800,450,1700,450};
const PROGMEM uint16_t nine[78]={4450,4500,450,1750,500,650,450,1800,450,600,450,650,500,650,450,650,450,700,450,1750,450,650,450,1800,450,650,450,650,450,650,500,600,500,650,450,650,500,1750,450,1750,500,1700,450,650,500,650,450,650,450,650,450,1800,450,650,450,650,450,650,450,1800,450,1750,450,1750,500,1650,500};
const PROGMEM uint16_t zero[78]={4450,4500,500,1750,450,650,450,1800,450,650,450,650,450,650,500,650,450,650,450,1750,450,650,500,1750,500,600,450,650,500,650,450,650,450,650,500,1750,450,650,450,650,500,650,450,1750,450,650,450,650,500,650,450,650,450,1750,500,1750,450,1750,450,650,450,1750,500,1750,450,1700,450};

const PROGMEM uint16_t on[78]={4450,4550,450,1750,450,650,450,1800,450,650,450,650,450,650,450,700,450,650,450,1750,450,700,450,1750,500,600,450,650,500,650,450,650,450,700,450,650,450,1750,450,650,450,700,450,650,450,650,500,650,450,650,450,1750,450,700,450,1750,450,1750,400,1800,450,1800,400,1800,450,1700,450};

void S1() {irsend.sendRaw(one,78,38);delay(500);}
void S2() {irsend.sendRaw(two,78,38);delay(500);}
void S3() {irsend.sendRaw(three,78,38);delay(500);}
void S4() {irsend.sendRaw(four,78,38);delay(500);}
void S5() {irsend.sendRaw(five,78,38);delay(500);}

void S6() {irsend.sendRaw(six,78,38);delay(500);}
void S7() {irsend.sendRaw(seven,78,38);delay(500);}
void S8() {irsend.sendRaw(eight,78,38);delay(500);}
void S9() {irsend.sendRaw(nine,78,38);delay(500);}
void S0() {irsend.sendRaw(zero,78,38);delay(500);}

void Son() {irsend.sendRaw(on,78,38);delay(500);}

void loop()
{ a = Serial.parseInt(); 

if (a==101) {Son ();}

if (a==1) {S1();}
if (a==2) {S2();}
if (a==3) {S3();}
if (a==4) {S4();}
if (a==5) {S5();}
if (a==6) {S6();}
if (a==7) {S7();}
if (a==8) {S8();}
if (a==9) {S9();}
if (a==10) {S1();S0();}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Arduiner001 пишет:

maksim пишет:

И что вам не понятно из сообщения компилятора?

http://www.arduino.cc/en/Reference/PROGMEM

Спасибо, почитаю

Почитайте еще.

Arduiner001
Offline
Зарегистрирован: 15.06.2015

Похоже, всё исправил, НО этот код тоже вызывает зависание IDE((

#include <IRremote.h>
#include <avr/pgmspace.h>
//const unsigned int variableName[] PROGMEM= {};
IRsend irsend;
unsigned long a;
void setup() {
Serial.begin(9600);
Serial.setTimeout(4);
pinMode(3, OUTPUT);
}

const unsigned int one[78] PROGMEM={4450,4550,400,1800,450,650,450,1800,450,600,500,650,450,650,450,700,450,650,450,1750,450,650,500,1750,450,650,450,650,500,650,450,650,450,700,450,650,450,650,450,1750,450,650,500,650,450,650,500,650,450,650,450,1750,450,1750,500,650,450,1700,500,1750,450,1750,450,1800,450,1700,450};
const unsigned int two[78] PROGMEM={4450,4550,450,1750,450,650,500,1750,500,600,450,650,450,650,500,650,450,650,500,1700,500,650,450,1800,450,600,500,650,450,650,450,650,500,650,450,1750,450,650,500,1750,450,650,450,650,450,700,450,650,450,650,450,700,450,1750,450,650,450,1700,500,1750,500,1750,450,1750,500,1650,500};
const unsigned int three[78] PROGMEM={4450,4500,450,1750,450,700,450,1750,450,650,450,650,500,650,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,650,450,1750,500,1750,450,650,450,650,500,650,450,650,450,650,450,1750,500,650,450,650,500,1700,450,1800,450,1700,500,1750,500,1650,500};
const unsigned int four[78] PROGMEM={4450,4550,450,1750,450,700,450,1750,450,650,450,650,500,650,450,650,450,650,500,1700,500,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,650,450,650,500,650,450,1700,500,600,500,650,450,650,500,600,500,1750,450,1750,500,1750,450,600,500,1750,500,1700,500,1750,500,1650,500};
const unsigned int five[78] PROGMEM={4450,4550,450,1750,450,650,500,1750,450,650,450,650,500,650,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,650,500,650,450,1750,450,650,500,650,450,1700,500,650,450,650,450,650,450,700,450,650,450,1750,500,1750,450,650,450,1750,500,1750,450,1750,500,1650,500};

const unsigned int six[78] PROGMEM={4400,4550,450,1800,400,700,400,1800,450,650,450,700,400,700,450,650,450,650,500,1750,450,650,450,1750,500,600,500,650,450,650,450,700,400,700,450,650,450,1750,500,650,450,1700,500,650,450,650,450,700,400,700,450,1750,450,650,450,1800,450,650,450,1750,500,1750,450,1750,450,1700,500};
const unsigned int seven[78] PROGMEM={4450,4550,450,1750,450,650,450,1800,450,650,450,650,450,650,500,650,450,650,450,1750,500,600,500,1750,500,600,500,600,500,650,450,650,500,600,500,650,450,650,500,1750,450,1700,500,600,500,650,450,650,450,650,500,1750,450,1750,500,600,500,650,450,1700,550,1700,500,1750,450,1700,500};
const unsigned int eight[78] PROGMEM={4400,4550,450,1750,450,650,450,1800,450,650,450,650,450,700,400,650,500,650,450,1750,450,700,450,1750,500,600,450,700,450,650,450,650,450,700,450,1750,450,650,450,1800,450,1700,500,650,450,650,450,700,450,600,500,650,450,1750,500,650,450,650,450,1750,450,1800,400,1800,450,1700,450};
const unsigned int nine[78] PROGMEM={4450,4500,450,1750,500,650,450,1800,450,600,450,650,500,650,450,650,450,700,450,1750,450,650,450,1800,450,650,450,650,450,650,500,600,500,650,450,650,500,1750,450,1750,500,1700,450,650,500,650,450,650,450,650,450,1800,450,650,450,650,450,650,450,1800,450,1750,450,1750,500,1650,500};
const unsigned int zero[78] PROGMEM={4450,4500,500,1750,450,650,450,1800,450,650,450,650,450,650,500,650,450,650,450,1750,450,650,500,1750,500,600,450,650,500,650,450,650,450,650,500,1750,450,650,450,650,500,650,450,1750,450,650,450,650,500,650,450,650,450,1750,500,1750,450,1750,450,650,450,1750,500,1750,450,1700,450};

const unsigned int on[78] PROGMEM={4450,4550,450,1750,450,650,450,1800,450,650,450,650,450,650,450,700,450,650,450,1750,450,700,450,1750,500,600,450,650,500,650,450,650,450,700,450,650,450,1750,450,650,450,700,450,650,450,650,500,650,450,650,450,1750,450,700,450,1750,450,1750,400,1800,450,1800,400,1800,450,1700,450};

void S1() {irsend.sendRaw(one,78,38);delay(500);}
void S2() {irsend.sendRaw(two,78,38);delay(500);}
void S3() {irsend.sendRaw(three,78,38);delay(500);}
void S4() {irsend.sendRaw(four,78,38);delay(500);}
void S5() {irsend.sendRaw(five,78,38);delay(500);}

void S6() {irsend.sendRaw(six,78,38);delay(500);}
void S7() {irsend.sendRaw(seven,78,38);delay(500);}
void S8() {irsend.sendRaw(eight,78,38);delay(500);}
void S9() {irsend.sendRaw(nine,78,38);delay(500);}
void S0() {irsend.sendRaw(zero,78,38);delay(500);}

void Son() {irsend.sendRaw(on,78,38);delay(500);}

void loop()
{ a = Serial.parseInt(); 

if (a==101) {Son ();}

if (a==1) {S1();}
if (a==2) {S2();}
if (a==3) {S3();}
if (a==4) {S4();}
if (a==5) {S5();}
if (a==6) {S6();}
if (a==7) {S7();}
if (a==8) {S8();}
if (a==9) {S9();}
if (a==10) {S1();S0();}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Еще раз читайте, до конца, особенно ту часть где показывают как читать байты.

Araris
Offline
Зарегистрирован: 09.11.2012

maksim пишет:

Еще раз читайте, до конца, особенно ту часть где показывают как читать байты.

Байты ? Ведь unsigned int - два байта.

"#include <avr/pgmspace.h>

// save some unsigned ints
PROGMEM  prog_uint16_t charSet[]  = { 65000, 32796, 16843, 10, 11234};
unsigned int displayInt;
int k = 0;    // counter variable
// read back a 2-byte int
 displayInt = pgm_read_word_near(charSet + k)"
maksim
Offline
Зарегистрирован: 12.02.2012

Araris пишет:

maksim пишет:

Еще раз читайте, до конца, особенно ту часть где показывают как читать байты.

Байты ? Ведь unsigned int - два байта.

"#include <avr/pgmspace.h>

// save some unsigned ints
PROGMEM  prog_uint16_t charSet[]  = { 65000, 32796, 16843, 10, 11234};
unsigned int displayInt;
int k = 0;    // counter variable
// read back a 2-byte int
 displayInt = pgm_read_word_near(charSet + k)"

UDP: Да без разницы что читать, не хочет ТС правильно читать данные из флэша.