Click here to Skip to main content
13,704,528 members
Click here to Skip to main content
Add your own
alternative version

Tagged as

Stats

3.6K views
1 download
3 bookmarked
Posted 5 Aug 2018
Licenced CPOL

Quick math game with Arduino

, 6 Aug 2018
Rate this:
Please Sign up or sign in to vote.
Let's make a small Math game with Arduino

Introduction

Math is really a cool subject I'd studied at school. It's like a magic with numbers. But for some people, it's so boring. So I'd like to use Arduino to make them have another opinion with Math. I'm going to make a small game with some simple components. There are a series of numbers have value from 0 to 9. All numbers will be showed on a display. The player must plus those numbers quickly. After showing the numbers, the player will press and submit the answer by using buttons. There are 2 buttons. The former is used to input the answer. The latter is aimed to submit the answer. When pressing the first button, the number to answer will be increase by 1. The player must press the former to have correct numbers as the answer and submit those numbers orderly.  If the answer is correct/incorrect, a green/red led will be lighted. The quantity of number and the duration for each number to display can be adjusted in the code.

For example: the display will be show a series of 10 random numbers and 1 second is the time for each number to show: 5, 6, 1, 3, 7, 8, 9, 1, 2, 4. If the player press 46, the green led will be lighted. If not, the red led will be lighted as the key answer for this series is 46 (5 + 6 + 1 + 3 + 7 + 8 + 9 + 1 + 2 + 4 = 46). The player has to press the first button to get number 4 and press submit button, and then the player has to press that button to get number 6 and press submit button. He will be win.

Material

We need some easy-to-find and cheap components like these:
+ 1 Arduino Uno board
+ 2 leds (green and red)
+ 2 buttons (one for pressing the answer and one for submitting)
+ 1 7-segment display
+ 1K ohm resistors
+ Wires
+ (10uF capacitors to debounce button if you wish)

7-segment display

Before we start, I'd like to make some beginners have a clear mind about this display. The 7-segment display have 2 different kinds, but they're not too distinct. 

Let's see the following illustrations. At first, you can find them similar to each other. In fact, they each have a different way to use.

7-segment display/led has 2 types:

+ Common Anode: All of us have known that LEDs have 2 poles, cathode and anode. In this 7-segment LED, all anodes are connected to the positive terminal, Vcc. To make the LEDs in the 7-segment Leds light, you only need to apply the cathode to the pins of it. It makes the circuit closed, then the led will be lighted. For instance, you would like to make the segment G light, you should put the Vcc into 5V power, put the G pin (in the pinout) into the negative and don't forget a resistor for the Vcc pin.

+ Common Cathode: Contrast with the former, all cathodes are connected to the negative terminal, GND. You need 8 resistors if you want to light all the leds in the 7-segment display while you just need 1 resistor for the Common Anode type. 
To make it clear, I've prepared a short code to test if your display is Common Cathode or Common Anode. Here is an extract from the test code. 

#define sA 7
#define sB 6
#define sC 11
#define sD 12
#define sE 13
#define sF 8
#define sG 9
#define DP 10

int number = 0;

void setup() {
  for (int i = 4; i <= 13; i++)
  {
    pinMode(i, OUTPUT);
  }
  
  Serial.begin(9600);
}

void loop() {
  number = (number + 1) % 10;
  displayNum(number);
  if (number % 2 == 0)
  {
    digitalWrite(DP, 1);
  }
  else 
  {
    digitalWrite(DP, 0);
  }
  delay(1000);
}

void displayNum(int num)
{
  clearAll();
  switch (num)
  {
    case 0: 
    digitalWrite(sA, 1);
    digitalWrite(sB, 1);
    digitalWrite(sC, 1);
    digitalWrite(sD, 1);
    digitalWrite(sE, 1);
    digitalWrite(sF, 1);
    break;

    case 1:
    digitalWrite(sB, 1);
    digitalWrite(sC, 1);
    break;

    case 2:
    digitalWrite(sA, 1);
    digitalWrite(sB, 1);
    digitalWrite(sG, 1);
    digitalWrite(sE, 1);
    digitalWrite(sD, 1);
    break;

You can download the full source code here. It shows numbers from 0 to 9. My display is Commone Cathode so if this code doesn't work for yours, please change line code that turn on the led to turn off and vice versa. And the below picture is the schematic for the code.

Interrupt

In this project, I'm using interrupt for 2 buttons to make the program neat. 

Interrupts are automatic call functions when the system generates an event. These events are set by the microcontroller manufacturer using hardware and are configured in the software by fixed names. Because the interrupt is independent and self-generated when configured, the main program will be simpler. A typical example of interrupts is the millis() function. This function automatically runs with the program and returns an incremental number over time although we do not install it. The millis() function setting is used to interrupt and is automatically configured within the Arduino program code.

Interrupts make the program neat and faster. For example, when checking whether a button is pressed, you usually need to check the button state with the digitalRead() function in the loop() program. With the use of interrupts, simply connect the button to the correct pin that supports interrupts, then the interrupt setting will be generated when the switch state is changed from LOW to HIGH or vice versa. Add a function name to invoke when the interrupt is generated. That is, the variable in the interrupt program will tell us the state of the button.
The number of interrupt pins depends on each microcontroller. With Arduino Uno you only have 2 interrupt pins, Mega 2560 has 6 interrupt pins and Leonardo has 5 interrupt pins. Find out more here.

Simple schematic

Complete this simple circuit to start programming it. You may need debounce buttons.

Program the Arduino using Arduino IDE

I don't mention about the display function again as you can find it in the previous section.

Figure the interrupt pins

When the player press the button, the function inputNum() and submit() will be called. I use RISING as we just call those functions once when it's pressed. When pressing input button, it'll call inputNum() function, plus a variable by 1. I'll explain more about what happen when submitting the answer in next code.

void setup() {
  pinMode(INPUT_BUTTON, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(INPUT_BUTTON), inputNum, RISING);
  pinMode(SUBMIT_BUTTON, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(SUBMIT_BUTTON), submit, RISING);
  Serial.begin(9600);
}

//This function increase the current number by 1 when pressing input button
void inputNum()
{
  if (gameStatus == 2)
  {
    currentNum = (currentNum + 1) % 10; //To make sure that the number is in the range from 0 to 9
  }
}

void submit()
{
  if (gameStatus == 2)
  {
    String temp = String(currentNum);
    answer += temp;
    if (answer.length() - 1 == sResult.length())
    {
      if (answer == sResult)
      {
        digitalWrite(GREEN_LED, 1);
        delay(1000);
        digitalWrite(GREEN_LED, 0);
      }
      else
      {
        digitalWrite(RED_LED, 1);
        delay(1000);
        digitalWrite(RED_LED, 0);
      }
      answer = "";
      result = 0;
      gameStatus = 1;
      currentNum = 0;
    }
  }
}

 

Show random numbers

You can change the amount of number and the time for each number to display easily with two variables, quantity and delayTime. delayTime uses as milliseconds, 1000 milliseconds = 1 second. The result variable is used to plus all the random numbers and used as the key answer. The currentNum is the variable contains the number that the player inputs. If the input button is pressed, currentNum variable will be plus 1. I convert an integer to string to compare the result and the answer that the player submit. When the length of the answer equals the length of the key answer, it'll check if all the number inputted by the player is matched the result or not. 

int quantity = 10;
int delayTime = 1000;
int gameStatus = 1; //1: show random numbers, 2: show current number and wait for submit
int result, currentNum = 0;
String answer = "", sResult;
void loop() {
  switch (gameStatus)
  {
    case 1: //Show random numbers
      result = 0;
      for (int i = 1; i <= quantity; i++)
      {
        int a = random(0, 10); // a variable will be a random number between 0 and 9
        displayNum(a);
        result += a;
        delay(delayTime);
      }
      finishDisplaying();
      gameStatus = 2;
      sResult = String(result);
      break;

    case 2: //Submit the answer
      displayNum(currentNum);
      delay(200);
      break;
  }
}

You can download full source code here. Wire them and upload to understand more.

 

Enjoy the project

Upload it to suitable board and see how it works.

We press the numbers orderly. For instance, your answer is 46. You have to press the left button to get number 4 and press the right button to submit number 4 and continue in the same way to submit number 6.  Let's see the following illustration. It shows how to press to get the number you need.

Debounce button

During the test, you may find it runs unexpectedly. You press the button once but the number increases by 2 or 3 instead of 1. It seems the button is pressed twice but in fact you just press it once. In this circumstance, you should learn more about debounce at here.
There are 2 ways to solve this problem. You can debounce buttons by adding a few code lines or using addition capacitors in the circuit.

Conclusion

Thank you for your reading. This is a fun Math game with Arduino. It helps you to improve your addition skill. How about increasing the quantity of the numbers and decreasing the duration for each number to display to test your speed. You can use this start to make your own game by adding some code lines. I think playing this game with your friends is more interesting and exciting. Let's make and play it for fun.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

ron85262
Software Developer
Vietnam Vietnam
No Biography provided

You may also be interested in...

Comments and Discussions

 
-- There are no messages in this forum --
Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web01-2016 | 2.8.180920.1 | Last Updated 6 Aug 2018
Article Copyright 2018 by ron85262
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid