Aufnehmen und Abspielen von einem Button Status

Hey,

ich hätte da mal ein Problem.
Habe einen Sketch geschrieben über welchen ich mit einem Button eine Sequenz aufnehmen kann und diese dann wieder abspielen und einer Led dementsprechend leuchtet.
Das funktioniert auch alles so wie ich es möchte.

recbutton gedrückt halten
über button1 die Sequenz einspielen
recbutton loslassen

playbutton drücken
Sequenz wird abgespielt

Jetzt zu meinem Problem ich würde gerne die menge der Buttons in Leds verdoppeln. Bedeutet ich habe zwei Button von denen jeweils eine der Leds gesteuert wird.
Somit hätte ich folgende Zustände:

1 off 2 off
1 on 2 on
1 on 2 off
1 off 2 on

mein bisheriger Code

const int recbutton = 2;
const int playbutton = 3;
const int recled = 6;
const int playled = 7;  
const int relayled1 = 8;
const int relayled2 = 9;
const int button1 = 4;
const int button2 = 5;


int trigger1 = 0;
int trigger2 = 0;
int rec = 0;
int play = 0;

long startTime;         // millis-Wert beim ersten Drücken der Taste
long duration;          // Variable für die Dauer

long zeit1[200];         //arry zum speichern des timings butto 1 und 2 off
int i1 = 0;              //zeit zwischenablage
long zeit2[200];         //arry zum speichern des timings
int i2 = 0;              //zeit zwischenablage
long zeit3[200];         //arry zum speichern des timings
int i3 = 0;              //zeit zwischenablage
long zeit4[200];         //arry zum speichern des timings
int i4 = 0;              //zeit zwischenablage

long value1[200];        //arry zum speichern button 1 und 2 on or off
int a1 = 0;              //on or off zwischenablage
long value2[200];        //arry zum speichern on or off
int a2 = 0;              //on or off zwischenablage
long value3[200];        //arry zum speichern on or off
int a3 = 0;              //on or off zwischenablage
long value4[200];        //arry zum speichern on or off
int a4 = 0;              //on or off zwischenablage


int x = 0;              //pos in den Arrays
int y;                  //Anzahl der aufgenommenen Einträge

void setup() {

  Serial.begin(9600);
  
  pinMode(recbutton, INPUT);
  pinMode(playbutton, INPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(recled, OUTPUT);
  pinMode(playled, OUTPUT);
  pinMode(relayled1, OUTPUT);
  pinMode(relayled2, OUTPUT);

}

void loop()
{
  
  if(digitalRead(recbutton) == HIGH)
  {
    Recording();
  }
  if (digitalRead(playbutton) == HIGH)
  { 
    Playback();
  }
}

void Recording(){
  while(digitalRead(recbutton) == HIGH)
  {
    
       digitalWrite(recled, HIGH);
        if(digitalRead(button1) == LOW)             // Sobald die Taste gedrückt wurde
        {
          startTime = millis();
          digitalWrite(relayled1, LOW);
          digitalWrite(relayled2, LOW);
          while(digitalRead(button1) == LOW)     ; // Warten, solange die Taste gedrückt wird
          long duration = millis() - startTime;
          zeit1[x] = duration;
          value1[x] = 0;
          Serial.print("button 1 off  ");
          Serial.print(x);
          Serial.print("   ");
          Serial.println(zeit1[x]);
          x++;                                     //rückt eine Stelle weiter in Array zeit
          
        }
        else
        {
          digitalWrite(relayled1, HIGH);
          startTime = millis();
          while(digitalRead(button1) == HIGH)     ; // Warten, solange die Taste gedrückt wird
          long duration = millis() - startTime;
          zeit1[x] = duration;
          value1[x] = 1;
          Serial.print("button 1 on  ");
          Serial.print(x);
          Serial.print("   ");
          Serial.println(zeit1[x]);
          x++;                                     //rückt eine Stelle weiter in Array zeit
        }
  }
        
  digitalWrite(recled,LOW);
 
}


void Playback(){
     y = x;                                  //speichert anzahl der aufgenommenen Einträge(x) in y
     x = 0;                                  //liest an position 0 in Arrays
     Serial.println("play");
     digitalWrite(playled, HIGH);
     digitalWrite(playbutton, HIGH);
   while(x < y)
    {
      i1 = zeit1[x];                            //legt aktuelle Zeit in i
      a1 = value1[x];                           //legt in a ob button an oder aus war
    
      if(a1 == 0)
      {
        digitalWrite(relayled1, LOW);           //on
        i1 = zeit1[x];
        delay(i1);
        x++;
      }
      else
      {
        digitalWrite(relayled1, HIGH);          //off
        i1 = zeit1[x];
        delay(i1);
        x++;
      }
    }
      digitalWrite(playbutton, LOW);
      digitalWrite(playled, LOW);
      digitalWrite(relayled1, LOW);
      Serial.println("stop");
}

Ich bekomme es nicht hin zwei Button gleichzeitig abzufragen und dabei die Zeit zu messen wie lange sie gedrückt sind.

Hoffe mir kann hier jemand helfen

Hi

Statt in der WHILE darauf zu warten, daß sich DER EINE BUTTON ändert, erstellst Du eine Variable, Die alle beteiligten Buttons enthält.
In einem Byte ist Platz für 8 Bit - könnte man 8 Taster drauf legen.
Bei jeder Änderung des Byte hat sich mindestens ein Taster geändert - Das ist nun Deine Aufgabe herauszufinden, welcher Button den Zustand änderte und Das in den Arrays abzuspeichern.

Wobei ich Deinen Umgang mit dem Speicher bei VALUE[] nicht wirklich verstehe - Du setzt 4 Array mit jeweils 200 Werten zu je 4 Byte (=32 Bit), um Die den Zustand eines Taster in 0 oder 1 zu merken ... 'etwas' übertrieben, oder?

Man könnte value als Byte speichern und darin direkt die 8 Status der 8 Taster einbringen.
Dann hast Du in zeit[] den Zeitpunkt, an Dem sich was ändert und in value, wie's danach ausgesehen hat.

Du brauchst nur EINE Variable für die Zeit und EINE Variable für den Zustand von (bis zu) 8 Tastern.
Das spart wieder jede Menge wertvollen Speicherplatz.

MfG

Hallo,

mir ist nicht ganz klar worauf du hinaus willst. Aber messen wie lang eine Taster gedrückt ist hast Du ja schon fast geschafft. Allerdings würde ich das ohne while Schleifen machen. Den Umgang mit millis() hast Du ja augenscheinlich verstanden. Versuch es mal mit dem Ansatz

Taster einlesen
Flanke bilden
wenn Flanke Starzeit merken

Wenn Taster gedrückt ist
Messzeit = milis()-startzeit

Wenn Taster nicht gedrückt
Flankenmerker rücksetzten
Messwert ist gültig

Heinz

Hi

Die Tastendrücke sollen danach auch wieder abgespielt werden können.
Im Moment setzt Er bei jedem Wechsel einen Timestamp und den Zustand des Taster (in ein LONG).
Für bis zu 200 Änderungen hat Er Platz.
In meiner Idee werden bis zu 8 Taster (von Vorteil, wenn Diese auf dem gleichen Port liegen) in ein Byte eingelesen.
Wenn sich dieses Byte zum vorherigen Durchlauf ändert, wird der Timestamp gespeichert und das Byte der Tasten-Zustände.
(ggf. hier eine Entprellung einbauen)
So hast Du zwar wieder nur 200 Flanken gesamt, aber dafür mit einem Array (würde ein Array aus einem struct vorschlagen) die 8 Taster abgedeckt.

MfG

danke euch erst einmal für die schnelle Antwort.

zu Postmaster-ino
das mit den 4 "vaule arrays" war eine Idee. Jedoch verwende ich wie du vermutlich gesehen hast nur das erste was ja auch reicht.
Mit alle Taster in einem byte nennen wir es man byte buttonstatus; abzuspeichern meinst du etwas wie

if(digitalRead(button1) == LOW)
{
buttonstatus = 0;
}
if(digitalRead(button1) == HIGH)
{
buttonstatus = 1;
}
if(digitalRead(button2) == LOW)
{
buttonstatus = 2;
}
if(digitalRead(button2) == HIGH)
{
buttonstatus = 3;
}
vermutlich nicht oder ?

Suche mal nach bitSet und seinen Verwandten.

Gruß Tommy

Tommy56:
Suche mal nach bitSet und seinen Verwandten.

Gruß Tommy

quasi etwas wie

for (byte i=0; i <= 8; i++){
bitset(digitalRead(button1), i)
}

oder bin ich komplett daneben ?

genau so.

Gruß Tommy

Tommy56:
genau so.

Gruß Tommy

okay es funktioniert jedoch nicht
bitset was not declared in this scope

Anfang void loop()

const int recbutton = 2;
const int playbutton = 3;
const int recled = 6;
const int playled = 7;  
const int relayled1 = 8;
const int relayled2 = 9;
const int button1 = 4;
const int button2 = 5;

byte buttonstatus;

long startTime;         // millis-Wert beim ersten Drücken der Taste
long duration;          // Variable für die Dauer

long zeit[200];         
int i = 0;              //zeit zwischenablage


long value[200];       
int a = 0;              //on or off zwischenablage


int x = 0;              //pos in den Arrays
int y;                  //Anzahl der aufgenommenen Einträge


void setup() {

  Serial.begin(9600);
  
  pinMode(recbutton, INPUT);
  pinMode(playbutton, INPUT);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(recled, OUTPUT);
  pinMode(playled, OUTPUT);
  pinMode(relayled1, OUTPUT);
  pinMode(relayled2, OUTPUT);

}

void loop()
{
  for (byte i=0; i <= 2; i++)
  {
  bitset(digitalRead(button1), i);
  }
  for (byte i=3; i <= 4; i++)
  {
  bitset(digitalRead(button2), i);
  }
  
  if(digitalRead(recbutton) == HIGH)
  {
    Recording();
  }
  if (digitalRead(playbutton) == HIGH)
  { 
    Playback();
  }
}

void Recording(){
  while(digitalRead(recbutton) == HIGH)
  {
    
       digitalWrite(recled, HIGH);
        if(digitalRead(button1) == LOW)             // Sobald die Taste gedrückt wurde
        {
          startTime = millis();
          digitalWrite(relayled1, LOW);
          digitalWrite(relayled2, LOW);
          while(digitalRead(button1) == LOW)     ; // Warten, solange die Taste gedrückt wird
          long duration = millis() - startTime;
          zeit[x] = duration;
          value[x] = 0;
          Serial.print("button 1 off  ");
          Serial.print(x);
          Serial.print("   ");
          Serial.println(zeit[x]);
          x++;                                     //rückt eine Stelle weiter in Array zeit
          
        }
        else
        {
          digitalWrite(relayled1, HIGH);
          startTime = millis();
          while(digitalRead(button1) == HIGH)     ; // Warten, solange die Taste gedrückt wird
          long duration = millis() - startTime;
          zeit[x] = duration;
          value[x] = 1;
          Serial.print("button 1 on  ");
          Serial.print(x);
          Serial.print("   ");
          Serial.println(zeit[x]);
          x++;                                     //rückt eine Stelle weiter in Array zeit
        }
  }
        
  digitalWrite(recled,LOW);
 
}


void Playback(){
     y = x;                                  //speichert anzahl der aufgenommenen Einträge(x) in y
     x = 0;                                  //liest an position 0 in Arrays
     Serial.println("play");
     digitalWrite(playled, HIGH);
     digitalWrite(playbutton, HIGH);
   while(x < y)
    {
      i = zeit[x];                            //legt aktuelle Zeit in i
      a = value[x];                           //legt in a ob button an oder aus war
    
      if(a == 0)
      {
        digitalWrite(relayled1, LOW);           //on
        i = zeit[x];
        delay(i);
        x++;
      }
      else
      {
        digitalWrite(relayled1, HIGH);          //off
        i = zeit[x];
        delay(i);
        x++;
      }
    }
      digitalWrite(playbutton, LOW);
      digitalWrite(playled, LOW);
      digitalWrite(relayled1, LOW);
      Serial.println("stop");
}

case sensitive: bitSet

Gruß Tommy

Edit: Ich habe nochwas übersehen. Du liest ja immer den gleichen Button ein.

Du solltest die Pins Deiner Buttons auch in ein Array schreiben, dann kannst Du die auch in der Schleife abarbeiten. Wobei sich das für 2 Buttons nicht lohnt.

Tommy56:
case sensitive: bitSet

Gruß Tommy

Edit: Ich habe nochwas übersehen. Du liest ja immer den gleichen Button ein.

Du solltest die Pins Deiner Buttons auch in ein Array schreiben, dann kannst Du die auch in der Schleife abarbeiten. Wobei sich das für 2 Buttons nicht lohnt.

erstmal danke für deine schnelle Hilfe

habe ich buttons jetzt trotzdem in nem Array

bekomme jedoch eine Fehlermeldung

Arduino: 1.8.12 (Mac OS X), Board: "Arduino Nano, ATmega328P"

In file included from sketch/propcontroller_2ch_forum.ino.ino.cpp:1:0:
/Data/Projekte/E-TEC/PropController/propcontroller_2ch_forum.ino/propcontroller_2ch_forum.ino.ino: In function 'void loop()':
/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Arduino.h:112:53: error: lvalue required as left operand of assignment
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
^
/Data/Projekte/E-TEC/PropController/propcontroller_2ch_forum.ino/propcontroller_2ch_forum.ino.ino:53:3: note: in expansion of macro 'bitSet'
bitSet(digitalRead(button[0]), f);
^~~~~~
/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Arduino.h:112:53: error: lvalue required as left operand of assignment
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
^
/Data/Projekte/E-TEC/PropController/propcontroller_2ch_forum.ino/propcontroller_2ch_forum.ino.ino:57:3: note: in expansion of macro 'bitSet'
bitSet(digitalRead(button[1]), f);
^~~~~~
exit status 1
Fehler beim Kompilieren für das Board Arduino Nano.

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

kann diese leider nicht deuten

const int recbutton = 2;
const int playbutton = 3;
const int recled = 6;
const int playled = 7;  
const int relayled1 = 8;
const int relayled2 = 9;
//const int button1 = 4;
//const int button2 = 5;


int button[2] = {4,5};
byte buttonstatus;
int f;

long startTime;         // millis-Wert beim ersten Drücken der Taste
long duration;          // Variable für die Dauer

long zeit[200];         
int i = 0;              //zeit zwischenablage


long value[200];       
int a = 0;              //on or off zwischenablage


int x = 0;              //pos in den Arrays
int y;                  //Anzahl der aufgenommenen Einträge


void setup() {

  Serial.begin(9600);
  
  pinMode(recbutton, INPUT);
  pinMode(playbutton, INPUT);
  pinMode(button[0], INPUT);
  pinMode(button[1], INPUT);
  pinMode(recled, OUTPUT);
  pinMode(playled, OUTPUT);
  pinMode(relayled1, OUTPUT);
  pinMode(relayled2, OUTPUT);

}

void loop()
{
  for (byte f=0; f <= 1; f++)
  {
  bitSet(digitalRead(button[0]), f);
  }
  for (byte f=2; f <= 3; f++)
  {
  bitSet(digitalRead(button[1]), f);
  }
  
  if(digitalRead(recbutton) == HIGH)
  {
    Recording();
  }
  if (digitalRead(playbutton) == HIGH)
  { 
    Playback();
  }
}

void Recording(){
  while(digitalRead(recbutton) == HIGH)
  {
    
       digitalWrite(recled, HIGH);
        if(digitalRead(button[0]) == LOW)             // Sobald die Taste gedrückt wurde
        {
          startTime = millis();
          digitalWrite(relayled1, LOW);
          digitalWrite(relayled2, LOW);
          while(digitalRead(button[0]) == LOW)     ; // Warten, solange die Taste gedrückt wird
          long duration = millis() - startTime;
          zeit[x] = duration;
          value[x] = 0;
          Serial.print("button 1 off  ");
          Serial.print(x);
          Serial.print("   ");
          Serial.println(zeit[x]);
          x++;                                     //rückt eine Stelle weiter in Array zeit
          
        }
        else
        {
          digitalWrite(relayled1, HIGH);
          startTime = millis();
          while(digitalRead(button[1]) == HIGH)     ; // Warten, solange die Taste gedrückt wird
          long duration = millis() - startTime;
          zeit[x] = duration;
          value[x] = 1;
          Serial.print("button 1 on  ");
          Serial.print(x);
          Serial.print("   ");
          Serial.println(zeit[x]);
          x++;                                     //rückt eine Stelle weiter in Array zeit
        }
  }
        
  digitalWrite(recled,LOW);
 
}


void Playback(){
     y = x;                                  //speichert anzahl der aufgenommenen Einträge(x) in y
     x = 0;                                  //liest an position 0 in Arrays
     Serial.println("play");
     digitalWrite(playled, HIGH);
     digitalWrite(playbutton, HIGH);
   while(x < y)
    {
      i = zeit[x];                            //legt aktuelle Zeit in i
      a = value[x];                           //legt in a ob button an oder aus war
    
      if(a == 0)
      {
        digitalWrite(relayled1, LOW);           //on
        i = zeit[x];
        delay(i);
        x++;
      }
      else
      {
        digitalWrite(relayled1, HIGH);          //off
        i = zeit[x];
        delay(i);
        x++;
      }
    }
      digitalWrite(playbutton, LOW);
      digitalWrite(playled, LOW);
      digitalWrite(relayled1, LOW);
      Serial.println("stop");
}

Da fehlt der Text der Fehlermeldung.

In der Form musst Du bitWrite nehmen. Deshalb schrieb ich auch "und seinen Verwandten".

byte zustand = 0;
for(byte i=0;i<2;i++) bitWrite(zustand,i,digitalRead(button[i]));

bitSet setzt das Bit auf 1.

Sorry, da war ich unkonzentriert.

Gruß Tommy

Tommy56:
Da fehlt der Text der Fehlermeldung.

In der Form musst Du bitWrite nehmen. Deshalb schrieb ich auch "und seinen Verwandten".

byte zustand = 0;

for(byte i=0;i<2;i++) bitWrite(zustand,i,digitalRead(button[i]));




bitSet setzt das Bit auf 1.

Sorry, da war ich unkonzentriert.

Gruß Tommy

ja ich hätte ja auch einfach mal weiter lesen können.

so habe das eingebaut und noch an gepasst da ich Bisher pro button den Wert zweimal ab gelegt habe was unnötig ist das ist jetzt behoben
und den teil in mein void recording() gesetzt.

Jetzt das problem das er den ersten button press registriert und ab dann keine mehr.

So wie ich das sehe bleibt der in der "while(bitRead(zustand,0) == 0) ; // Warten, solange die Taste gedrückt wird" stecken weil sich der zustand,0 ja nicht ändert ob wohl der button gerückt wird. Aber der zustand wird nicht angepasst weil er ja in der while pausiert.

const int recbutton = 2;
const int playbutton = 3;
const int recled = 6;
const int playled = 7;  
const int relayled1 = 8;
const int relayled2 = 9;
//const int button1 = 4;
//const int button2 = 5;


int button[2] = {4,5};
byte zustand;
int f;

long startTime;         // millis-Wert beim ersten Drücken der Taste
long duration;          // Variable für die Dauer

long zeit[200];         
int i = 0;              //zeit zwischenablage


long value[200];       
int a = 0;              //on or off zwischenablage


int x = 0;              //pos in den Arrays
int y;                  //Anzahl der aufgenommenen Einträge


void setup() {

  Serial.begin(9600);
  
  pinMode(recbutton, INPUT);
  pinMode(playbutton, INPUT);
  pinMode(button[0], INPUT);
  pinMode(button[1], INPUT);
  pinMode(recled, OUTPUT);
  pinMode(playled, OUTPUT);
  pinMode(relayled1, OUTPUT);
  pinMode(relayled2, OUTPUT);

}

void loop()
{
  
  
  if(digitalRead(recbutton) == HIGH)
  {
    Recording();
  }
  if (digitalRead(playbutton) == HIGH)
  { 
    Playback();
  }
}

void Recording(){
  while(digitalRead(recbutton) == HIGH)
  {
    zustand = 0;
    for (byte f=0; f < 2; f++) bitWrite(zustand,f, digitalRead(button[f]));
    
    
    digitalWrite(recled, HIGH);
        if(bitRead(zustand,0) == 0)            // Sobald die Taste gedrückt wurde
        {
          startTime = millis();
          digitalWrite(relayled1, LOW);
          while(bitRead(zustand,0) == 0)     ; // Warten, solange die Taste gedrückt wird
          {
            zustand = 0;
            for (byte f=0; f < 2; f++) bitWrite(zustand, f, digitalRead(button[f]));
          }
          long duration = millis() - startTime;
          zeit[x] = duration;
          value[x] = 0;
          Serial.print("button 1 off  ");
          Serial.print(x);
          Serial.print("   ");
          Serial.println(zeit[x]);
          x++;                                     //rückt eine Stelle weiter in Array zeit
          
        }
        else
        {
          digitalWrite(relayled1, HIGH);
          startTime = millis();
          while(bitRead(zustand,0) == 1)     ; // Warten, solange die Taste gedrückt wird
          long duration = millis() - startTime;
          zeit[x] = duration;
          value[x] = 1;
          Serial.print("button 1 on  ");
          Serial.print(x);
          Serial.print("   ");
          Serial.println(zeit[x]);
          x++;                                     //rückt eine Stelle weiter in Array zeit
        }
  }
        
  digitalWrite(recled,LOW);
 
}


void Playback(){
     y = x;                                  //speichert anzahl der aufgenommenen Einträge(x) in y
     x = 0;                                  //liest an position 0 in Arrays
     Serial.println("play");
     digitalWrite(playled, HIGH);
     digitalWrite(playbutton, HIGH);
   while(x < y)
    {
      i = zeit[x];                            //legt aktuelle Zeit in i
      a = value[x];                           //legt in a ob button an oder aus war
    
      if(a == 0)
      {
        digitalWrite(relayled1, LOW);           //on
        i = zeit[x];
        delay(i);
        x++;
      }
      else
      {
        digitalWrite(relayled1, HIGH);          //off
        i = zeit[x];
        delay(i);
        x++;
      }
    }
      digitalWrite(playbutton, LOW);
      digitalWrite(playled, LOW);
      digitalWrite(relayled1, LOW);
      Serial.println("stop");
}

Was willst Du mit eigenen Schleifen. Du hast doch loop.

Schau Dir mal das debounce-Beispiel in der IDE an.

Gruß Tommy

Hi

Stur sämtliche Taster einlesen und in einem Byte verewigen.
Dieses Byte mit dem Wert der letzten Runde vergleichen.
Sind Beide gleich: Nichts machen - hat Sich ja Nicht verändert!
Bei Unterschieden herausfinden, Was sich verändert hat - hier ggf. entprellen (also Änderung nur übernehmen, wenn die letzte Änderung (dieses Pin) >20ms her ist - ggf. geht hier auch 'global entprellen' - also alle 8 dürfen sich die letzten 20ms nicht verändert haben, um als Neu zu gelten).

Dann Zeit und Wert speichern, aktuellen Wert als 'Wert der vorherigen Runde' speichern - und auf zur nächsten Runde.

Beim Speichern abfragen, ob wir das Ende des Array erreicht haben - also die 200 Status-Änderungen (wobei wir ja nur noch ein Array aus strukt (mit Tastenwerte und Zeit) haben - Das kann jetzt ja größer ausfallen.

MfG

Tommy56:
Was willst Du mit eigenen Schleifen. Du hast doch loop.

Schau Dir mal das debounce-Beispiel in der IDE an.

Gruß Tommy

Hey

meinst du das so ?

ich bleibe immer noch in

while(bitRead(zustand,0) == 0)     ; // Warten, solange die Taste gedrückt wird
          {
            zustand = 0;
            for (byte f=0;f<2;f++) bitWrite(zustand,f,digitalRead(button[f]));
          }

hängen.

const int recbutton = 2;
const int playbutton = 3;
const int recled = 6;
const int playled = 7;  
const int relayled1 = 8;
const int relayled2 = 9;
//const int button1 = 4;
//const int button2 = 5;


int button[2] = {4,5};
byte zustand;
int f;

int lastButtonState = LOW;   // the previous reading from the input pin
int buttonState;

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

long startTime;         // millis-Wert beim ersten Drücken der Taste
long duration;          // Variable für die Dauer

long zeit[200];         
int i = 0;              //zeit zwischenablage


long value[200];       
int a = 0;              //on or off zwischenablage


int x = 0;              //pos in den Arrays
int y;                  //Anzahl der aufgenommenen Einträge


void setup() {

  Serial.begin(9600);
  
  pinMode(recbutton, INPUT);
  pinMode(playbutton, INPUT);
  pinMode(button[0], INPUT);
  pinMode(button[1], INPUT);
  pinMode(recled, OUTPUT);
  pinMode(playled, OUTPUT);
  pinMode(relayled1, OUTPUT);
  pinMode(relayled2, OUTPUT);

}

void loop()
{
  
    zustand = 0;
    for (byte f=0; f < 2; f++) bitWrite(zustand,f, digitalRead(button[f]));

  
  while(digitalRead(recbutton) == HIGH)
  {
    digitalWrite(recled, HIGH);
    if (bitRead(zustand,0) != lastButtonState)               // reset the debouncing timer
    {
    lastDebounceTime = millis();
    }
    
    zustand = 0;
    for (byte f=0; f < 2; f++) bitWrite(zustand,f, digitalRead(button[f]));

    if ((millis() - lastDebounceTime) > debounceDelay) 
    {
      if (bitRead(zustand,0) != buttonState) 
      {
        buttonState = bitRead(zustand,0);

      
      
        if(buttonState == 0)            // Sobald die Taste gedrückt wurde
        {
          startTime = millis();
          digitalWrite(relayled1, LOW);
          while(bitRead(zustand,0) == 0)     ; // Warten, solange die Taste gedrückt wird
          {
            zustand = 0;
            for (byte f=0;f<2;f++) bitWrite(zustand,f,digitalRead(button[f]));
          }
          long duration = millis() - startTime;
          zeit[x] = duration;
          value[x] = 0;
          Serial.print("button 1 off  ");
          Serial.print(x);
          Serial.print("   ");
          Serial.println(zeit[x]);
          x++;                                     //rückt eine Stelle weiter in Array zeit
          
          }
          else
          {
            digitalWrite(relayled1, HIGH);
            startTime = millis();
            while(bitRead(zustand,0) == 1)     ; // Warten, solange die Taste gedrückt wird
          {
            zustand = 0;
            for (byte f=0;f<2;f++) bitWrite(zustand,f,digitalRead(button[f]));
          }
          long duration = millis() - startTime;
          zeit[x] = duration;
          value[x] = 1;
          Serial.print("button 1 on  ");
          Serial.print(x);
          Serial.print("   ");
          Serial.println(zeit[x]);
          x++;                                     //rückt eine Stelle weiter in Array zeit
        }
      }
    } 
  }   
  digitalWrite(recled,LOW);
 



if (digitalRead(playbutton) == HIGH)
  { 
  
     y = x;                                  //speichert anzahl der aufgenommenen Einträge(x) in y
     x = 0;                                  //liest an position 0 in Arrays
     Serial.println("play");
     digitalWrite(playled, HIGH);
     digitalWrite(playbutton, HIGH);
   while(x < y)
    {
      i = zeit[x];                            //legt aktuelle Zeit in i
      a = value[x];                           //legt in a ob button an oder aus war
    
      if(a == 0)
      {
        digitalWrite(relayled1, LOW);           //on
        i = zeit[x];
        delay(i);
        x++;
      }
      else
      {
        digitalWrite(relayled1, HIGH);          //off
        i = zeit[x];
        delay(i);
        x++;
      }
    }
      digitalWrite(playbutton, LOW);
      digitalWrite(playled, LOW);
      digitalWrite(relayled1, LOW);
      Serial.println("stop");
  }
}

hängen

Dann verzichte auf while-Schleifen. Das wurde schon mehrmals gesagt

Serenifly:
Dann verzichte auf while-Schleifen. Das wurde schon mehrmals gesagt

So jetzt habe ich auf while schleifen verzichtet. Dabei muss ich einen Fehler gemacht haben finde ihn jedoch nicht.

jemand eine Idee ?

const int recbutton = 2;
const int playbutton = 3;
const int recled = 6;
const int playled = 7;  
const int relayled1 = 8;
const int relayled2 = 9;
//const int button1 = 4;
//const int button2 = 5;


int button[2] = {4,5};
byte zustand;
int f;

int lastButtonState = 0;   // the previous reading from the input pin
int buttonState;

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 20;

long startTime;         // millis-Wert beim ersten Drücken der Taste
long duration;          // Variable für die Dauer

long zeit[200];         
int i = 0;              //zeit zwischenablage


long value[200];       
int a = 0;              //on or off zwischenablage


int x = 0;              //pos in den Arrays
int y;                  //Anzahl der aufgenommenen Einträge


void setup() {

  Serial.begin(9600);
  
  pinMode(recbutton, INPUT);
  pinMode(playbutton, INPUT);
  pinMode(button[0], INPUT);
  pinMode(button[1], INPUT);
  pinMode(recled, OUTPUT);
  pinMode(playled, OUTPUT);
  pinMode(relayled1, OUTPUT);
  pinMode(relayled2, OUTPUT);

}

void loop()
{
  
    

  
  while(digitalRead(recbutton) == HIGH)
  {
    zustand = 0;
    for (byte f=0; f < 2; f++) bitWrite(zustand,f, digitalRead(button[f]));
    
    digitalWrite(recled, HIGH);
    if (bitRead(zustand,0) != lastButtonState)                 // reset the debouncing timer
    {
    lastDebounceTime = millis();
    }
    
    
    if ((millis() - lastDebounceTime) > debounceDelay) 
    {
      if (bitRead(zustand,0) != buttonState) 
      {
        buttonState = bitRead(zustand,0);

      
      
        if(buttonState == 0)                                      // Sobald die Taste gedrückt wurde
        {
          buttonState = lastButtonState;
          startTime = millis();
          digitalWrite(relayled1, LOW);
          zustand = 0;
          for (byte f=0;f<2;f++) bitWrite(zustand,f,digitalRead(button[f]));
          
          if(bitRead(zustand,0)  != lastButtonState)             // Warten, solange die Taste gedrückt wird
          {
            zustand = 0;
            for (byte f=0;f<2;f++) bitWrite(zustand,f,digitalRead(button[f]));
            buttonState = lastButtonState;
          
            long duration = millis() - startTime;
            zeit[x] = duration;
            value[x] = 0;
            Serial.print("button 1 off  ");
            Serial.print(x);
            Serial.print("   ");
            Serial.println(zeit[x]);
            x++;                                                  //rückt eine Stelle weiter in Array zeit
          
          }
        }
          else
          {
            digitalWrite(relayled1, HIGH);
            startTime = millis();
            if(bitRead(zustand,0) != lastButtonState)     ; // Warten, solange die Taste gedrückt wird
            {
              zustand = 0;
              for (byte f=0;f<2;f++) bitWrite(zustand,f,digitalRead(button[f]));
              buttonState = lastButtonState;
          
              long duration = millis() - startTime;
              zeit[x] = duration;
              value[x] = 1;
              Serial.print("button 1 on  ");
              Serial.print(x);
              Serial.print("   ");
              Serial.println(zeit[x]);
              x++;                                     //rückt eine Stelle weiter in Array zeit
            }
          }
      }
    } 
  }   
  digitalWrite(recled,LOW);
 



if (digitalRead(playbutton) == HIGH)
  { 
  
     y = x;                                  //speichert anzahl der aufgenommenen Einträge(x) in y
     x = 0;                                  //liest an position 0 in Arrays
     Serial.println("play");
     digitalWrite(playled, HIGH);
     digitalWrite(playbutton, HIGH);
   while(x < y)
    {
      i = zeit[x];                            //legt aktuelle Zeit in i
      a = value[x];                           //legt in a ob button an oder aus war
    
      if(a == 0)
      {
        digitalWrite(relayled1, LOW);           //on
        i = zeit[x];
        delay(i);
        x++;
      }
      else
      {
        digitalWrite(relayled1, HIGH);          //off
        i = zeit[x];
        delay(i);
        x++;
      }
    }
      digitalWrite(playbutton, LOW);
      digitalWrite(playled, LOW);
      digitalWrite(relayled1, LOW);
      Serial.println("stop");
  }
}

postmaster-ino:
Hi

Stur sämtliche Taster einlesen und in einem Byte verewigen.
Dieses Byte mit dem Wert der letzten Runde vergleichen.
Sind Beide gleich: Nichts machen - hat Sich ja Nicht verändert!
Bei Unterschieden herausfinden, Was sich verändert hat - hier ggf. entprellen (also Änderung nur übernehmen, wenn die letzte Änderung (dieses Pin) >20ms her ist - ggf. geht hier auch 'global entprellen' - also alle 8 dürfen sich die letzten 20ms nicht verändert haben, um als Neu zu gelten).

Dann Zeit und Wert speichern, aktuellen Wert als 'Wert der vorherigen Runde' speichern - und auf zur nächsten Runde.

Beim Speichern abfragen, ob wir das Ende des Array erreicht haben - also die 200 Status-Änderungen (wobei wir ja nur noch ein Array aus strukt (mit Tastenwerte und Zeit) haben - Das kann jetzt ja größer ausfallen.

MfG

das klingt gut nur kann ich es leider nicht umsetzten.