IRremote Library verkleinern

Guten Morgen zusammen,
ich habe folgendes Problem:
Habe einen relativ großen Sketch, was RAM Verbrauch angeht. Nun wollte ich noch die IRremote Library einbinden und schwups sind 400Bytes an RAM einfach weg.
Hier einmal mein Sketch:

#define WLAN_SSID       "AP"
#define WLAN_PASS       "passwd"
#define WLAN_SECURITY   WLAN_SEC_WPA2
#define LISTEN_PORT           7
#define ADAFRUIT_CC3000_IRQ   2
#define ADAFRUIT_CC3000_VBAT  5
#define ADAFRUIT_CC3000_CS    10
#define IR_RATE 92

#include <Adafruit_CC3000.h>
#include <SPI.h>
#include <IRremote.h>
#include "utility/debug.h"
#include "utility/socket.h"


Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, 
                         ADAFRUIT_CC3000_VBAT, SPI_CLOCK_DIVIDER);
                         
int validatetele();

Adafruit_CC3000_Server echoServer(LISTEN_PORT);
IRsend irsend;

struct ircodes_struc {
  char name[10];
  long code[5];
};

ircodes_struc ircodes[13] = {{"rot  ", {0xD720DF, 0xF710EF, 0xF730CF, 0xF708F7, 0xF728D7}},
  {"gruen", {0xF7A05F, 0xF7906F, 0xF7B04F, 0xF78877, 0xF7A857}},
  {"blau ", {0xF7609F, 0xF750AF, 0xF7708F, 0xF748B7, 0xF76897}},
  {"weiss", {0xF7E01F}},
  {"on", {0xF7C03F}},
  {"off", {0xF740BF}},
  {"dimm_up", {0xF700FF}},
  {"dimm_down", {0xF7807F}},
  {"flash", {0xF7D02F}},
  {"strobe", {0xF7F00F}},
  {"fade", {0xF7C837}},
  {"smooth", {0xF7E817}}
};

typedef struct
{
  char header[2];
  char tart[5];
  char message_type[1];
  char tele_id[6];
  char auftrag_id[6];
  char nutzdaten[20];
} SOC_telegramm;

typedef struct
{
  char header[2];
  char teleid[6];
  char tart[5];
  char returncode[2];
} SOC_quittung;

SOC_telegramm recv_buff;
SOC_quittung quittung;

int verbunden = 0;

void send_ir(long code)
{
  for(int x=0; x != 3; x++)
  {
    irsend.sendNEC(code, IR_RATE);
    delay(40);
  }
}

void setup(void)
{
  //Serial.begin(115200);

  strncpy(quittung.header, "QU", 2);

  if (!cc3000.begin())
  {
    //Serial.println(F("Couldn't begin()! Check your wiring?"));
    while (1);
  }

  if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY))
  {
    //Serial.println(F("Failed!"));
    while (1);
  }

  while (!cc3000.checkDHCP())
  {
    delay(100);
  }

  /*while (! displayConnectionDetails()) {
    delay(1000);
  }*/
  //Serial.println(F("Los gehts"));

  echoServer.begin();
}

void loop(void)
{
  Adafruit_CC3000_ClientRef client = echoServer.available();
  if (client)
  {
    if (client.available() > 0)
    {
      uint8_t ch = client.read((char*)&recv_buff, sizeof(recv_buff));
      memcpy(quittung.teleid, recv_buff.tele_id, 6);
      memcpy(quittung.tart, recv_buff.tart, 5);
      if (validatetele() < 0)
        memcpy(quittung.returncode, "01", 2);
      else
        memcpy(quittung.returncode, "00", 2);
      client.write((char*)&quittung, sizeof(quittung));
      verbunden = 1;
    }
    if (verbunden)
    {
      if (strncmp("LED  ", recv_buff.tart, 5) == 0)
      {
        /*Serial.println("LED");
        Serial.println("Set Weissen LED Stripe zu");
        Serial.println(recv_buff.nutzdaten);*/
      }
      else if (strncmp("RGB  ", recv_buff.tart, 5) == 0)
      {
        for(int i = 0; i != 12; i++)
        {
          if (strcmp(ircodes[1].name, recv_buff.nutzdaten) == 0)
          {
            send_ir(ircodes[i].code[0]);
          }
          if(strncmp(ircodes[i].name, recv_buff.nutzdaten, 5) == 0)
          {
            int code_index = atoi(&recv_buff.nutzdaten[5]);
            send_ir(ircodes[i].code[code_index]);
          }
        }
      }
      memset(recv_buff.nutzdaten, '\0', sizeof(recv_buff.nutzdaten));
      verbunden = 0;
    }
  }
}

/**************************************************************************/
/*!
    @brief  Tries to read the IP address and other connection details
*/
/**************************************************************************/
/*bool displayConnectionDetails(void)
{
  uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;

  if (!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
  {
    Serial.println(F("Unable to retrieve the IP Address!\r\n"));
    return false;
  }
  else
  {
    Serial.println(ipAddress);
    Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
    Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
    Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
    Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
    Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
    Serial.println();
    return true;
  }
}*/

int validatetele()
{
  //TODO: Realisieren
  /*if (strncmp("HE", recv_buff.header, 2) != 0)
  {
    return -1;
  }*/

  //Serial.print("TART: ");
  /*    for(int i=0;i!=sizeof(telegramm.tart);i++)
        Serial.print(telegramm.tart[i]);
      Serial.println();*/

  //Serial.print("Tele ID: ");
  /*for (int i = 0; i != sizeof(recv_buff.tele_id); i++)
    Serial.print(recv_buff.tele_id[i]);
  Seial.println();

  Serial.print("Auftrag ID: ");
  for (int i = 0; i != sizeof(recv_buff.auftrag_id); i++)
    Serial.print(recv_buff.auftrag_id[i]);
  Serial.println();*/
  return 0;
}

Mit der IR Library habe ich nun nur noch 334Bytes zur Verfügung.
Hat jemand eine Idee, wie ich den RAM Verbrauch herunterschrauben kann?

Wenn ich jetzt allerdings noch ein TCP Client und noch ein wenig mehr Logik hinzufügen möchte, platzt der ATMega 328 aus allen Nähten.
Ein Arduino Mega ist keine Option.

13 * 10 bytes ircode.name könntest du durch PROGMEM Zeiger ersetzen, das spart 104 byte.
Oder ircodes (13*30 byte) komplett in den Flash legen.

Dann sind nur die allermeisten print - Strings durch das F() Makro optimiert, was aber bei ganz kurzen Texten nicht viel bringt.

Die IRremote library hat einen Sende- und einen Empfangs-Teil, soweit ich sehe brauchst du nur den Sende-Teil. Kann sein dass der Empfangsteil mit der Code-Erkennungs-Software mitgeladen wird, dann würde sich ein Überarbeiten der library lohnen.

Ok Danke.
Das PROGMEM kannte ich gar nicht. Gibt es eine Liste solcher Befehle?

michael_x:
Die IRremote library hat einen Sende- und einen Empfangs-Teil, soweit ich sehe brauchst du nur den Sende-Teil. Kann sein dass der Empfangsteil mit der Code-Erkennungs-Software mitgeladen wird, dann würde sich ein Überarbeiten der library lohnen.

An so etwas habe ich auch schon gedacht. Alles klar dann werde ich mich mal ransetzen.