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