Hallo, wie könnte ich den Code verkleinern ?

Hallo, ich brüchte hilfe. Ich versuche gerade eine Fernbedinung zu bauen… leider kenne ich keine Möglichkeit die IR Daten anders als in RAW zu senden. Daher ist der Code bzw. die Variablen zu gross…es geht um eine Samsung Fernbedienung.

Vielleicht weiss ja jemand von euch wie ich den Code verkleinern könnte… er braucht zur Zeit 118% des Rams.

Ich benutze einen Arduino UNO und später einen gleich grossen Chip.

Hier mal der Code: (er ist noch nicht fertig bei const unsigned int BUTTON[17] = {1023, 990, 959, 932} und ich musste etwas löschen damit ich hier posten kann)

#include <IRremote.h>

const unsigned int ok[67]={4508,4512,556,1688,552,1688,552,1692,548,576,544,576,544,576,548,572,548,572,552,1692,548,1696,548,1692,548,576,548,572,548,572,548,576,548,572,552,568,548,576,548,572,548,1696,548,572,548,1692,548,1696,548,576,544,1696,548,1692,548,1696,548,572,548,1696,548,572,548,572,548,1696,548}; 
const unsigned int rechts[67]={4504,4516,548,1692,548,1696,548,1692,548,600,524,572,548,600,520,600,524,596,524,1696,548,1692,548,1696,548,600,520,600,520,576,548,576,544,576,544,600,524,1692,548,576,548,576,544,576,544,1696,548,1696,544,604,520,1696,544,600,524,1692,548,1696,548,1692,548,600,520,604,520,1696,544};
const unsigned int links[67]={4508,4512,552,1688,552,1692,552,1688,552,596,528,596,524,596,524,596,528,596,524,1692,548,1692,552,1688,556,592,528,596,524,596,524,596,528,596,524,1688,556,592,528,1688,552,596,528,596,524,1688,556,1688,552,596,528,596,524,1692,548,596,528,1688,556,1684,556,592,528,596,524,1688,556};
const unsigned int oben[67]={4488,4516,548,1692,548,1696,548,1696,544,600,524,596,524,600,520,600,524,596,524,1696,544,1696,548,1696,548,596,524,596,524,596,524,600,524,596,524,600,520,600,524,596,524,600,520,600,524,1692,548,1720,524,596,524,1696,548,1696,548,1692,548,1696,548,1692,548,600,524,596,524,1696,548};
const unsigned int unten[67]={4504,4536,528,1692,548,1696,548,1692,548,596,524,600,520,600,524,596,524,596,524,1696,548,1692,548,1696,544,600,524,596,524,596,524,596,524,600,524,1692,548,596,524,600,524,596,524,596,524,1716,528,1696,544,596,524,600,524,1692,548,1696,548,1692,548,1696,548,596,524,596,524,1696,544};
const unsigned int source[67]={4504,4516,548,1716,528,1696,544,1696,548,596,524,596,524,596,528,596,524,596,524,1696,548,1692,548,1696,548,596,524,596,524,596,524,600,524,596,524,1692,552,596,524,596,524,596,524,596,524,600,524,596,524,596,524,600,524,1692,548,1696,544,1696,548,1692,548,1696,548,1692,548,1696,548};
const unsigned int mute[67]={4508,4516,548,1696,544,1692,552,1692,548,596,524,600,524,596,524,596,524,600,524,1692,548,1696,548,1692,548,596,528,592,528,596,524,596,524,600,524,1716,524,1716,528,1692,548,1696,548,596,524,596,524,596,528,592,528,596,524,596,524,600,524,596,524,1692,548,1696,548,1692,552,1692,548};
const unsigned int lauter[67]={4508,4516,544,1696,548,1692,552,1692,548,600,520,600,524,576,544,600,520,600,520,1696,548,1696,544,1696,548,600,520,600,520,576,544,600,524,600,520,1696,548,1692,548,1696,544,600,524,596,524,576,544,600,520,576,544,600,524,600,520,576,544,1696,548,1692,548,1696,548,1692,548,1692,548};
const unsigned int leiser[67]={4480,4540,524,1720,524,1716,524,1720,524,624,496,624,496,624,496,624,500,624,496,1720,520,1720,524,1720,520,624,500,624,496,624,496,624,496,628,516,1700,544,1696,524,624,496,1720,524,624,520,600,496,624,500,620,500,624,496,624,496,1720,524,624,496,1720,524,1716,524,1720,520,1720,524};
const unsigned int smarthub[67]={4504,4516,548,1696,548,1692,548,1696,548,596,524,596,524,600,524,596,524,596,524,1696,544,1696,548,1692,548,600,520,600,524,596,524,596,524,600,524,1692,548,596,524,600,520,1696,548,1696,544,1696,548,1692,548,600,524,596,524,1696,548,1692,548,596,524,600,524,596,524,596,524,1696,548};
const unsigned int menu[67]={4504,4516,548,1696,548,1696,544,1696,548,600,520,576,544,604,520,572,548,576,544,1692,548,1696,548,1692,548,576,544,600,520,604,520,576,544,600,520,604,520,1692,548,600,520,1696,548,1692,548,600,524,576,544,576,544,1696,548,600,520,1696,544,576,548,600,520,1696,544,1696,548,1692,548};
const unsigned int exi[67]={4484,4516,548,1696,548,1712,528,1692,548,596,528,596,524,596,524,596,524,596,528,1692,548,1692,552,1692,548,596,524,596,528,592,528,596,524,596,524,1696,548,596,524,1692,548,1716,528,596,524,1696,544,596,524,600,524,596,524,1692,548,600,524,596,524,1716,524,600,524,1692,548,1696,548};
const unsigned int retur[67]={4484,4516,548,1692,548,1696,548,1692,548,596,524,600,524,596,524,600,520,596,524,1696,548,1696,544,1696,548,596,524,596,528,596,524,596,524,596,524,596,528,596,524,596,524,1696,544,1696,548,596,524,1696,548,596,524,1696,544,1696,548,1696,544,596,528,596,524,1692,548,600,524,1692,548};
const unsigned int anaus[67]={4508,4516,548,1716,524,1696,548,1716,524,596,524,600,524,596,524,596,524,596,524,1720,524,1692,548,1716,528,596,524,596,524,596,528,596,524,596,528,592,528,1712,528,596,524,600,524,596,524,596,524,596,524,596,528,1692,548,596,524,1696,544,1696,548,1696,548,1692,548,1696,544,1696,548};


const unsigned int BUTTON_PIN   = A0;                         
const unsigned int BUTTON_TOLLERANCE = 5;                       
const unsigned int BUTTON[17] = {1023, 990, 959, 932};                     
                                                              
IRsend irsend;

void setup() {
Serial.begin(9600);                                           
delay(1000);                                                  
pinMode(BUTTON_PIN, INPUT);                                   

}
void loop() {

 if(isButtonPressed(BUTTON[0])){                              
 irsend.sendRaw(anaus,67,38);                                 
 Serial.println("TV An");
 delay(10);
}
  
                                                  
}

boolean isButtonPressed(unsigned int button){                   
int analogValue = analogRead(BUTTON_PIN);                      
Serial.println(analogValue);                                   

return analogValue > button - BUTTON_TOLLERANCE                
       && analogValue < button + BUTTON_TOLLERANCE;
}

Eine Hilfe wäre echt super da ich mich noch nicht wirklich auskenne. Habe mir alles aus YouTube usw. zusammen gepflastert. Gibt es evtl. eine Möglichkeit daraus auch hex zu machen oder ändert das nichts, da dies dann auch in der IRremote.h hinterlegt werden müsste ???

Vielen Dank im vorraus.
Andy

https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

Und dann memcpy_P() verwenden um ein Array ins RAM zu kopieren. Dann braucht man nur ein Array im RAM. Der Rest bleibt im Flash

Sereniflys Tip wird schon reichen. Wenn nicht, könnte man die Library um eine Methode sendRaw_P ergänzen, die das zu sendende Array gleich aus dem Flash holt. Das bringt dann nochmal 67*2 Byte mehr.

Dein Ansatz, 17 Taster über verschiedene Widerstände sauber auseinander zu halten, ist schon anspruchsvoll. (Ich kenne das eher mit 6 Tastern). Und delay (10) ist etwas knapp für wiederholtes Senden bei langen Tastendrücken ...

Danke, lese ich mir gleich mal durch !!! Mal schaun ob ichs check :-))))

Und ja 17 Taster werden schwierig... werde 4 pins benutzen -> 17 / 4

Hi, ich habs mir durchgelesen aber verstehe zugegeben nur Bahnhof.... Auf YouTube finde ich auch nichts passendes für das PROGMEM.

Wärst du so nett und könntest mir ein Beispiel schreiben, das ich das einfach mal sehe? Wär wirklich super und ich wäre dir sehr dankbar. Mit dem Code könnte ich es bestimmt besser kapieren.

const unsigned int Beispiel a[4]{1,2,3,4}

const unsigned int Beispiel b[4]{5,6,7,8}

const unsigned int Beispiel c[4]{9,10,11,12}


void setup() {
 // put your setup code here, to run once:

}

void loop() {
 // put your main code here, to run repeatedly:

}

Gruss Andy

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

du gibst deine Daten in ein Array (hast du fast, kompiliert bei dir nicht.)
du verschiebst es ins PROGMEM (so wie in den Links von Serenifly beschrieben)
du greifst auf das Arrray zu wie bei PROGMEM beschrieben.

const char beispielA[] PROGMEM = {1, 2, 3, 4};
const unsigned int beispielB[] PROGMEM = {5, 6, 7, 8};
const byte beispielC[] {9, 10, 11, 12};


void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println(F("1:1 von https://www.arduino.cc/reference/en/language/variables/utilities/progmem/"));

  // read back a char
  char myChar;
  for (byte k = 0; k < sizeof(beispielA); k++) {
    myChar = pgm_read_byte_near(beispielA + k);
    Serial.println(myChar, HEX);
  }
  Serial.println();

  for (byte k = 0; k < sizeof(beispielB) / sizeof(beispielB[0]); k++)  {
    unsigned int myInt = pgm_read_word_near(beispielB + k);
    Serial.println(myInt);

  }

  Serial.println(F("\nversus"));
  for (byte k = 0; k < sizeof(beispielC); k++) {

  Serial.println(beispielC[k]);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
}

1:1 von https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
1
2
3
4

5
6
7
8

versus
9
10
11
12

Da die Arrays zufällig gleich groß sind, funktioniert die Längenbestimmung mit beispielA, Du meinst aber sicherlich beispielB (aus dem Du auch liest):

for (byte k = 0; k < sizeof(beispielB) / sizeof(beispielB[0]); k++)  {
  unsigned int myInt = pgm_read_byte_near(beispielB + k);
    Serial.println(myInt);

Gruß Tommy

habs gesehen ... knapp vor dir sogar :wink:

Ihr meint sicher beide

  unsigned int myInt = pgm_read_[b]word[/b]_near(beispielB + k);

:slight_smile:

Dazu sollte der TO noch selbständig mit memcpy_P rumspielen

gekauft und karma+

Wo er Recht hat, ...

Wir hatten uns so auf den 1. Fehler fixiert, dass wir den anderen übersehen haben.

Danke micha.

Gruß Tommy

Hi

... und ich ging davon aus, daß der Kompiler weiß, was Er Da tun soll - also weiß, daß die Adressen 'jeweils zwei weiter hinten' versetzt sind.

MfG

[Der Compiler] weiß, daß die Adressen ‘jeweils zwei weiter hinten’ versetzt sind.

Ja, das weiß er aus der Datendefinition des Arrays.

int ar[2] ={1000, 2000};
Serial.println(*(ar+1)); // 2000

Nur liefert pgm_read_byte von der richtigen Adresse leider nur 1 Byte zurück.

du greifst auf das Arrray zu wie bei PROGMEM beschrieben.

Nein. Er braucht das schon in einem Array, da er die Daten an eine Funktion übergibt die ein Array im RAM erwartet. Ich habe nicht ohne Grund memcpy_P() erwähnt

const unsigned int data1[] PROGMEM = { 1000, 2000, 3000 };
const unsigned int data2[] PROGMEM = { 5000, 6000, 7000, 8000 };

void setup()
{
   Serial.begin(9600);

   printData(data1, sizeof(data1));
   printData(data2, sizeof(data2));
}

void loop()
{
}

void printData(const unsigned int* data, size_t size)
{
  unsigned int buffer[size / sizeof(data[0])];
  memcpy_P(buffer, data, size);

  for (unsigned int val : buffer)
    Serial.println(val);
  Serial.println();
}

Der Trick ist halt dass man nur ein Array im RAM hat statt alle.

Das kann man auch so mit Strings und strcpy_P() machen wie bei dem String Array Beispiel

Was mir nicht ganz klar ist: Wieso legt der Kompiler den Buffer mit der richtigen Länge in der Funktion zur Laufzeit an?

unsigned int buffer[size / sizeof(data[0])];

Ich hatte bisher gedacht, dass solche Sachen nur mit dynamischer Speicherreservierung gehen würden, wenn die Länge über Parameter bestimmt wird.

Gruß Tommy

Das geht nur dank GCC. Standard ist es nicht:

https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html#Variable-Length

Auch andere Dinge wie Bereiche in switch/case sind GCC Erweiterungen:
https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html#Case-Ranges

Gute Frage!

Schau hier : stackoverflow.com/questions/7812566/why-no-variable-size-array-in-stack

Wenn du genau schaust, siehst du, dass gcc es als Extension unterstützt.
Der Stack ist nun mal die einzige dynamische Speicherverwaltung ohne Leaks oder Fragmentierung, die wir auf unseren kleinen avr-gcc Systemen haben.

Danke, wieder was gelernt.

Gruß Tommy

Vielen vielen Dank an euch alle, ich werde versuchen es umzusetzten.

Danke für eure Mühe 8)