Problème mémoire Arduino

Bonjour,

Je remonte ce post car je suis exactement dans le meme cas.

Télé Samsung, pas de mémoire sur l'arduino si on ne met pas les raw en PROGMEM etc..

Mais je constate que ce post est resté un peu en suspend sans solution finale?

Quelqu'un pourrait me guider vers la solution?

fdufnews:
Si tu as placé plusieurs tableaux en zone programme tu as de toutes les façons gagné de la place en RAM.
Une solution c'est de créer un tableau fourre-tout de la taille maximum dont tu auras besoin pour relire le plus gros de tes tableaux.
Ce tableau fourre-tout doit être de type void et tu typeras son contenu par un cast au moment de l'utiliser.

Aurais tu un exemple concret à donner?

Je ne m'y connais pas assez en programmation pour résoudre le problème moi meme donc si une ame charitable veut bien me donner un petit coup de main?

Bonjour,
Si c'est un problème de RAM pourquoi ne pas faire un essai avec une MEGA ou 1284P où la taille mémoire est nettement supérieure.

Je n'ai pas de mega sous la main :grin:

En metant en progmem je passe de 49 à plus de 1120 de RAM libre donc je pense que ça devrait tourner mais mon seul problème c'est de récupérer le tableau de RAW pour l'envoyer avec la fonction irsend

Ok bon depuis ce matin à force de bidouille car je n'y connais pas grand chose j'ai réalisé une fonction qui fait ce que je veux:

Déclarations:

#include <avr/pgmspace.h>
// Use IR send command to TV
IRsend irsend;
unsigned int buffer[68]; // buffer for use of PROGMEM (saving RAM)


// TV
// Power ON/OFF
unsigned int SAMSUNG_POWER[68] PROGMEM={4450,4400,600,1600,600,1600,600,1600,600,550,550,550,550,550,550,550,500,600,550,1600,600,1600,550,1650,550,600,550,550,550,550,500,600,550,550,500,600,550,1600,550,600,550,550,500,600,550,550,500,600,500,600,550,1600,600,550,500,1650,550,1650,600,1600,550,1650,550,1650,550,1650,550};

Petite fonction qui fait l'affaire:

unsigned int* read_progmem(unsigned int* TVcode)
{
for (int i = 0; i < 69; i++)
 {
 buffer[i] = pgm_read_word(&TVcode[i]);
 }
return buffer;
}

et je l'utilise comme cela:

irsend.sendRaw(read_progmem(SAMSUNG_POWER),68,38);

Si par hasard vous avez quelque chose de plus simple et/ou plus performant je suis preneur :wink:

ça me fait passer de 49 à 983 de RAM ce qui ne fait plus planter et reseter mon UNO donc déjà c'est pas mal.

L'avantage aussi c'est que maintenant je peux utiliser toutes les touches de ma télécommande vu que j'ai de la mémoire disponible. Je n'ai plus besoin de ne garder que quelques touches :slight_smile:

Juste une question, as-tu essayé le programme test ou test2 je ne me souviens plus de la librairie IRRemote?
Ce programme reçoit les trames et les affiche quelques soit le type de télécommande. Je l'ai utilisé avec des télécommandes que j'avais chez moi et en général il trouve les codes associés à chaque touche. Je m'en suis servi pour faire un programme qui utilisait une télécommande non répertorié par la librairie sans aucun soucis. L'avantage de cette façon de procéder c'est que tu mémorises les codes et non pas les séquences temporelles ce qui tiens beaucoup moins de place en mémoire. Surtout que tu peux supprimer l'entête dans les données mémorisées puisqu'elle est constantes pour tous les messages envoyés.

Non j'ai uniquement utilisé IRrecvDump

qui me renvoie les infos suivantes:

// TV
//D23914EA
//Unknown encoding: D23914EA (32 bits)
unsigned int SAMSUNG_TV[68] PROGMEM={4450,4400,550,1650,550,1650,550,1650,550,600,500,600,500,600,500,600,500,600,500,1700,500,1650,550,1650,550,600,500,600,500,550,550,550,550,550,550,1650,550,1650,550,550,550,1650,550,1650,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,550,550,1650,550,1650,550,1650,550};

// 1
// E13DDA28
// Unknown encoding: E13DDA28 (32 bits)
unsigned int SAMSUNG_1[68] PROGMEM={4400,4450,550,1650,550,1650,550,1650,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,550,550,1650,550,1650,550,1650,550,1650,550,1650,550}; 

// 2
// AD586662
// Unknown encoding: AD586662 (32 bits)
unsigned int SAMSUNG_2[68] PROGMEM={4400,4450,550,1650,550,1650,550,1650,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,1600,600,550,550,1600,600,1600,600,1600,550,1650,600,1600,600};

// 3
// 273009C4
// Unknown,encoding:,273009C4,(32,bits)
unsigned int SAMSUNG_3[68] PROGMEM={4450,4400,600,1600,550,1650,550,1650,550,600,500,600,500,600,500,600,550,550,500,1650,550,1650,550,1650,600,550,500,600,500,600,500,600,500,600,500,600,500,1650,550,1650,550,600,500,600,500,600,500,600,500,600,500,1650,550,600,500,600,500,1650,550,1650,550,1650,550,1650,550,1650,550};

// 4
// F5999288
// Unknown,encoding:,F5999288,(32,bits)
unsigned int SAMSUNG_4[68] PROGMEM={4450,4400,550,1650,550,1650,550,1650,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,550,550,550,1650,550,1650,550,1650,550,1650,550};


// etc...

Je ne vois pas ce que sont les "codes"?

Peut etre qu'au final tu es quand meme tombé sur un protocol connu sans t'en rendre compte non?