Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Please Help!!!! I am trying to develop a LED Ping-Pong game on the Raspberry Pi,

ID: 3858412 • Letter: P

Question

Please Help!!!! I am trying to develop a LED Ping-Pong game on the Raspberry Pi, but I am having an enormous amount of trouble trying to get the program to check to see if the switch is pressed or not. When I run my program, the LED automatically bounces back to the next cycle neglecting the delay count. I have tried everything to get this to work. Attached is a copy of my code. Feel free to copy and paste it to try to comb out what my problem is.

#include <stdio.h>

#include <wiringPi.h>

#include <stdbool.h>

#define BUTTON_DEBOUNCE_CHECKS 10

int endGame()

{

//---Turns on 1st Yellow LED------------------------------------------------------------------

printf( " You Lose! ");

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, LOW); // turn on 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd Yellow LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

  

delay(100);

  

//---Turns on 2nd YELLOW LED---------------------------------------------------------------

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, LOW); // turn on 2nd YELLOW LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

delay(100);

  

//---Turns on 3rd YELLOW LED---------------------------------------------------------------

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd YELLOW LED

digitalWrite( 26, LOW); // turn on 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

delay(100);

  

//---Turns on Right LED------------------------------------------------------------------

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd YELLOW LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, LOW); // turn on Right Green LED

  

delay(100);

  

//---Turns on 1st Yellow LED------------------------------------------------------------------

digitalWrite( 23, LOW); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn on 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd Yellow LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

delay(100);

  

//---Turns on 2nd YELLOW LED---------------------------------------------------------------

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, LOW); // turn off 1st Yellow LED

digitalWrite( 25, HIGH); // turn on 2nd YELLOW LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

delay(100);

  

//---Turns on 3rd YELLOW LED---------------------------------------------------------------

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, LOW); // turn off 2nd YELLOW LED

digitalWrite( 26, HIGH); // turn on 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

delay(100);

  

//---Turns on Right LED------------------------------------------------------------------

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd YELLOW LED

digitalWrite( 26, LOW); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn on Right Green LED

  

delay(100);

  

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd YELLOW LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, LOW); // turn on Right Green LED

  

delay(100);

  

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd YELLOW LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

delay(500);

  

return 0;

}

int player01Serve()

{

int switchA;

int flagSwitchA = 0; // sets flag for when switch is pressed and then released

  

digitalWrite( 23, LOW); // turn on Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd Yellow LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

switchA = digitalRead(22);

  

if (switchA == 1) // if switch is pressed, activate flag

flagSwitchA = 1;

  

while (flagSwitchA == 0) // if switched is released, do function

cycleRight();

return switchTestB(digitalRead(22),900);

}

/* Delay test to see if switchB is pressed during alloted time */

int switchTestB(int switchB, int theDelaytime)

{

   static unsigned int buttonStateB = 0;

static char buttonPressEnabledB = 1;

  

if(digitalRead(17))

{

if (buttonStateB < theDelaytime/BUTTON_DEBOUNCE_CHECKS)

{

buttonStateB++;

}

else if(buttonPressEnabledB)

{

buttonPressEnabledB = 0;

return 1;

}

}

else if(buttonStateB > 0)

{

buttonStateB--;

}

else

{

buttonPressEnabledB = 1;

}

  

return 0;

}

/* Delay test to see if switchA is pressed during alloted time */

int switchTestA(int switchA, int theDelaytime)

{

static unsigned int buttonStateA = 0;

static char buttonPressEnabledA = 1;

  

if(digitalRead(22))

{

if(buttonStateA < theDelaytime/BUTTON_DEBOUNCE_CHECKS)

{

buttonStateA++;

}

else if(buttonPressEnabledA)

{

buttonPressEnabledA = 0;

return 1;

}

}

else if(buttonStateA > 0)

{

buttonStateA--;

}

else

{

buttonPressEnabledA = 1;

}

  

return 0;

}

int cycleRight()

{

  

//---Turns on RED------------------------------------------------------------------

printf( "Turning On 1st Yellow LED ");

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, LOW); // turn on 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd Yellow LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

delay(600);

  

  

//---Turns on YELLOW---------------------------------------------------------------

printf( "Turning On 2nd YELLOW LED ");

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, LOW); // turn on 2nd Yellow LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

delay(600);

  

  

  

//---Turns on YELLOW---------------------------------------------------------------

printf( "Turning On 3rd YELLOW LED ");

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd Yellow LED

digitalWrite( 26, LOW); // turn on 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

delay(600);

  

//---Turns on RED------------------------------------------------------------------

printf( "Turning On Right Green LED ");

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd Yellow LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, LOW); // turn on Right Green LED

  

return switchTestB(digitalRead(22),900);

}

  

int cycleLeft()

{

  

//---Turns on RED------------------------------------------------------------------

printf( "Turning On 3rd Yellow LED ");

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd Yellow LED

digitalWrite( 26, LOW); // turn on 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

delay(600);

  

//---Turns on YELLOW---------------------------------------------------------------

printf( "Turning On 2nd YELLOW LED ");

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, LOW); // turn on 2nd Yellow LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

delay(600);

  

//---Turns on YELLOW---------------------------------------------------------------

printf( "Turning On 1st YELLOW LED ");

digitalWrite( 23, HIGH); // turn off Left Green LED

digitalWrite( 24, LOW); // turn on 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd Yellow LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

delay(600);

  

  

//---Turns on RED------------------------------------------------------------------

printf( "Turning On Left Green LED ");

digitalWrite( 23, LOW); // turn on Left Green LED

digitalWrite( 24, HIGH); // turn off 1st Yellow LED

digitalWrite( 25, HIGH); // turn off 2nd Yellow LED

digitalWrite( 26, HIGH); // turn off 3rd Yellow LED

digitalWrite( 27, HIGH); // turn off Right Green LED

  

return switchTestA(digitalRead(17),900);

  

  

}

int main()

{

int switchA;

int switchB;

int flagSwitchA = 0; // sets flag for when switch is pressed and then released

int flagSwitchB = 0;

int player01Score = 0; // player scores start at zero

int player02Score = 0;

  

wiringPiSetupGpio(); // wiringPi setup

pinMode( 22, INPUT);

pinMode( 17, INPUT);

pinMode( 23, OUTPUT);

pinMode( 24, OUTPUT);

pinMode( 25, OUTPUT);

pinMode( 26, OUTPUT);

pinMode( 27, OUTPUT);

  

switchA = digitalRead(22);

switchB = digitalRead(17);

  

do

{

player01Serve();

}

while (flagSwitchA == 0);

  

while(1)

{

  

if (cycleRight() == 0)

{

endGame(); // initiates endgame LED sequence

player01Score++; // adds a point to Player02

printf(" Player 1 Score: %d ", player01Score); // prints scores

printf(" Player 2 Score: %d ", player02Score);

  

}

  

if (cycleRight() == 1)

{

cycleLeft();

}

  

if (cycleLeft() == 0)

{

endGame(); // initiates endgame LED sequence

player02Score++; // adds a point to Player01

printf(" Player 1 Score: %d ", player01Score); // prints scores

printf(" Player 2 Score: %d ", player02Score);

  

player01Serve();

}

  

if (cycleLeft() == 1)

{

cycleRight();

}

  

}

return 0;

}

Explanation / Answer

I have also faced the same problem when developing LCD driver.The control was never going through the delay function.It's actually because the delay function gets optimized by the compiler.So,you can select the optimization level to be low so that the control goes to delay function.Or else there is another way, make the variables in the delay function (dummy variables) volatile so that the delay function won't be optimized .Or else perform some dummy operation in a loop and return a value.

By these 3 ways, delay function can be saved from getting optimized