Problemen met quiz

Hallo,

Wat is er verkeerd met mijn code? Wanneer ik de code in m'n Uno laad stuurt deze onmiddelijk mn lamp1 uit. Ik gebruik 5V relais deze moet ik LAAG sturen om ze te doen optrekken.

const int speler1 = 0;
const int speler2 = 1;
const int speler3 = 2;
const int lamp1 = 5;
const int lamp2 = 6;
const int lamp3 = 7;
const int zoemer = 9;
const int juist = 10;
boolean tellen = false;
int punten1 = 0;
int punten2 = 0;
int punten3 = 0;
int var = 0;
const int zero = 0;
boolean done;



void setup() {
  // put your setup code here, to run once:
  for (int pinNumber = 0; pinNumber <= 2; pinNumber++) {
    pinMode(pinNumber, INPUT);
  }
  for (int pinNumber = 5; pinNumber <= 9; pinNumber++) {
    pinMode(pinNumber, OUTPUT);
  }
  pinMode(10, INPUT);
  done = true;
  Serial.begin(9600);
  digitalWrite(lamp1, HIGH);
  digitalWrite(lamp2, HIGH);
  digitalWrite(lamp3, HIGH);
}


//void lampAan(int lamp) {
//done = false;
//digitalWrite(lamp, HIGH);
//tone(zoemer, 200, 1000);
//delay(1000);
//tone(zoemer, 200, 1000);
//digitalWrite(lamp, LOW);
//done = true;
//Serial.println(done);
//delay(1000);
//}
void loop() {
  // put your main code here, to run repeatedly:


  if ((digitalRead(speler1) == HIGH) && (done == true)) {
    Serial.println("1 HIGH");
    var = 10;
  }

  else if ((digitalRead(speler2) == HIGH) && (done == true)) {
    Serial.println("2 HIGH");
    var = 20;
  }

  else if ((digitalRead(speler3) == HIGH) && (done == true)) {
    Serial.println("3 HIGH");
    var = 30;
  }


  switch (var) {
    case 10:
      //do something when var equals 1
      done = false;
      digitalWrite(lamp1, LOW);
      Serial.println("lamp1 brandt");
      tone(zoemer, 200, 1000);
      Serial.println("tijd start");
      delay(10000);
      Serial.println("tijd om");
      tone(zoemer, 200, 1000);
      digitalWrite(lamp1, HIGH);
      if (digitalRead(juist) == HIGH) {
        delay(1000);
        punten1 += 10;
        Serial.println(punten1);
      }
      done = true;
      var = 0;
      break;

    case 20:
      //do something when var equals 2
      done = false;
      digitalWrite(lamp2, LOW);
      tone(zoemer, 200, 1000);
      delay(10000);
      tone(zoemer, 200, 1000);
      digitalWrite(lamp2, HIGH);
      if (digitalRead(juist) == HIGH) {
        delay(1000);
        punten2 += 10;
        Serial.println(punten2);
      }
      done = true;
      var = 0;
      break;

    case 30:
      done = false;
      digitalWrite(lamp3, LOW);
      tone(zoemer, 200, 1000);
      delay(10000);
      tone(zoemer, 200, 1000);
      digitalWrite(lamp3, HIGH);
      if (digitalRead(juist) == HIGH) {
        delay(1000);
        punten3 += 10;
        Serial.println(punten3);
      }
      done = true;
      var = 0;
      break;

    default:
      // if nothing else matches, do the default
      // default is optional
      break;
  }
}

Pin 0 en 1 zijn voor de serial. Dus daar moet vanaf blijven. Om te beginnen

Wanneer ik ingang 2 , 3 en 4 gebruik heb ik nog steeds hetzelfde. zonder de ingang hoog te zetten trekt mn relais lamp1 al aan

En wat heb je aan die ingangen hangen?

Er zitten meer fouten in de code.

Die zijn lastiger te vinden, wat je hebt de commentaren van het voorbeeld dat je ergens hebt opgedoken niet aangepast aan je huidige code.

Speler 1 is in de getoonde code in het voordeel, want als die wordt het eerst bekeken, en zal dan als enige knopdrukker worden verwerkt door jouw code.
Dus een eventuele gelijktijdige knopdruk door anderen zal in het voordeel van drukker 1 worden beslecht.
Niet eerlijk.

Natuurlijk is de kans daarop erg klein, maar wel aanwezig.

Even verderop is drukker1 opnieuw in het voordeel.

Dit kun je niet helemaal voorkomen, maar je kan de kans hierop wel een heel stuk verkleinen door de code slimmer te maken.

Je gebruikt de seriële verbinding al voor allerlei informatie.
Wat zie je daar voorbij komen ?

En de relais, dat zijn toch zeker relais modules, of niet ?

Toon wat je hebt.

Je bent te snel mas. Ik denk ik laat hem stapje voor stapje het zelf ontdekken.

Sorry...

Ik had nog niets aan mn ingangen hangen hierdoor stuurde lamp1 onmiddelijk. Wat is hier de reden voor? Nu werkt alles wel naar behoren.

Maar inderdaad speler 1 heeft een voordeel. Hoe zou ik dit kunnen oplossen?

Hallo,

Ik heb denk ik een eerlijke code geschreven. Wanneer er 2 knoppen tegelijk ingeduwd worden bepaald de randomfunctie welke speler aan de beurt is.

Laat me weten wat jullie ervan vinden.

const int player1 = 2;
const int player2 = 3;
const int player3 = 4;
const int lamp1 = 5;
const int lamp2 = 6;
const int lamp3 = 7;
const int buzzer = 8;
const int correct = 10;
int score1 = 0;
int score2 = 0;
int score3 = 0;
boolean done;
int button1 = 0;
int button2 = 0;
int button3 = 0;
int Pressed = 0;
int buttonPressed;
int whichButton;
int buttonPressedFirst;

void setup() {
  // put your setup code here, to run once:
  for (int pinNumber = 2; pinNumber <= 4; pinNumber++) {
    pinMode(pinNumber, INPUT);
  }
  for (int pinNumber = 5; pinNumber <= 8; pinNumber++) {
    pinMode(pinNumber, OUTPUT);
  }
  pinMode(10, INPUT);
  done = true;
  Serial.begin(9600);
  digitalWrite(lamp1, HIGH);
  digitalWrite(lamp2, HIGH);
  digitalWrite(lamp3, HIGH);
}


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

  //READ DIGITAL INPUTS
  button1 = digitalRead(player1);
  button2 = digitalRead(player2);
  button3 = digitalRead(player3);


  //WHICH BUTTON IS PRESSED
  if ((button1 == HIGH) && (done == true)) {
    Serial.println("1 HIGH");
    buttonPressed = 2;
  }

  else if ((button2 == HIGH) && (done == true)) {
    Serial.println("2 HIGH");
    buttonPressed = 3;
  }

  else if ((button3 == HIGH) && (done == true)) {
    Serial.println("3 HIGH");
    buttonPressed = 4;
  }

  //GENERATE A RANDOM NUMBER
  whichButton = random(2, 4);

  //COMPARE THE RANDOM NUMBER WITH THE BUTTON PRESSED
  if (whichButton = buttonPressed) {
    buttonPressedFirst = whichButton;
  }

  //EXECUTE CODE FOR THE PLAYER WHOSE TURN IT IS
  switch (buttonPressedFirst) {
    case 2:
      //do something when var equals 1
      done = false;
      digitalWrite(lamp1, LOW);
      tone(buzzer, 200, 500);
      delay(1000);
      tone(buzzer, 200, 500);
      digitalWrite(lamp1, HIGH);
      if (digitalRead(correct) == HIGH) {
        delay(1000);
        score1 += 10;
        Serial.println(score1);
      }
      done = true;
      buttonPressed = 0;
      buttonPressedFirst = 0;
      break;

    case 3:
      //do something when var equals 2
      done = false;
      digitalWrite(lamp2, LOW);
      tone(buzzer, 200, 500);
      delay(1000);
      tone(buzzer, 200, 500);
      digitalWrite(lamp2, HIGH);
      if (digitalRead(correct) == HIGH) {
        delay(1000);
        score2 += 10;
        Serial.println(score2);
      }
      done = true;
      buttonPressed = 0;
      buttonPressedFirst = 0;
      break;

    case 4:
      done = false;
      digitalWrite(lamp3, LOW);
      tone(buzzer, 200, 500);
      delay(1000);
      tone(buzzer, 200, 500);
      digitalWrite(lamp3, HIGH);
      if (digitalRead(correct) == HIGH) {
        delay(1000);
        score3 += 10;
        Serial.println(score3);
      }
      done = true;
      buttonPressed = 0;
      buttonPressedFirst = 0;
      break;

    default:
      // if nothing else matches, do the default
      // default is optional
      break;
  }
}