اختبر مهاراتك في الرياضيات مع الاردوينو

مبتدئ

image_pdf

البرمجة

ارفع الكود البرمجي على لوحة الاردوينو باستخدام برنامج اردوينو 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,
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()
{
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;

} 

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);

}

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);
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()
{
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)

{ 
//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);

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

شرح الكود البرمجي

سنقوم في البداية باستدعاء مكتبة (LiquidCrystal_I2C.h) الخاصة بوحدة i2c والتي تحتوي على مجموعة أوامر برمجية نحتاجها في مشروع تحديد الاتجاهات.

ثم نضيفها للاردوينو IDE.

بتتبع المسار التالي:

Sketch > Include libraries > Add ZIP library 

ونضيف المجلد الذي قمنا بتحميله.

#include <LiquidCrystal_I2C.h>

ثم نستدعي مكتبة لوحة المفاتيح.

ثم نضيفها للاردوينو IDE.

بتتبع المسار التالي:

Sketch > Include libraries > Add ZIP library 

ونضيف المجلد الذي قمنا بتحميله. 

#include <Keypad.h>

نعرف عنوان وحدة i2c.

LiquidCrystal_I2C lcd(0x27, 16, 2);

نهيئ مصفوفة الشاشة الكرستالية لطباعة الوجه الحزين.

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;
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;

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;
}
}

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); 


}

}

في الدالة ()setup نقوم بتهيئة الشاشة الكرستالية استعدادًا لطباعة العمليات الحسابية عليها.

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

}

في الدالة choose يتم الطباعة على الشاشة بمستويات اللعبة تبدأ من المستوى 1 وحتى المستوى 3.

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)
{
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)
{
// 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

بعد اكتمال عملية الرفع يمكنك أن تختبر مهاراتك في الرياضيات.

 لا تنسَ فصل مصدر الطاقة بعد الانتهاء من استخدام النظام.

X
Product added to the cart