Fehler beim Lagersystem Code - Komprimieren?

Moin,
ich bin dabei ein Lagersystem zu entwickeln und brauche nun Hilfe beim code. Das System soll 10 Kisten mit jeweils 4 Fächern für 23 Produkte/Lagerplätze umfassen, also insgesamt 920 Lagerplätze für Produkte. Die 40 Fächer haben jeweils eine LED die durch die Eingabe der Lagerplatznummer auf einem Keypad(Folientastatur) aufleuchten soll. Also 1 bis 23 - Fach/LED 1, 24 bis 47 - Fach/LED 2 usw. . Außerdem soll eine Error LED leuchten wenn eine Zahl/ Lagerplatznummer eingegeben wird die es nicht gibt.
Ich habe nun versucht die Lagerplätze einzeln als Passwörter zu definiern, hat zum testen mit 4 auch funktioniert aber nach dem einfügen der 920 “Passwörter” hab ich versucht das schon mal zu Kompilieren um zu schauen ob das geht. Hat nicht geklappt: fehler zu viele Globale Variabeln, zu viele Bytes verwendet. (ich habe den Mega2560)

Jetzt die Frage: gibt es einen weg das zu verkürzen oder das Programm zu komprimieren? Oder sogar komplett anders zu machen? Bin noch neu beim Arduino und habe im Code das gemacht was mir am besten erschien.

Grüße Felix

#include <SoftReset.h>
#include <Password.h> 
#include <Keypad.h> 
#define ledpinERROR 10
#define ledpin1 11
#define ledpin2 12
#define ledpin3 13
#define ledpin4 14
#define ledpin5 15
#define ledpin6 16
#define ledpin7 17
#define ledpin8 18
#define ledpin9 19
#define ledpin10 20
#define ledpin11 21
#define ledpin12 22
#define ledpin13 23
#define ledpin14 24
#define ledpin15 25
#define ledpin16 26
#define ledpin17 27
#define ledpin18 28
#define ledpin19 29
#define ledpin20 30
#define ledpin21 31
#define ledpin22 32
#define ledpin23 33
#define ledpin24 34
#define ledpin25 35
#define ledpin26 36
#define ledpin27 37
#define ledpin28 38
#define ledpin29 39
#define ledpin30 40
#define ledpin31 41
#define ledpin32 42
#define ledpin33 43
#define ledpin34 44
#define ledpin35 45
#define ledpin36 46
#define ledpin37 47
#define ledpin38 48
#define ledpin39 49
#define ledpin40 50
Password password1 = Password( "1" );// 1 bis 920 sind lagerplätze für produkte
Password password2 = Password( "2" );//23 Lagerplätze bzw. Produkte pro Fach 
Password password3 = Password( "3" );//4 Fächer a 23 Lagerplätze pro Kiste
Password password4 = Password( "4" );//10 Kisten a 4 Fächer = 40 Fächer 
Password password5 = Password( "5" );//40 Fächer a 23 Lagerplätze = 920
Password password6 = Password( "6" );
Password password7 = Password( "7" );
Password password8 = Password( "8" );
Password password9 = Password( "9" );
Password password10 = Password( "10" );
Password password11 = Password( "11" );
Password password12 = Password( "12" );
Password password13 = Password( "13" );
Password password14 = Password( "14" );
Password password15 = Password( "15" );
Password password16 = Password( "16" );
Password password17 = Password( "17" );
Password password18 = Password( "18" );
Password password19 = Password( "19" );
Password password20 = Password( "20" );
Password password21 = Password( "21" );
Password password22 = Password( "22" );
Password password23 = Password( "23" );
Password password24 = Password( "24" );//musste für den Post den rest rausnehmen
Password password920 = Password( "920" );

const byte ROWS = 4; 
const byte COLS = 4;
char keys[ROWS][COLS] = { 
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = { 2,3,4,5};
byte colPins[COLS] = { 6,7,8,9 };

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup(){
pinMode(ledpinERROR,OUTPUT);
   pinMode(ledpin1,OUTPUT);
   pinMode(ledpin2,OUTPUT);
   pinMode(ledpin3,OUTPUT);// ich weiß hier fehlen noch die restlichen Angaben
   
   
  Serial.begin(9600);
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
}

void loop(){
 keypad.getKey();
}

//take care of some special events
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
        case PRESSED:
   Serial.print("Pressed: ");
   Serial.println(eKey);
   switch (eKey){
     case '*': checkPassword();
                    
                
                     break;
                    
     case '#': password1.reset();
                    password2.reset();
                    break;
     default: password1.append(eKey);
                   Password password920 = Password( "920" );



password1.append(eKey);
password2.append(eKey);
password3.append(eKey);
password4.append(eKey);
password5.append(eKey);
password6.append(eKey);
password7.append(eKey);
password8.append(eKey);
password9.append(eKey);
password10.append(eKey);
password11.append(eKey);
password12.append(eKey);
password13.append(eKey);
password14.append(eKey);
password15.append(eKey);
password16.append(eKey);
password17.append(eKey);
password18.append(eKey);
password19.append(eKey);
password20.append(eKey);
password21.append(eKey);
password22.append(eKey);
password23.append(eKey);
password24.append(eKey); //ich weiß da fehlen noch welche 
password920.append(eKey);

     }
  }
}
void checkPassword(){
 if (password1.evaluate()){
  Serial.println("code 1 success");
        digitalWrite(ledpin1, HIGH);
        delay(5000);
        digitalWrite(ledpin1, LOW);
        soft_restart();
 }
 else if (password2.evaluate()){ 
  Serial.println("code 3 success");
  digitalWrite(ledpin1, HIGH);
        delay(5000);
        digitalWrite(ledpin1, LOW);
        soft_restart();
     
 }
 else if (password23.evaluate()){ 
  Serial.println("code 2 success");
  digitalWrite(ledpin1, HIGH);
        delay(5000);
        digitalWrite(ledpin1, LOW);
        soft_restart();
                                //nun sollen von 1 bis 23 alle Passwörter eine LED ansteuern, danach von 24 bis 47 eine andere LED, 48 bis 71 usw. bis 920
 }
 else if (password24.evaluate()){ 
  Serial.println("code 2 success");
  digitalWrite(ledpin2, HIGH);
        delay(5000);
        digitalWrite(ledpin2, LOW);
        soft_restart();
 }  else {
  Serial.println("Wrong");
        digitalWrite(ledpinERROR, HIGH);
        delay(5000);
        digitalWrite(ledpinERROR, LOW);
        soft_restart();
}
}

Storage_Indicator.ino (64 KB)

ERROR.pdf (180 KB)

Oder sogar komplett anders zu machen?

Mit Sicherheit!

z.B. es ist mir schleierhaft was das "Password" Gedöns soll.....

Was gibt es gegen ein einfaches Array einzuwenden?

Eine Lagerhaltung braucht sowieso einen persistenten Speicher, und eine Inventur.

ja, das klingt nach ner guten Idee, danke
aber das soll kein System zur Lagererhaltung sein, nur eine Hilfe zum schnelleren Finden des Lagerplatzes durch Begrenzung auf ein Fach.
Aber super Tipp danke :slight_smile:

aber das soll kein System zur Lagererhaltung sein, nur eine Hilfe zum schnelleren Finden des Lagerplatzes durch Begrenzung auf ein Fach.

Offensichtlich unterscheiden sich unsere Vorstellungen über die Bedeutung des Wortes “Lagerhaltung”

Aber schön, wenn ich dir dennoch helfen konnte!

Dann hab ich aber jetzt noch mal ne frage:
Wie bestimme ich denn das er die Lagerplatznummern als Key Values nehmen soll?
Grüße Felix

#include <Key.h>
#include <Keypad.h>  // Lagerplaetze noch zusätzlich anders als Keys bestimmen?
int lagerplaetze[]= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920 };
int lagerCount = 921;

int ledPins[] = { 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53 };
int pinCount = 41;
int timer = 5000;
  const byte ROWS = 4; 
const byte COLS = 4;
char Keys[ROWS][COLS] = { 
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = { 2,3,4,5};
byte colPins[COLS] = { 6,7,8,9 };
Keypad Kpd = Keypad( makeKeymap(Keys), rowPins, colPins, ROWS, COLS );
void setup() {
 for (int thisPin = 0; thisPin < pinCount; thisPin++)
 {pinMode(ledPins[thisPin], OUTPUT);
 }
}

void loop() {
char Key = Kpd.getKey();
if ({                                        //Lagerplaetze als Keys nehmen?
    digitalWrite(ledPins[0], HIGH);
    delay(timer);
    digitalWrite(ledPins[0], LOW);
}
}

Noch sehe ich nicht, was du wirklich willst....

Ich sehe fortlaufende Zahlen.
Ich mag keine fortlaufenden Zahlen in Arrays, denn fortlaufende Zahlen kann man berechnen!

10 Kisten mit je 4 Fächer
23 Subfächer pro Fach

Sind 920 Lagerplätze.
Und du möchtest die Lagerplatznummer eingeben.

Beispiel: Lagerplatznummer 711

711/23 = 30
Das gewünschte Produkt befindet sich in Fach 30

30/4 = 7
Das Fach 30 befindet sich in Kiste 7

30-(4*7)=2
Das Fach 30 ist das 2te Fach in Kiste 7

711-(30*23)=21
Das gesuchte Produkt befindet sich in Subfach 21

Die Konkrete Adesse des Produktes, mit der Lagerstelle 711, ist also:
Kiste 7, 2te Fach, Subfach 21

Alle Zahlen und Ortsangaben sind auf Null bezogen.
Also Kiste 0 bis 9
Fach 0 bis 3
Subfach 0 bis 22
Lagerplatz 0 bis 919

** Das alles ungeprüft und ohne jede Gewähr **

aber wie setze ich denn die Berechnungen die du gerade beschreibst in code um?
Ich habe doch eigentlich relativ detailliert beschrieben was ich möchte. eine Lagerplatznummer von 1 bis 920 in ein Keypad eingeben und dann soll eine LED an dem Fach in dem sich der Lagerplatz befindet aufleuchtet.

vielleicht bin ich aber auch gerade einfach doof weil ich deine Aussage nicht verstehe

OK...

Du verstehst mich nicht, und ich dich nicht.

Vergiss einfach meine Postings...

Dass es Unsinn ist hunderte Objekte im RAM anzulegen hast du ja schon erkannt. Ein Array mit hunderten Zahlen muss man aber nicht im RAM halten. Schau dir PROGMEM an. Damit kann man die Daten nur im Flash ablegen.
Was aber wie gesagt für fortlaufende Nummern völlig unnötig ist. Eine feste Reihenfolge von Zahlen hat man über eine for-Schleife ohne irgendwas zu speichern.

Ansonsten sehe ich hier das Problem nicht. Lass die konkrete Anwendung erst mal bei Seite und lerne wie man eine Zahl über die Tastatur eingibt. Dazu braucht man keine zusätzliche Library. Das ist triviale Mathematik
Wenn du von dem eingegeben Zeichen '0' subtrahierst kommst du auf die Ziffer. Siehe ASCII Tabelle.
'0' - '0' = 0
'1' - '0' = 1
Dann musst du nur die bisherige Zahl mit 10 multiplizieren und die aktuelle Ziffer addieren. z.B. für 123:
0 * 10 + 1 = 0 + 1 = 1
1 * 10 + 2 = 10 + 2 = 12
12 * 10 + 3 = 120 + 3 = 123

Dankeschön für den Tipp das werde ich machen. :slight_smile:

Felix_Jindra:
aber wie setze ich denn die Berechnungen die du gerade beschreibst in code um?

Mit dem seriellen Monitor so:

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Lagerplatznummer eingeben"));
}

void loop()  {
  if (Serial.available())
  {
    uint16_t lpn = Serial.parseInt();
    byte fach = lpn / 23;
    byte kiste = fach / 4;
    Serial.print(F("Lagerplatznummer "));
    Serial.print(lpn);
    Serial.print(F("\tFach "));
    Serial.print(fach);
    Serial.print(F("\tKiste "));
    Serial.println(kiste);
  }
}

Dass es Unsinn ist hunderte Objekte im RAM anzulegen hast du ja schon erkannt. Ein Array mit hunderten Zahlen muss man aber nicht im RAM halten

Sehr richtig.

int lagerplaetze[]= { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920 };

So ein Array muss man überhaupt nirgends halten.

Habe ich die Original-Frage richtig verstanden, dass du x-beliebige lange Artikelnummern ( dein sog. Passwort) hast, denen man nicht ansehen kann, in welchem Fach sie sind?

Dass man eine solche "Datenbank" nicht durch Tipperei an einem Keypad anlegt, sondern sie anderweitig erzeugt und per Sketch-Upload auf einen Arduino bringt, wäre schon eine Möglichkeit, zumindest wenn die Zuordnung ( Nummer -> Fach ) sich nicht häufig ändert.

Neunstellige Dezimalzahlen "987654321" oder 8stellige Hex-Zahlen (wie sie auch in einem 4x4-KeyPad wählbar sind) "AB654321" passen in ein unsigned long.
920 davon brauchen knapp 4kB, das ist mit einem Mega2560 zwar im RAM machbar, aber edler wäre es natürlich im Flash...

Ja das hast du schon richtig verstanden michael_x von außen kann man nicht sehen wo sich die Produkte befinden, wenn ich nun auf dem keypad die nummer des Produktes, bzw den Lagerplatz von diesem eingebe soll die Led an dem Fach leuchten in dem dieser sich befindet. Also 23 Artikel pro fach und pro led, das habe ich wie du richtig erkannt hast versucht als Passwort zu lösen, jedoch ist nicht genug speicher verfügbar.

Aber wenn ich das als Array speichere wie sage ich dann im loop das die stellen einen Tastendruck darstellen?

Felix_Jindra:
… die nummer des Produktes, bzw den Lagerplatz …

An dieser Stelle habe ich ein Verständnisproblem, da Produktnummer und Lagerplatznummer nach meiner Vorstellung unterschiedliche Dinge sind.

Bei der chaotischen Lagerhaltung von Amazon werden Produkte mit ihrer Nummer an beliebigen Regalplätzen abgelegt, also wo gerade Platz frei ist. Der Computer merkt sich dann eine Konkordanz von Produkt zu Lagerplatz, wobei die Nummern mit Barcodeskannern eingelesen werden. So eine Konkordanzliste ist flexibel, weshalb wohl ein externer Speicher notwendig sein könnte.

Möglicherweise mißverstehe ich aber auch die Aufgabenstellung.

Sowas wäre auch wieder mal eine Anwendung für Strukturen:

struct Data
{
   unsigned int produkt;
   unsigned int lagerplatz;
   byte fach;
};

Oder sowas in der Art. Datentypen nach Bedarf auswählen, damit nicht zu viel Speicher verschwendet wird. Dann ein Array daraus. Das kann man auch per PROGMEM im Flash ablegen.
Dann kann man einfach über das Array iterieren und wenn eine Nummer gefunden wurde, die anderen Daten auslesen.

Aber auch hier gilt: wenn die Lagerplatz-Nummer sowieso nur fortlaufend ist, dann sollte man sie gar nicht abspeichern! Sie ergibt sich dann aus dem Laufindex der for-Schleife mit der man über das Array geht.

Eine andere Option wäre eine SD-Karte für die Daten. Die lässt sich leicht extern editieren.

Aber hier scheinen grundlegende Kenntnisse darüber zu fehlen wie man Daten zusammenfasst.

Die Struktur mit 920 Feldelemten paßt sogar ins RAM des Mega2560:

Globale Variablen verwenden 4.672 Bytes (57%) des dynamischen Speichers

Eine andere Option wäre eine SD-Karte für die Daten. Die lässt sich leicht extern editieren.

Als Option gegen viel RAM eine interessante exotische Variante. Statt 4kB RAM wird für jede Eingabe die SD-Karte gelesen wofür man 8 mal einen 512 Byte-Block liest bis man die Nummer gefunden hat.

Etwas OT hier, denke ich.
Der RAM reicht, die Lösung scheint für Felix noch nicht trivial zu sein.

enum {
  cLF = 10,      // LineFeed
  cCR = 13,      // CarriageReturn
};
const uint8_t maxLen = 65;
char Buffer[maxLen];
uint8_t bufferIndex;

const uint8_t kisten = 10;
const uint8_t faecher = 4;
const uint8_t produkte = 23;
const uint16_t proKiste = produkte * faecher;
const uint16_t total = proKiste * kisten;

void setup() {
  Serial.begin(250000);
  Serial.println(F("Lagerplatznummer"));
}

void loop() {
  if (Serial.available()) {
    char character = Serial.read();
    if (character != cLF) {
      if (character != cCR) {
        if (bufferIndex < maxLen - 2) {
          Buffer[bufferIndex++] = character;
        }
      } else {
        Buffer[bufferIndex] = 0;
        uint16_t lpNummer = atoi(Buffer);
        Serial.print(F("Zahl: "));
        Serial.print(lpNummer);
        if (lpNummer == 0 || lpNummer >  total) {
          Serial.print(F(" ist ungueltig"));
        } else {
          lpNummer--;
          Serial.print(F(" Kiste "));
          Serial.print((lpNummer / proKiste) + 1);
          lpNummer %= proKiste;
          Serial.print(F(" Fach "));
          Serial.print((lpNummer / produkte) + 1);
          Serial.print(F(" Produkt "));
          Serial.print((lpNummer % produkte) + 1);
        }
        Serial.println();
        bufferIndex = 0;
      }
    }
  }
}
Lagerplatznummer
Zahl: 0 ist ungueltig
Zahl: 921 ist ungueltig
Zahl: 1 Kiste 1 Fach 1 Produkt 1
Zahl: 920 Kiste 10 Fach 4 Produkt 23
Zahl: 23 Kiste 1 Fach 1 Produkt 23
Zahl: 24 Kiste 1 Fach 2 Produkt 1

:o

Also zuerst einmal danke für die guten Tipps und Ideen, ich habe aus diesem Projekt jetzt schon vieles gelernt und mitgenommen.
Ein ganz großes Dankeschön an Whandall, genau so sollte das sein. Aber ich habe jetzt doch noch mal die frage wie ich die nummern statt über den seriellen Monitor über das keypad eingebe: Einfach stattchar character = Serial.read();// char character = kpd.getkey();eingeben?
und wie steuere ich nun statt des seriellen monitors als ausgabe eine der 40 Leds an? Serial.print(F(" Fach ")); // digitalWrite(ledpin ("Fach"), HIGH)?