lmaono
Published

Tutorial: Hot potato game with Arduino Mega

Hot potato remade using an Arduino

IntermediateFull instructions provided489
Tutorial: Hot potato game with Arduino Mega

Things used in this project

Hardware components

4 Part seven segment display
×1
Jumper wires (generic)
Jumper wires (generic)
×1
LED (generic)
LED (generic)
×2
Push buttons
×2
Resistor 10k ohm
Resistor 10k ohm
×8
Arduino Mega 2560
Arduino Mega 2560
×1
Breadboard (generic)
Breadboard (generic)
×1

Schematics

Hot potato

Code

potato

C/C++
#include <SevSeg.h>
const int button1 = 52, button2 = 53;
const int led1 = 12, led2 = 11;

bool ready1 = false, ready2 = false;

const int gameTime = 4000;

SevSeg sevseg;

void setup() {
  byte numDigits = 4;
  byte digitPins[] = {44, 45, 42, 43};
  byte segmentPins[] = {23, 22, 38, 28, 29, 24, 36, 4};

  bool resistorsOnSegments = true; 
  bool updateWithDelaysIn = true;
  byte hardwareConfig = COMMON_CATHODE; 
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
  sevseg.setBrightness(90);

}

int counter = 0;
int sub_counter = 0;

void loop() {
  
  while (!(ready1 && ready2)){
    sevseg.refreshDisplay();
    
    int state1 = digitalRead(button1), state2 = digitalRead(button2);
    if (state1 == 1){
      ready1 = true;
    }
    if (state2 == 1){
      ready2 = true;
    }

    if (ready1){
      sevseg.setChars("P1  ");
    }
    else if (ready2){
      sevseg.setChars("  P2");
    }
    else {
      sevseg.setChars("    ");
    }

    delay(1);
  }
  sevseg.setChars("p1p2");
  for (int i = 0; i < 1000; i ++){
    sevseg.refreshDisplay();
    delay(1);
  }

  int startDelay = 2500;
    
  for (int i = 0; i < startDelay; i ++){
    sevseg.setChars("REDY");
    sevseg.refreshDisplay();
    delay(1);
  }

  counter = gameTime;

  int potato = rand() % 2 + 1;

  int winner = 0;

  while (counter > 0){
    if (potato == 1){
      digitalWrite(led1, HIGH);
      digitalWrite(led2, LOW);
    }
    else {
      digitalWrite(led2, HIGH);
      digitalWrite(led1, LOW);
    }

    int t1 = digitalRead(button1), t2 = digitalRead(button2);

    int l = 0;

    if (t1 == 1){
      if (potato == 1){
        potato = 0;
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        l = throw_p(1);
        potato = 2;
      }
      else {
        potato = 1;
        break;
      }
    }
    if (t2 == 1){
      if (potato == 2){
        potato = 0;
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        l = throw_p(2);
        potato = 1;
      }
      else {
        potato = 2;
        break;
      }
    }

    if (l == 1){
      potato = 1;
      break;
    }
    if (l == 2){
      potato = 2;
      break;
    }
    
    counter --;
    sevseg.setNumber(counter);
    sevseg.refreshDisplay();
    delay(1);
  }

  if (potato == 2){
    winner = 1;
  }
  if (potato == 1){
    winner = 2;
  }

  flash_until_press(winner);

  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  
  ready1 = false, ready2 = false;
  delay(1);
}

int throw_p(int u){

  bool p1rel = false, p2rel = false;

  int val = rand() % 50 + 70;
  char t[4] = {' ', ' ', ' ', ' '};
  
  for (int c = 0; c < 5; c ++){
    for (int i = 0; i < val; i ++){
      sevseg.setChars(t);
      sevseg.refreshDisplay();
      if (digitalRead(button1) == 1){
        if (p1rel){
          return 1;
        }
      }
      else {
        p1rel = true;
      }
      if (digitalRead(button2) == 1){
        if (p2rel){
          return 2;
        }
      }
      else {
        p2rel = true;
      }
      delay(1);
    }
    if (c != 4){
      if (u == 1){
        t[c] = '-';
      }
      else{
        t[3 - c] = '-';
      }
    }
  }
  return 0;
}

void flash_until_press(int w){
  bool rel1 = false, rel2 = false;
  int c = 0;

  for (int i = 0; i < 400; i ++){
    if (c > 100 && c < 200){
      sevseg.setChars("");
    }
    else if (c > 0) {
      if (w == 1){
        sevseg.setChars("P1  ");
      }
      else {
        sevseg.setChars("  P2");
      }
    }
    c ++;
    if (c >= 200){
      c = 0;
    }
    sevseg.refreshDisplay();
    delay(1);
  }

  while (!((rel1 && digitalRead(button1) == 1) || (rel2 && digitalRead(button2) == 1))){
    if (c > 100 && c < 200){
      sevseg.setChars("");
    }
    else {

      if (w == 1){
        sevseg.setChars("P1  ");
      }
      else {
        sevseg.setChars("  P2");
      }
    }
    c ++;
    if (c >= 200){
      c = 0;
    }
    sevseg.refreshDisplay();

    if (digitalRead(button1) == 0){
      rel1 = true;
    }
    if (digitalRead(button2) == 0){
      rel2 = true;
    }
    delay(1);
  }
}

Credits

lmaono
0 projects • 1 follower
Contact

Comments

Please log in or sign up to comment.