Zahlen in Arrays speichern

Hallo zusammen,
wir programmieren gerade ein Zahlenschloss mit dem arduino duemilanove. Die Zahlen werden über Drucksensoren eingegeben und als Variablen gespeichert (Wenn z.B. Sensor 3 gedrückt wurde, wird di Zahl 3 gespeichert). Diese Zahlen möchten wir nun in ein Array schreiben, es funktioniert nur irgendwie nicht. Im Array wird immer nur die letzte eingegebene Zahl gespeichert. Weiß jemand, woran das liegt?
Hier mal der Programmausschnitt:
Wert1=analogRead(Sensor1);
Wert2=analogRead(Sensor2);
Wert3=analogRead(Sensor3);
Wert4=analogRead(Sensor4);

if(Wert1 < 900) {
W1=1;
delay(500);
Serial.print(W1);
ArrayDruck[b++]=W1;
c++;
}

if(Wert2 < 900) {
W2=2;
delay(500);
Serial.print(W2);
ArrayDruck[b++]=W2;
c++;
}

if(Wert3 < 900) {
W3=3;
delay(500);
Serial.print(W3);
ArrayDruck[b++]=W3;
c++;
}

if(Wert4 < 900) {
W4=4;
delay(500);
Serial.print(W4);
ArrayDruck[b++]=W4;
c++;
}
if(c==4) {
Serial.println();
Serial.print(ArrayDruck[1]);
Serial.print(ArrayDruck[2]);
Serial.print(ArrayDruck[3]);
Serial.print(ArrayDruck[4]);
c-=4;
b-=0;
}

Vielen Dank schon mal.
Satschy

Und Du hoffst wirklich, wir verstehen was Du da programmierst? :wink:
Dazu brauchen wir den vollständigen Kode.

b-=0; macht gar nichts (es subtrachiert null von b ab) wolltest Du b=0; schreiben?
Grüße Uwe

Interessant wäre noch die Deklaration von ArrayDruck und b. Passiert sonst noch was in der Schleife?

Ansonsten schonmal:

  1. Das erste Element eines Arrays hat den Index 0, also eher ArrayDruck[0] bis ArrayDruck[3] (wenn b am Anfang nicht == 1 ist).

  2. b-=0;
    Sollte b=0; heißen? Sonst wird da 0 von b abgezogen, bleibt also gleich. Beim zweiten Durchlauf werden somit die Werte dann in ArrayDruck[4..7] geschrieben was ja nicht ausgegeben wird und vermutlich auch gar nicht definiert ist.

sui:
...
2) b-=0;
Sollte b=0; heißen? Sonst wird da 0 von b abgezogen, bleibt also gleich. Beim zweiten Durchlauf werden somit die Werte dann in ArrayDruck[4..7] geschrieben was ja nicht ausgegeben wird und vermutlich auch gar nicht definiert ist.

ArrayDruck[4..7] ist zwar nicht definiert, wird aber in den Speicher geschrieben und zwar in die Speicherzellen nach ArrayDruck[3], Hiebei erfolgt keine Kontrolle ob die Speicherzellen schon vergeben sind oder noch frei sind.
Dies ist einer der typischen Fehler, die schwer zu finden sind,da die Symptome alle Möglichen und Unmöglichen sein können.
Bei mir funktionierte mal eine for-schleife, nicht wenn ich ein Serial.print() gelöscht hatte.

Viele Grüße Uwe

Hey!
Es sollte eigentlich b-=4 heißen, sorry :frowning:

Und hier mal das ganze Programm: (Der Teil bis Wert1=analogRead(Sensor1) funktioniert)

#include <Servo.h>

char Array1[]={1,4,3,2};
char gesendeterWert[5];
char gesendeterWert2[5];
int laenge=4;
int a=0;
int val=0;
int Sensor1=1;
int Sensor2=2;
int Sensor3=3;
int Sensor4=0;
Servo meinservo;
int LEDrot=7; // Wir brauchen eine rote LED!
int LEDgruen=8;
int Sound=12;
int Wert1=0;
int Wert2=0;
int Wert3=0;
int Wert4=0;
int W1=0;
int W2=0;
int W3=0;
int W4=0;
int W5=0;
int W6=0;
int W7=0;
int W8=0;
int b=1;
char ArrayDruck[5];
int c=0;

void setup() {
Serial.begin(9600);
meinservo.attach(13);
pinMode( LEDrot, OUTPUT);
pinMode(LEDgruen, OUTPUT);
pinMode(Sound, OUTPUT);
}

void loop() {
int i = 1;
if(Serial.available()>0) {
if(a==0) {
while (Serial.available()){
gesendeterWert[i++]=Serial.read();
delay(10);
}
Serial.print(gesendeterWert[1]);
Serial.print(gesendeterWert[2]);
Serial.print(gesendeterWert[3]);
Serial.println(gesendeterWert[4]);
delay(100);

if (gesendeterWert[1]=='1'&& gesendeterWert[2]=='4'&& gesendeterWert[3]=='3'&& gesendeterWert[4]=='2') {
Serial.println("Code angenommen. Bitte geben Sie den gewuenschten Oeffnungscode an.");
a+=3;
}
else {
Serial.println ( "Falscher Code. Bitte geben Sie den Code erneut ein.");
}
}
if (a==3&&Serial.available()>0) {
while (Serial.available()){
gesendeterWert2[i++]=Serial.read();
delay(10);
}
Serial.print("Ihr neuer Oeffnungscode lautet:");
Serial.print(gesendeterWert2[1]);
Serial.print(gesendeterWert2[2]);
Serial.print(gesendeterWert2[3]);
Serial.println(gesendeterWert2[4]);
delay(100);
a-=3;

}
}
Wert1=analogRead(Sensor1);
Wert2=analogRead(Sensor2);
Wert3=analogRead(Sensor3);
Wert4=analogRead(Sensor4);

if(Wert1 < 900) {
W1=1;
delay(500);
Serial.print(W1);
ArrayDruck[b++]=W1;
c++;
}

if(Wert2 < 900) {
W2=2;
delay(500);
Serial.print(W2);
ArrayDruck[b++]=W2;
c++;
}

if(Wert3 < 900) {
W3=3;
delay(500);
Serial.print(W3);
ArrayDruck[b++]=W3;
c++;
}

if(Wert4 < 900) {
W4=4;
delay(500);
Serial.print(W4);
ArrayDruck[b++]=W4;
c++;
}
if(c==4) {
Serial.println();
Serial.print(ArrayDruck[1]);
Serial.print(ArrayDruck[2]);
Serial.print(ArrayDruck[3]);
Serial.println(ArrayDruck[4]);
c-=4;
b-=4;
}
ClearArray();
}

void ClearArray()
{
for(int x=0; x<laenge;x++)
{
gesendeterWert[x]=NULL;
}
for(int y=0; y<laenge;y++) {
ArrayDruck[y]=NULL;
}
}

Danke, Satschy

Hallo !

Habe ich etwas überlesen, oder wird wieder mit Spatzen auf Kanonen geworfen ( oder umgekehrt ) ?
Wenn ich Satschys Text & Code weiterlese & weiter-interpretiere & weiter-philosophiere ...
komme ich zu den Ergebnissen:

  1. Satschy meint mit Drucksensoren nur 4 einfache Taster ( BCD-Code ergibt nur 16 Möglichkeiten ) BCD-Code – Wikipedia
  2. Druck-Sensoren: Wenn wirklich Druck-Sensoren gemeint sind, wie will man dann für ein Tasten-Schloss die erforderlichen Druckstärken ( 1024 pro Sensor ) wiederholen können ?

( Ich glaube dieses Brathähnchen ist tot - Aber wir könnten noch mal zum Tierarzt gehen )

MfG

Gurkengraeber:
Hallo !

Habe ich etwas überlesen, oder wird wieder mit Spatzen auf Kanonen geworfen ( oder umgekehrt ) ?
Wenn ich Satschys Text & Code weiterlese & weiter-interpretiere & weiter-philosophiere ...
komme ich zu den Ergebnissen:

  1. Satschy meint mit Drucksensoren nur 4 einfache Taster ( BCD-Code ergibt nur 16 Möglichkeiten ) BCD-Code – Wikipedia
  2. Druck-Sensoren: Wenn wirklich Druck-Sensoren gemeint sind, wie will man dann für ein Tasten-Schloss die erforderlichen Druckstärken ( 1024 pro Sensor ) wiederholen können ?

( Ich glaube dieses Brathähnchen ist tot - Aber wir könnten noch mal zum Tierarzt gehen )

MfG

Gurkengraeber, Dein Beitrag hilft niemanden. Bitte verkneif Dir in Zukunft solche Äußerungen

Viele Grüße Uwe

Gurkengraeber, Dein Beitrag hilft niemanden. Bitte verkneif Dir in Zukunft solche Äußerungen

Welche ?

MfG

Satschy:
Hey!
Es sollte eigentlich b-=4 heißen, sorry :frowning:

Und hier mal das ganze Programm: (Der Teil bis Wert1=analogRead(Sensor1) funktioniert)
...

Hallo Satschy

void ClearArray()
{
  for(int x=0; x<laenge;x++)
  {
    gesendeterWert

    =NULL;

  }
  for(int y=0; y<laenge;y++) {
    ArrayDruck[y]=NULL;
  }
}

Hier schreibst Du in ArrayDruck[0 bis 3] den Wert NULL
Aber oben benutzt Du ArrayDruck[1 bis 4].

if(c==4) {
Serial.println();
Serial.print(ArrayDruck[1]);
Serial.print(ArrayDruck[2]);

besser if(c>=4) da Du auch 2 Tasten gleichzeitig drücken könntest und dann von einer Kontrolle zu nächsten den Wert 4 überspringst.

if(Wert3 < 900) {   
  W3=3;
  delay(500);
 Serial.print(W3);
  ArrayDruck[b++]=W3;
  c++;
}

ArrayDruck[ b++ ]=W3; müßte eigentlich funktionieren aber schreibe doch besser:
ArrayDruck[ b ]=W3;
b++;

Gewöhn Dir an nicht :
c-=4;
zu schreiben sondern:
c = 0;
Das weil Du so eine Fehlerquelle ausschließen kannst.
Aber größere Fehler die Dein Problem erklähren könnten finde ich nicht.

Grüße Uwe

Ich habe so etwas schon mit einer Tastatur 4*3 0-9A-F gemacht.
Das Programm steuerte zwei Garagentore die ich mit der Tastaur aufgemacht habe (jeweils ein Passwort für ein Tor).
Funktion:
-Eingabe das Passwortes öffente da entsprechende Tor)
-nur bestätigung der Eingabe egal ob falsch oder richtig durch die LED.
-Timeout nach einer bestimmten Zeit wird da Speicher array gelöscht.
-Funktion zum vergleichen des Speicher Arrays mit dem Passwortarray

#include <avr/pgmspace.h>
//            Mega 
#define r1 8    // 24    //Row 1 connected Pin24 Connection Mega Board
#define r2 7   //25    //Row 2 connected Pin25
#define r3 9   //23    //Row 3 connected Pin23
#define r4 10    //22    //Row 4 connected Pin22
#define c1 3    //29    //Colmn 1 connected Pin 29
#define c2 4    //28    //Colmn 2 connected Pin 28
#define c3 5    //27    //Colmn 3 connected Pin 27
#define c4 6    //26    //Colmn 4 connected Pin 26
#define LEDgn 18  
#define LEDrd 19
#define Rel1  14
#define Rel2  15

int Num[]={                                     // Array four Matrix Post look like
  7, 8, 9,10,                                   //   7, 8, 9, A
  4, 5, 6,11,                                   //   4, 5, 6, B
  1, 2, 3,12,                                   //   1, 2, 3, C
  0,15,14,13};                                  //   0, F, E, D
int PW1[5]={                                    // Password for the first Door
  3,2,6,4,11};                                  // 3264 and B to confrim (in German it is easier to hit B)
int PW2[5]={                                    // 4632 and B to confrim 
  4,6,2,3,11};
int PACT[5];                                    // Actual Array for the save
unsigned long pmil1;                            // for timer 
unsigned long pmilLast;                         // for timer
int ArrayLeer= 1;                              
long pause1 = 2;
long timeout = 5000;
int ring=1;
int last=0;
int I1=0;
int I2=0;
int I3=0;
int I4=0;
int x=0;
int y=0;
int z=0;
int i=0;  
int r;
int HR=LOW;

void setup(){
  //decalarations
  pinMode(r1,OUTPUT);                 
  pinMode(r2,OUTPUT);
  pinMode(r3,OUTPUT);
  pinMode(r4,OUTPUT);
  pinMode(c1,INPUT);
  pinMode(c2,INPUT);
  pinMode(c3,INPUT);
  pinMode(c4,INPUT);
  pinMode(LEDgn,OUTPUT);                             // Relais 1 door opener 1
  pinMode(LEDrd,OUTPUT);                            // Relais 2 door opener 2
  pinMode(Rel1,OUTPUT);                            // red LED of the DUO LED is connected here
  pinMode(Rel2,OUTPUT);                            // green LED of the DUO LED is connected here
  digitalWrite(r1,HIGH); 
  digitalWrite(r2,HIGH);
  digitalWrite(r3,HIGH);
  digitalWrite(r4,HIGH);
  digitalWrite(c1,HIGH);
  digitalWrite(c2,HIGH);
  digitalWrite(c3,HIGH);
  digitalWrite(c4,HIGH);
  // Serial.begin(9600);                          // only for debug in normal operation all serial can be deleted
}

void loop(){
  if (millis() - pmil1 >pause1) {              // Ringtimer for Array Request
    pmil1=millis();
    if (ring <=4){
      ring=++ring;
    }
    if (ring==5){
      ring=1;
    }
  }    
  if (ring==1){                                // Slope Row1
    digitalWrite(r1,LOW);
    x=0;  
  }
  else 
    digitalWrite(r1,HIGH);
  if (ring==2){                                 // Slope Row2
    digitalWrite (r2,LOW);
    x=4;
  }
  else 
    digitalWrite (r2,HIGH);
  if (ring==3){                                  // Slope Row3
    digitalWrite(r3,LOW);
    x=8;  
  }
  else 
    digitalWrite(r3,HIGH);
  if (ring==4){                                   // Slope Row4
    digitalWrite (r4,LOW);
    x=12;
  }
  else
    digitalWrite (r4,HIGH);

  I1=digitalRead(c1);                        // Request Colmns 1-4
  I2=digitalRead(c2);
  I3=digitalRead(c3);
  I4=digitalRead(c4);

  if (I1==LOW)                               // mapping pointer y pos
    y=1;
  if (I2==LOW)
    y=2;
  if (I3==LOW)
    y=3;
  if(I4==LOW)
    y=4;
  if (I1==HIGH&&I2==HIGH&&I3==HIGH&&I4==HIGH)
    y=0;


  if (I1==LOW||I2==LOW||I3==LOW||I4==LOW){      // do when one key is pressed
    z=x+(y-1);
    PACT[i]= Num[z];
    i=++i;
    r= Num[z];
    ArrayLeer=0;
    pmilLast=millis();
    HR=LOW;
    digitalWrite(LEDrd,HIGH);
    delay(500);
    digitalWrite(LEDrd,LOW);

    /*
    Serial.println(i);                      // only for debug
     Serial.println(r);
     Serial.print(PW1[0]);
     Serial.print(PW1[1]);
     Serial.print(PW1[2]);
     Serial.print(PW1[3]);
     Serial.println(PW1[4]);
     Serial.print(PACT[0]);
     Serial.print(PACT[1]);
     Serial.print(PACT[2]);
     Serial.print(PACT[3]);
     Serial.println(PACT[4]);
     */
  }
  if(ArrayLeer==1){                    // Array is empty the green LED switched on to see ready for input 
    digitalWrite(LEDgn,HIGH);
  }
  else{
    digitalWrite(LEDgn,LOW);
  }

  if (ArrayLeer==0 &&(millis() - pmilLast >timeout)){                // if longer then 5 sec no key pressed the Array will be reseted  
    ArrayReset();
//    Serial.println("Array Reset timeout");
  }
  if (r==13&&HR==LOW || i>=6){                      // if the switch D is pressed of the array pointer equal or biggger 6 array will be reseted
    ArrayReset();
    HR=HIGH;
    //digitalWrite(11,HIGH);
 //   Serial.println("Array Reset");  
  }

  if (array_cmp(PW1, PACT, 5, 5) == true){         // Array comparison with the act array and the saved Password1
// Serial.println("Tor 1 auf");
    digitalWrite(Rel1,HIGH);                         // Turn on the LED to see the array is true Here you can set ther relais or someting
    digitalWrite(LEDrd,HIGH);                          // Relais 1 for door one switch on
    delay(750);                                    // Time to react
    digitalWrite(Rel1,LOW);
    digitalWrite(LEDrd,LOW);
    ArrayReset();  
  }
  if (array_cmp(PW2, PACT, 5, 5) == true){        // Array comparison with the act array and the saved Password2
//    Serial.println("Tor 2 auf");
    digitalWrite(Rel2,HIGH);
    digitalWrite(LEDrd,HIGH);                          // Relais 2 for door one switch on
    delay(750);
    digitalWrite(Rel2,LOW);
    digitalWrite(LEDrd,LOW);
    ArrayReset();
  }
}

boolean array_cmp(int *a, int *b, int len_a, int len_b){                // Array comparion Funtion 
  int n;

  // if their lengths are different, return false
  if (len_a != len_b) return false;
  // test each element to be the same. if not, return false
  for (n=0;n<len_a;n++) if (a[n]!=b[n]) return false;
  //ok, if we have not returned yet, they are equal :)
  return true;
}

void ArrayReset() {                                                   // Array Reset Function
  i=0;
  PACT[0]=0;
  PACT[1]=0;
  PACT[2]=0;
  PACT[3]=0;
  PACT[4]=0;
  ArrayLeer=1;
  digitalWrite(LEDrd,HIGH);
  delay(500);
  digitalWrite(LEDrd,LOW);
}