Random Funktionen

Hallo!

Ich habe ein Problem aufgrund von Random Funktionen und zwar habe ich zwei Random Funktionen geschrieben (als Unteprogramme). Das Problem dabei, wenn ich die Random Funktionen im loop aufrufe, dann wird zwischenzeitlich die andere blockiert und ich komm einfach nicht auf den Fehler

int button1 = 3;
int button2 = 53;

int led1 = 2;
int led2 = 51;

long randomTime1;
long randomTime2;

long startTime1;
long startTime2;

long endTime1;
long endTime2;

float elapsedTime1;
float elapsedTime2;

boolean lastButton1 = LOW;
boolean lastButton2 = LOW;

boolean currentButton1 = LOW;
boolean currentButton2 = LOW;

boolean Started1 = true;
boolean Started2 = true;

boolean timer1 = true;
boolean timer2 = true;

void setup() 
{
 pinMode(button1, INPUT);
 pinMode(button2, INPUT);
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);
 Serial.begin(9600);

 

 Random1();
 Random2();
 timer1 = true;
 timer2 = true;
 
}

boolean debounce1(boolean last) //Entprellen des Tasters
{
 boolean current1 = digitalRead(button1);
 if(last != current1)
 {
   delay(5);
   current1 = digitalRead(button1);
 }
 return current1;
}

boolean debounce2(boolean last) //Entprellen des Tasters
{
 boolean current2 = digitalRead(button2);
 if(last != current2)
 {
   delay(5);
   current2 = digitalRead(button2);
 }
 return current2;
}


void loop() 
{

 Funktion2();
 Funktion1();
}

void Funktion1()
{
 
 currentButton1 = debounce1(lastButton1);  //Wert von debounce wird als Variable abgespeichert
 
 if(lastButton1 == LOW && currentButton1 == HIGH) //Vorheriger Zustand = Low, wenn der Button vorher auf low ist und danach high, was passiert?
 {
   Started1 = !Started1;
 }
 
 lastButton1 = currentButton1;

 if(Started1 == false && timer1 == true)
 {
   Stop1();
   timer1 = false;
 } 
}

void Funktion2()
{
 currentButton2 = debounce2(lastButton2);  //Wert von debounce wird als Variable abgespeichert
 
 if(lastButton2 == LOW && currentButton2 == HIGH) //Vorheriger Zustand = Low, wenn der Button vorher auf low ist und danach high, was passiert?
 {
   Started2 = !Started2;
 }
 
 lastButton2 = currentButton2;

 if(Started2 == false && timer2 == true)
 {
   Stop2();
   timer2 = false;
 } 
}

void Random1()
{
 randomTime1 = random(2,8);
 randomTime1 = randomTime1*1000;
 delay(randomTime1);
 Start1();
}

void Random2()
{
 randomTime2 = random(4,7);
 randomTime2 = randomTime2*1000;
 delay(randomTime2);
 Start2();
}

void Start1()
{
 startTime1 = millis();
 digitalWrite(led1, HIGH);
}

void Start2()
{
 
 startTime2 = millis();
 digitalWrite(led2, HIGH);
}

void Stop1()
{
 endTime1 = millis();
 elapsedTime1 = (endTime1-startTime1)+5;
 elapsedTime1 = elapsedTime1/1000;
 Serial.println(elapsedTime1);
 digitalWrite(led1, LOW);
}

void Stop2()
{
 endTime2 = millis();
 elapsedTime2 = (endTime2-startTime2)+5;
 elapsedTime2 = elapsedTime2/1000;
 Serial.println(elapsedTime2);
 digitalWrite(led2, LOW);
 
}

hier der Code, tut mir leid, dass er so unübersichtlich ist!

Vielen Dank!!

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

Edit: Das delay blockiert.

alm8090:
hier der

Ach, da!

Was eigentlich?

Setze Deinen Sketch bitte in Code-Tags.

Gruß

Gregor

Tommy56:
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

Edit: Das delay blockiert.

Wie meinst du?

Bin komplett neu auf diesem Forum!

Sorry

MfG

Aber des Lesens bist Du mächtig? Was verstehst Du nicht? Die Codetags oder das delay-Problem?

Gruß Tommy

Das Delay Problem :confused:

Ein Programm sollte so aussehen:

// Hier Dein Programm!
char text[i] = {"Hallo"};

aber nicht so:

// Hier Dein Programm!
char text = {"Hallo"};
Ich hoffe, Du bermerkst den Unterschied.

Du hast genau einen µC, wenn Du den mittels delay() anhältst, dann wartet er und kann nichts sonst machen.

agmue:
Ein Programm sollte so aussehen:

// Hier Dein Programm!

char text[i] = {"Hallo"};



aber nicht so:

// Hier Dein Programm!
char text *= {"Hallo"};*
*Ich hoffe, Du bermerkst den Unterschied.*
*[/quote]*
*Habs schon die Einstellung gefunden, denke ich bzw. hoffe ich mal :D*
*Danke*

alm8090:
Habs schon die Einstellung gefunden, denke ich bzw. hoffe ich mal :smiley:

Sehr gut :slight_smile:

Jetzt noch delay() durch millis() ersetzen und es wird.

Deine Funktion blockiert:

void Random1()
{
 randomTime1 = random(2,8);
 randomTime1 = randomTime1*1000;
 delay(randomTime1);  //                     <-- solange das delay läuft, geht es nicht weiter
 Start1();
}

Also delay raus und die Wartezeit mit millis() bauen. Schau Dir dazu BlinkWithoutDelay in den Beispielen Deiner IDE an und verstehe es. Dabei kann Dir die Nachtwächtererklärung helfen.

Gruß Tommy

Tommy56:
Deine Funktion blockiert:

void Random1()

{
randomTime1 = random(2,8);
randomTime1 = randomTime1*1000;
delay(randomTime1);  //                    ← solange das delay läuft, geht es nicht weiter
Start1();
}



Also delay raus und die Wartezeit mit millis() bauen. Schau Dir dazu BlinkWithoutDelay in den Beispielen Deiner IDE an und verstehe es. Dabei kann Dir die Nachtwächtererklärung helfen.

Gruß Tommy

Muss ich die “Wartezeit” dann in die Random Funktion anstatt “delay” reintun oder in der “If - Abfrage” im “loop”?

Weil mit diesem BlinkWithoutDelay arbeite ich grad zum ersten Mal

Das wird dann keine Wartezeit, in der nichts passiert, sondern erst nach dieser Zeit wird etwas gestartet.
Das kannst Du an beiden Stellen machen.

Gruß Tommy

Ich versuch es grad 2 Stunden...

ich komm einfach nicht drauf, dass einzige was neu ist:

int ledState = LOW;

int button1 = 3;
int button2 = 53;

int led1 = 2;
int led2 = 51;

long randomTime1;
long randomTime2;

unsigned long startTime1;
unsigned long startTime2;

long endTime1;
long endTime2;

float elapsedTime1;
float elapsedTime2;

boolean lastButton1 = LOW;
boolean lastButton2 = LOW;

boolean currentButton1 = LOW;
boolean currentButton2 = LOW;

boolean Started1 = true;
boolean Started2 = true;

boolean timer1 = true;
boolean timer2 = true;

unsigned long prevMillis1 = 0;
unsigned long prevMillis2 = 0;


void setup()
{
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  Serial.begin(9600);



  Random1();
  Random2();
  timer1 = true;
  timer2 = true;

}

boolean debounce(boolean last, int pin) //Entprellen des Tasters
{
  boolean current= digitalRead(pin);
  if(last != current)
  {
    delay(5);
    current = digitalRead(pin);
  }
  return current;
}


void loop()
{
  Funktion2();
  Funktion1();
}

void Funktion1()
{
  currentButton1 = debounce(lastButton1, button1);  

  if(lastButton1 == LOW && currentButton1 == HIGH) 
  {
    Started1 = !Started1;
  }

  lastButton1 = currentButton1;

  if(Started1 == false && timer1 == true)
  {
    Stop1();
    timer1 = false;
  }
}

void Funktion2()
{
  currentButton2 = debounce(lastButton2, button2);  

  if(lastButton2 == LOW && currentButton2 == HIGH) 
  {
    Started2 = !Started2;
  }

  lastButton2 = currentButton2;

  if(Started2 == false && timer2 == true)
  {
    Stop2();
    timer2 = false;
  }
}

void Random1()
{
  randomTime1 = random(2,8);
  randomTime1 = randomTime1*1000;
  Start1();
}

void Random2()
{
  randomTime2 = random(4,7);
  randomTime2 = randomTime2*1000;
  Start2();
}

void Start1()
{
  startTime1 = millis();

  if(startTime1 - prevMillis1 >= 4000)
  {
    prevMillis1 = startTime1;
    if(ledState == LOW)
    {
      ledState = HIGH;
    }
  }
  digitalWrite(led1, ledState);
}

void Start2()
{
  startTime2 = millis();

  if(startTime2 - prevMillis2 >= 2000)
  {
    prevMillis2 = startTime1;
    if(ledState == LOW)
    {
      ledState = HIGH;
    }
  }
  digitalWrite(led2, ledState);
}
void Stop1()
{
  endTime1 = millis();
  elapsedTime1 = (endTime1-startTime1)+5;
  elapsedTime1 = elapsedTime1/1000;
  Serial.println(elapsedTime1);
  digitalWrite(led1, LOW);
}

void Stop2()
{
  endTime2 = millis();
  elapsedTime2 = (endTime2-startTime2)+5;
  elapsedTime2 = elapsedTime2/1000;
  Serial.println(elapsedTime2);
  digitalWrite(led2, LOW);
}

Also bei den 2 Unterfunktionen Start1() und Start2() hab ich was geändert. Ich habs in den beiden Funktionen ohne Random mal gemacht und geschaut, ob es auch so funktioniert, tut es noch nicht...

Irgendwie ist mir noch nicht klar, was Du überhaupt erreichen willst.
Beschreibe doch mal, was Dein Sketch machen soll.

Gruß Tommy

Also: Ich habe insgesamt 2 Arcade Buttons mit integrierter LED

Das Programm soll genau so funktionieren: die beiden LED's gehen nach einer random Zeit einfach an, von dort weg wird die Zeit gemessen (also seit wann die LED an ist), bis ich den Button gedrückt habe --> dann soll die LED ausgehen und mir die Zeit auf dem Serial Monitor ausgeben. Also es soll, wie so eine Art Reaktionstester sein

Hoffe es ist dadurch etwas klarer...

MfG

Sollen die beiden Buttons in Konkurrenz (also quasi nebeneinander) laufen?

Gruß Tommy

Edit: Sind die Buttons nach 5V oder nach GND geschaltet?

agmue:
Sehr gut :slight_smile:

Jetzt noch delay() durch millis() ersetzen und es wird.

Ausprobiert, funktioniert nicht trotzdem nicht, muss ich anstatt diesem delay in der Random Funktion einfach dieses "BlinkWithoutDelay" hineinschreiben?

Du musst dieses BlinkWithoutDelay erst mal verstehen. So, wie Du das mit reinschreiben beschreibst, hast Du das noch nicht.

Gruß Tommy

Tommy56:
Sollen die beiden Buttons in Konkurrenz (also quasi nebeneinander) laufen?

Gruß Tommy

Edit: Sind die Buttons nach 5V oder nach GND geschaltet?

An der Hardware liegt es nicht und ja sind sie. Ich schau mir grad dutzend tutorials an, ich komm wirklich nicht drauf...

Ja sozusagen schon, also ich reboote den arduino, dann leuchten die irgendwann mal auf und dann drück ich eben.

MfG

Hi

Für ‘das erste Erkennen’ brauchst Du kein Debounce - wenn gedrückt wurde, ist’s egal, ob die nächste Sekunde noch zwölfunddreißig Mal erneut gedrückt wurde.

Mein Ansatz: State - Maschine (Zeit_A/Zeit_B unsigned - mit -1 (maxValue ?? gibt Da ein #define für) initialisieren
Status 1, Wartezeit bestimmen, LEDs anschalten, Status->2
Status 2, Prüfen, ob Wartezeit vorbei ist, JA LEDs aus, Status->3
Status 3 A, Prüfen, ob Taster A betätigt ist → Wenn Zeit_A noch nicht gesetzt ist → Zeit_A setzen
Status 3 B, Prüfen, ob Taster B betätigt ist → Wenn Zeit_B noch nicht gesetzt ist → Zeit_B setzen
Status 3 C, Prüfen, ob Zeit_A oder Zeit_B gesetzt ist, JA Status->4
Status 4 A, Prüfen ob Zeit_A<Zeit_B → Gewinner=Spieler A
Status 4 B, Prüfen ob Zeit_B<Zeit_A → Gewinner=Spieler B
Status 4 C, Prüfen ob Zeit_A==Zeit_B → Unentschieden
Status 4 D, Status->5
Status 5 Gewinner Blinken lassen, bei totem Rennen langsames Blinken beider Taster, nach frühestens 3 Sekunden durch Button-Druck Neustart zulassen (Zeit_A/_B neu auf -1 setzen, Status=0 setzen)

Vorher kann man noch prüfen, ob nicht schon zu früh ‘gebuzzert’ wurde - dann hat dieser Spieler natürlich verloren.

MfG