[go: up one dir, main page]

0% found this document useful (0 votes)
43 views20 pages

Math Game

This document discusses programming a system to test math skills on an Arduino board. The system will generate random math problems at three different levels and time how long it takes to solve a series of problems. It will use an Arduino board, keypad, and LCD screen. The full code is provided to generate random math equations based on the selected level, display the problems and solutions on the LCD screen, accept input from the keypad, and time how long it takes to solve each problem series.

Uploaded by

lamine mhamed
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
43 views20 pages

Math Game

This document discusses programming a system to test math skills on an Arduino board. The system will generate random math problems at three different levels and time how long it takes to solve a series of problems. It will use an Arduino board, keypad, and LCD screen. The full code is provided to generate random math equations based on the selected level, display the problems and solutions on the LCD screen, accept input from the keypad, and time how long it takes to solve each problem series.

Uploaded by

lamine mhamed
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 20

‫اﺧﺘﺒﺮ ﻣﻬﺎراﺗﻚ ﻓ‪ ‬اﻟﺮﻳﺎﺿﻴﺎت ﻣﻊ اﻻردوﻳﻨﻮ‬

‫ﻣﻘﺪﻣﺔ‬
‫ﻓ‪ ‬ﻫﺬا اﻟﺪرس ﺳﻨﺒﺮﻣﺞ ﻧﻈﺎم ﻳﻘﻴﺲ ﻣﺴﺘﻮى ﻣﻬﺎراﺗﻚ ﻓ‪ ‬اﻟﺮﻳﺎﺿﻴﺎت ﻣﻦ ﺧﻼل ﺳﻠﺴﻠﺔ ﻣﻦ اﻟﻌﻤﻠﻴﺎت اﻟﺮﻳﺎﺿﻴﺔ ﻣﻘﺴﻤﺔ إﻟ‪ 3 ‬ﻣﺴﺘﻮﻳﺎت‬
‫ﻳﻤ‪‬ﻨﻚ اﺧﺘﻴﺎر اﻟﻤﺴﺘﻮى اﻟﻤﻨﺎﺳﺐ ﻟﻚ ﺑﺎﻟﺒﺪاﻳﺔ وﺳﻴﻈﻬﺮ ﻣﺆﻗﺖ ﻳﺤﺴﺐ اﻟﻮﻗﺖ اﻟﻤﺴﺘﻐﺮق ﻟﺤﻞ ﻫﺬه اﻟﺴﻠﺴﻠﺔ‪ ،‬ﺳﻨﺒﺮﻣﺞ اﻟﻨﻈﺎم ﺑﺎﺳﺘﺨﺪام‬
‫ﻟﻮﺣﺔ اﻻردوﻳﻨﻮ وﻟﻮﺣﺔ اﻟﻤﻔﺎﺗﻴﺢ واﻟﺸﺎﺷﺔ اﻟ‪‬ﺮﺳﺘﺎﻟﻴﺔ‪.‬‬

‫اﻟﻤﻮاد واﻷدوات‬

‫‪1/20‬‬
‫‪ ×1‬اردوﻳﻨﻮ اوﻧﻮ‬

‫‪ ×1‬ﺳﻠﻚ اﻻردوﻳﻨﻮ‬

‫‪ ×1‬ﺷﺎﺷﺔ ﻛﺮﺳﺘﺎﻟﻴﺔ‬

‫‪2/20‬‬
‫‪ 40 ×1‬رأس دﺑﻮس‬

‫ﺣﺰﻣﺔ أﺳﻼك ﺗﻮﺻﻴﻞ )ذﻛﺮ‐ ذﻛﺮ(‬

‫ﺣﺰﻣﺔ أﺳﻼك ﺗﻮﺻﻴﻞ )ذﻛﺮ – أﻧﺜ‪(‬‬

‫‪2C / IIC Serial Interface Module ×1‬‬

‫‪3/20‬‬
‫‪ ×1‬ﻟﻮﺣﺔ ﻣﻔﺎﺗﻴﺢ‬

‫ﺗﻮﺻﻴﻞ اﻟﺪاﺋﺮة‬
‫ﻟﻤﻌﺮﻓﺔ اﻟﻤﺰﻳﺪ ﺣﻮل اﻟﺸﺎﺷﺔ اﻟ‪‬ﺮﺳﺘﺎﻟﻴﺔ ﻳﻤ‪‬ﻨﻚ اﻟﺮﺟﻮع ﻟﻠﺪرس اﻟﺘﺤ‪‬ﻢ ﺑﺎﻟﺸﺎﺷﺔ اﻟ‪‬ﺮﺳﺘﺎﻟﻴﺔ ‪.LCD‬‬

‫ﻟﻠﻤﺰﻳﺪ ﺣﻮل ﻟﻮﺣﺔ اﻟﻤﻔﺎﺗﻴﺢ ﻳﻤ‪‬ﻨﻚ اﻟﺮﺟﻮع ﻟﻠﺪرس ﻟﻮﺣﺔ اﻟﻤﻔﺎﺗﻴﺢ ‪.Keypad‬‬

‫‪4/20‬‬
‫اﻟﺒﺮﻣﺠﺔ‬
.IDE ‫ ﻟﻮﺣﺔ اﻻردوﻳﻨﻮ ﺑﺎﺳﺘﺨﺪام ﺑﺮﻧﺎﻣﺞ اردوﻳﻨﻮ‬‫ ﻋﻠ‬‫ﻮد اﻟﺒﺮﻣﺠ‬‫ارﻓﻊ اﻟ‬

#include <Keypad.h>
#include <LiquidCrystal_I2C.h> //LCD library
LiquidCrystal_I2C lcd(0x27, 16, 2);

byte sad[8] =
{
B00000,
B01010,
B01010,
B00000,
B00000,
B01110,

5/20
B10001,
};

unsigned long time=0;


unsigned long inicio=0;
int m, mu=0,md=0;
int s, su=0,sd=0;
int c,cu,cd=0;
byte intento=0;

char level;
boolean modePlay=false;
int cifra_azar;
int numero1=0;
int numero2=0;
int numero3=0;
int temp=0;
int resultado;
String operando="";
String sResultado;
String sLevel;
int largo=0;
boolean activar=false;
boolean temporizar = false;

char cifra_jugador[4]; //Stores the number of the player

String numero_jugador = String(); //Almacena las 4 cifras del jugador


String sNumero_jugador;

int cuenta=0;
int i,j,x;
int puntos,famas=0;
int intentos=0;
int maximo_intentos=10;

const byte ROWS=4;


const byte COLS=4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {13,6,5,4}; //Filas(pines del 9 al 6)
byte colPins[COLS] = {3,2,1,0}; //Columnas (pines del 5 al 2)
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void game_over()

6/20
{
temporizar=false;
modePlay=false;
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Game Over");
lcd.setCursor(0,1);
lcd.print("Time: ");
lcd.print(md);
lcd.print(mu);
lcd.print(":");
lcd.print(sd);
lcd.print(su);
lcd.print(":");
lcd.print(cd);
lcd.print(cu);
}

void generate_random()
{
lcd.clear();
cuenta=0;
sResultado="";
sNumero_jugador="";

randomSeed(analogRead(analogRead(0)));

switch(level)
{
case '1':

numero1=random(1,11); //Generates a number between un número aleatorio entre 1 and


10
numero2=random(1,11); //Generates a number between un número aleatorio entre 1 and
10
break;

case '2':

numero1=random(50,100); //Generates a number between un número aleatorio entre 50


and 99
numero2=random(1,11); //Generates a number between un número aleatorio entre 1 and
10
break;

case '3':

numero1=random(50,100); //Generates a number between un número aleatorio entre 1 y


99
numero2=random(50,100); //Generates a number between un número aleatorio entre 1 y
10
break;

7/20
}

numero3=random(1,5); //Generates a number between 1 and 4

switch(numero3)
{
case 1:
operando="+";
resultado=numero1+numero2;
break;
case 2:
operando="-";
if(numero1<numero2)
{
temp=numero1;
numero1=numero2;
numero2=temp;
}
resultado=numero1-numero2;

break;
case 3:
operando="*";
resultado=numero1*numero2;
break;
case 4:
operando="/";
resultado=numero1%numero2;
if(resultado!=0) //If not is zero the mod
{
operando="*";
resultado=numero1*numero2;
}
else //The mod is zero
{
resultado=numero1/numero2;
}
}

sResultado= String(resultado);

lcd.setCursor(0,0);
lcd.print(numero1);
lcd.setCursor(2,0);
lcd.print(operando);
lcd.setCursor(3,0);
lcd.print(numero2);
lcd.setCursor(12,1);
lcd.print(cuenta);

lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);

8/20
}

void timer()
{

if(modePlay==true)
{
time = millis()-inicio;

m=(time/1000)/60; //Minutes
mu=m%10;
md=(m-mu)/10;

s=(time/1000)%60; //Seconds
su=s%10;
sd=(s-su)/10;

c=(time/100)%60;
cu=c%10;
cd=(c-cu)/10;

lcd.setCursor(8,0);
lcd.print(md);
lcd.print(mu);
lcd.print(":");
lcd.print(sd);
lcd.print(su);
lcd.print(":");
lcd.print(cd);
lcd.print(cu);

void setup()
{
// put your setup code here, to run once:
lcd.createChar(1,sad);
lcd.begin();
choose(); //Displays the select level mode

//********************************************************
void verificar()
{
if(sNumero_jugador==sResultado)
{

lcd.setCursor(6,0);

9/20
lcd.print("G");

intento=intento+1;

generate_random();

else

lcd.setCursor(0,1);

cuenta=0;

sNumero_jugador="";

lcd.setCursor(6,1);
lcd.write(byte(1)); //this writes the sad face

lcd.setCursor(8,1);
lcd.print("Try:");
lcd.print(intento);
lcd.print("/10");

if(intento==maximo_intentos)
{
game_over(); // Ends the game
}

void choose()
{
modePlay=false;
intento=0;
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Select level");
lcd.setCursor(0,1);
lcd.print("1-E 2-M 3-H");

void conteo()

10/20
{
lcd.clear();

lcd.setCursor(4,0);

lcd.print(sLevel);

delay(300);

lcd.clear();

for(int x=3;x>=1;x--)
{
lcd.setCursor(8,0);

lcd.print(x);

delay(300);

lcd.clear();

lcd.setCursor(7,0);

lcd.print("Go");

delay(600);

generate_random();

modePlay=true;

if(activar==false)
{
inicio=millis();
activar=true;
}
}

void loop()
{
timer();

// put your main code here, to run repeatedly:

char key = keypad.getKey();

if(key)

11/20
{
//If is the select level display
if(modePlay==false)
{
if(key=='1' || key=='2' || key=='3')
{
level=key;

lcd.clear();

lcd.setCursor(5,1);

switch(level)
{
case '1':
sLevel="Easy Level";
break;
case '2':
sLevel="Medium Level";
break;
case '3':
sLevel="Hard Level";
break;

} //end switch

conteo();

} // end IF key select level

} //end IF mode play off

else
//Mode player

temporizar=true;

if(activar==false)
{
inicio=millis();
activar=true;
lcd.clear();
}

if(key!='A' && key!='B' && key!='C' && key!='D')


{

cifra_jugador[cuenta] = key;

numero_jugador = String(key);

12/20
sNumero_jugador=sNumero_jugador+numero_jugador;

lcd.setCursor(0+cuenta,1);

lcd.print(cifra_jugador[cuenta]);

cuenta++;

largo=sResultado.length();

if(cuenta==largo)
{
// lcd.setCursor(10,1);
verificar();
}

} //End if key!=

} // End else mode player

if(key=='A')
{
modePlay=false;
inicio=millis();
activar=false;
choose();
}

} //End if Key main

} //End loop

‫ﻮد اﻟﺒﺮﻣﺠ‬‫ﺷﺮح اﻟ‬


‫ ﻣﺠﻤﻮﻋﺔ أواﻣﺮ ﺑﺮﻣﺠﻴﺔ ﻧﺤﺘﺎﺟﻬﺎ ﻓ‬‫ ﺗﺤﺘﻮي ﻋﻠ‬‫ واﻟﺘ‬i2c ‫( اﻟﺨﺎﺻﺔ ﺑﻮﺣﺪة‬LiquidCrystal_I2C.h) ‫ﺘﺒﺔ‬‫ اﻟﺒﺪاﻳﺔ ﺑﺎﺳﺘﺪﻋﺎء ﻣ‬‫ﺳﻨﻘﻮم ﻓ‬
.‫ﻣﺸﺮوع ﺗﺤﺪﻳﺪ اﻻﺗﺠﺎﻫﺎت‬

#include <LiquidCrystal_I2C.h>

.‫ﺘﺒﺔ ﻟﻮﺣﺔ اﻟﻤﻔﺎﺗﻴﺢ‬‫ ﻣ‬‫ﺛﻢ ﻧﺴﺘﺪﻋ‬

#include <Keypad.h>

.i2c ‫ﻧﻌﺮف ﻋﻨﻮان وﺣﺪة‬

LiquidCrystal_I2C lcd(0x27, 16, 2);

13/20
.‫ﺮﺳﺘﺎﻟﻴﺔ ﻟﻄﺒﺎﻋﺔ اﻟﻮﺟﻪ اﻟﺤﺰﻳﻦ‬‫ ﻣﺼﻔﻮﻓﺔ اﻟﺸﺎﺷﺔ اﻟ‬‫ﻧﻬﻴ‬

byte sad[8] =
{
B00000,
B01010,
B01010,
B00000,
B00000,
B01110,
B10001,
};

.‫ ﺳﻨﺤﺘﺎﺟﻬﺎ ﺑﺎﻟﻤﺸﺮوع‬‫ﻧﻘﻮم ﺑﺘﻬﻴﺌﺔ اﻟﻤﺘﻐﻴﺮات اﻟﺘ‬

unsigned long time=0;


unsigned long inicio=0;
int m, mu=0,md=0;
int s, su=0,sd=0;
int c,cu,cd=0;
byte intento=0;

char level;
boolean modePlay=false;
int cifra_azar;
int numero1=0;
int numero2=0;
int numero3=0;
int temp=0;
int resultado;
String operando="";
String sResultado;
String sLevel;
int largo=0;
boolean activar=false;
boolean temporizar = false;

char cifra_jugador[4]; //Stores the number of the player

String numero_jugador = String(); //Almacena las 4 cifras del jugador


String sNumero_jugador;

int cuenta=0;
int i,j,x;
int puntos,famas=0;
int intentos=0;
int maximo_intentos=10;

const byte ROWS=4;


const byte COLS=4;

14/20
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {13,6,5,4}; //Filas(pines del 9 al 6)
byte colPins[COLS] = {3,2,1,0}; //Columnas (pines del 5 al 2)
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

.‫ ﺗﺨﺒﺮﻧﺎ ﺑﺎﻧﺘﻬﺎء اﻟﻠﻌﺒﺔ وﻇﻬﻮر اﻟﻮﻗﺖ اﻟﻤﺴﺘﻐﺮق ﻹﺗﻤﺎم اﻟﻠﻌﺒﺔ ﻣﻦ ﻗﺒﻞ اﻟﻼﻋﺐ‬‫ واﻟﺘ‬game_over ‫ داﻟﺔ‬‫ﻧﻬﻴ‬

void game_over()
{
temporizar=false;
modePlay=false;
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Game Over");
lcd.setCursor(0,1);
lcd.print("Time: ");
lcd.print(md);
lcd.print(mu);
lcd.print(":");
lcd.print(sd);
lcd.print(su);
lcd.print(":");
lcd.print(cd);
lcd.print(cu);
}

.‫ﻞ ﺗﻠﻘﺎﺋ‬‫ ﺗﻘﻮم ﺑﻄﺒﺎﻋﺔ اﻟﺪوال واﻷرﻗﺎم ﺑﺸ‬‫ واﻟﺘ‬generate_random ‫ داﻟﺔ‬‫ﻧﻬﻴ‬

void generate_random()
{
lcd.clear();
cuenta=0;
sResultado="";
sNumero_jugador="";

randomSeed(analogRead(analogRead(0)));

switch(level)
{
case '1':

numero1=random(1,11); //Generates a number between un número aleatorio


entre 1 and 10
numero2=random(1,11); //Generates a number between un número aleatorio
entre 1 and 10
break;

15/20
case '2':

numero1=random(50,100); //Generates a number between un número aleatorio


entre 50 and 99
numero2=random(1,11); //Generates a number between un número aleatorio
entre 1 and 10
break;

case '3':

numero1=random(50,100); //Generates a number between un número aleatorio


entre 1 y 99
numero2=random(50,100); //Generates a number between un número aleatorio
entre 1 y 10
break;

numero3=random(1,5); //Generates a number between 1 and 4

switch(numero3)
{
case 1:
operando="+";
resultado=numero1+numero2;
break;
case 2:
operando="-";
if(numero1<numero2)
{
temp=numero1;
numero1=numero2;
numero2=temp;
}
resultado=numero1-numero2;

break;
case 3:
operando="*";
resultado=numero1*numero2;
break;
case 4:
operando="/";
resultado=numero1%numero2;
if(resultado!=0) //If not is zero the mod
{
operando="*";
resultado=numero1*numero2;
}
else //The mod is zero
{
resultado=numero1/numero2;
}

16/20
}

sResultado= String(resultado);

lcd.setCursor(0,0);
lcd.print(numero1);
lcd.setCursor(2,0);
lcd.print(operando);
lcd.setCursor(3,0);
lcd.print(numero2);
lcd.setCursor(12,1);
lcd.print(cuenta);

lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);

.‫ اﻟﻤﺆﻗﺖ ﻟﺒﺪء ﺣﺴﺎب اﻟﻮﻗﺖ أﺛﻨﺎء اﻟﻠﻌﺐ‬‫ ﻧﻬﻴ‬timer ‫ داﻟﺔ‬‫ﻓ‬

void timer()
{

if(modePlay==true)
{
time = millis()-inicio;

m=(time/1000)/60; //Minutes
mu=m%10;
md=(m-mu)/10;

s=(time/1000)%60; //Seconds
su=s%10;
sd=(s-su)/10;

c=(time/100)%60;
cu=c%10;
cd=(c-cu)/10;

lcd.setCursor(8,0);
lcd.print(md);
lcd.print(mu);
lcd.print(":");
lcd.print(sd);
lcd.print(su);
lcd.print(":");
lcd.print(cd);
lcd.print(cu);

17/20
}

.‫ا ﻟﻄﺒﺎﻋﺔ اﻟﻌﻤﻠﻴﺎت اﻟﺤﺴﺎﺑﻴﺔ ﻋﻠﻴﻬﺎ‬‫ﺮﺳﺘﺎﻟﻴﺔ اﺳﺘﻌﺪاد‬‫ ﻧﻘﻮم ﺑﺘﻬﻴﺌﺔ اﻟﺸﺎﺷﺔ اﻟ‬setup() ‫ اﻟﺪاﻟﺔ‬‫ﻓ‬

void setup()
{
// put your setup code here, to run once:
lcd.createChar(1,sad);
lcd.begin();
choose(); //Displays the select level mode

.3 ‫ اﻟﻤﺴﺘﻮى‬‫ وﺣﺘ‬1 ‫ اﻟﺸﺎﺷﺔ ﺑﻤﺴﺘﻮﻳﺎت اﻟﻠﻌﺒﺔ ﺗﺒﺪأ ﻣﻦ اﻟﻤﺴﺘﻮى‬‫ ﻳﺘﻢ اﻟﻄﺒﺎﻋﺔ ﻋﻠ‬choose ‫ اﻟﺪاﻟﺔ‬‫ﻓ‬

void choose()
{
modePlay=false;
intento=0;
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Select level");
lcd.setCursor(0,1);
lcd.print("1-E 2-M 3-H");

.‫ اﻟﺸﺎﺷﺔ وأﺧﺬ اﻟﻘﻴﻢ ﻣﻦ ﻟﻮﺣﺔ اﻟﻤﻔﺎﺗﻴﺢ‬‫ا ﻟﻄﺒﺎﻋﺔ ﻣﺪﻟﻮﻻﺗﻬﺎ ﻋﻠ‬‫ ﻳﺘﻢ ﻣﻨﺎداة اﻟﺪوال اﻟﺴﺎﺑﻘﺔ اﺳﺘﻌﺪاد‬main ‫ اﻟﺪاﻟﺔ‬‫ﻓ‬

void loop()
{
timer();

// put your main code here, to run repeatedly:

char key = keypad.getKey();

if(key)

{
//If is the select level display
if(modePlay==false)
{
if(key=='1' || key=='2' || key=='3')
{
level=key;

lcd.clear();

lcd.setCursor(5,1);

switch(level)

18/20
{
case '1':
sLevel="Easy Level";
break;
case '2':
sLevel="Medium Level";
break;
case '3':
sLevel="Hard Level";
break;

} //end switch

conteo();

} // end IF key select level

} //end IF mode play off

else
//Mode player

temporizar=true;

if(activar==false)
{
inicio=millis();
activar=true;
lcd.clear();
}

if(key!='A' && key!='B' && key!='C' && key!='D')


{

cifra_jugador[cuenta] = key;

numero_jugador = String(key);

sNumero_jugador=sNumero_jugador+numero_jugador;

lcd.setCursor(0+cuenta,1);

lcd.print(cifra_jugador[cuenta]);

cuenta++;

largo=sResultado.length();

if(cuenta==largo)
{

19/20
// lcd.setCursor(10,1);
verificar();
}

} //End if key!=

} // End else mode player

if(key=='A')
{
modePlay=false;
inicio=millis();
activar=false;
choose();
}

} //End if Key main

} //End loop

.‫ اﻟﺮﻳﺎﺿﻴﺎت‬‫ﻨﻚ أن ﺗﺨﺘﺒﺮ ﻣﻬﺎراﺗﻚ ﻓ‬‫ﺑﻌﺪ اﻛﺘﻤﺎل ﻋﻤﻠﻴﺔ اﻟﺮﻓﻊ ﻳﻤ‬

.‫ ﻓﺼﻞ ﻣﺼﺪر اﻟﻄﺎﻗﺔ ﺑﻌﺪ اﻻﻧﺘﻬﺎء ﻣﻦ اﺳﺘﺨﺪام اﻟﻨﻈﺎم‬‫ﻻ ﺗﻨﺲ‬

20/20

You might also like