Introduction: Calculando Cuantos Dias Has Vivido Con Arduino

About: Aprende paso a paso con nosotros como utilizar toda clase de electronicos. En este sitio encontraras fotos, videos, codigos, esquemas y toda clase de información para facilitar tu aprendizaje. Recuerda comprar…

El proyecto consiste un realizar un programa capas de calcular la cantidad de días transcurridos de una fecha a otra fecha suponiendo que la primera fecha será el día de su nacimiento y la segunda fecha sera el día actual. El programa debe tomar en cuenta los años bisiestos.

Para esto utilizamos los siguiente materiales:

Step 1: Conecta

Conecta el Teclado Matrical 4x4 como se muestra en la imagen, de el pin 2 a el pin 9 en orden. Los pines del 2 al 5 corresponden a las filas y los pines del 6 al 9 corresponden a las columnas. En este caso como utilizamos un Modulo Serial I2C para el display, alimentaremos el display con 5v y conectaremos el modulo a las salidas SCL(A5) y SDA(A4). Recuerda que los pines SCL y SDA varian dependiendo de la placa Arduino que utilizas. Para mas detalles sobre como utilizar el Modulo Serial I2C visitia este tutorial: Módulo Serial para Display LCD con Arduino

Step 2: Fórmula

Para determinar con precisión la cantidad de días transcurridos de una fecha determinada a otra utilizaremos lo que se conoce como año tropical. Se denomina año tropical al tiempo preciso para aumentar la longitud media del Sol en 360 grados sobre la eclíptica; es decir, en completar una vuelta completa. Su duración es de 365,242198 días de tiempo solar medio (365 días 5 h 48 m 45,9 s).

Tomando en cuenta que un año tropical es igual a 365.242189 días aplicaremos la siguiente fórmula, donde:

  • diac = día de cumpleaños
  • mesc = mes de cumpleaños
  • anosc = año de cumpleaños
  • diah = día de hoy
  • mesh = mes de hoy
  • anosh = año de hoy
  • total = total de días transcurridos

Formula:

total=((anosh-anosc)*(365.242189))+((diah-diac)+((mesh-mesc)*(365.242189/12)));

Step 3: Botones

Utilizamos los siguiente botones para controlar el programa

  • A - Sirve para Iniciar
  • B - Cada que completa un paso, oprimes B para pasar al siguiente.
  • C - En caso de introducir mal un valor puedes borrar oprimiendo C y volveras a repetir el paso
  • * - Sirve para reiniciar el programa

Step 4: Código

El siguiente código fue utilizado con la placa Arduino Uno e incluye algunos comentarios para entender mejor su funcionamiento. Recomiendo que descargues el código y que lo analices desde el programa. Recuerda descargar las librerias necesarias para utilizar el Teclado Matrical 4x4 y el Modulo Serial I2C. descargar código

Libreria al final de las viñetas:

///////////////////¿Cuantos días has vivido?<br>/*
Programa para calcular los dias transcurridos de una fecha determinada a otra.
Materiales:
-Teclado Matrical 4x4
-Display LCD 16x2 con Modulo Serial I2C
-Placa Arduino Aunque este código puede ser reducido, en este caso esta escrito
de tal forma que se puedan identificar facilmente los pasos que
se siguieron para llegar al resultado final. La formula que se utilizó 
para determinar la cantidad de días transcurridos toma en cuenta los 
años bisietos y otras variantes. Recuerda descargar las librerias Keypad 
y Liquid Crystal para Modulo serial I2C.
*/
#include <Keypad.h>
#include <Wire.h>                  
#include <LiquidCrystal_I2C.h>
    
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
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] = {2,3,4,5}; //Filas
byte colPins[COLS] = {6,7,8,9}; //Columnas
Keypad keypad = Keypad( makeKeymap(keys), rowPins, 
colPins, ROWS, COLS );
int val=0;//Valor de referencia
int cuadro= 1023;// El numero 1023 dibuja un cuadro en el LCD
//////////////Bases para el calculo
int diah= 0;// Dia de hoy
int mesh= 0;//Mes de Hoy
int anosh= 0;//Año de hoy
int diac= 0;//Dia de cumple
int mesc= 0;//Mes de cumple
int anosc= 0;//Año de cumple
int anosvividos= 0;//Años vividos
int total= 0;//Total de dias vividos
///////////////////////////////////////////////////////////////////////////////VOID SETUP
void setup(){    
lcd.begin(16,2);//Arranca LCD
}
///////////////////////////////////////////////////////////////////////////////VOID LOOP
void loop(){
char key = keypad.getKey();
////////////////////////////Inicio
if (val == 0){//si val es igual a 0 entonces..
lcd.setCursor(1,0);             
lcd.print("Oprime A para");
lcd.setCursor(4,1);            
lcd.print("iniciar");
}
//////////////////////////////////BORRAR FECHA
if(key && val==1 | val==2 |val==3 | val==4 | val==5 |val==6 | val==7 | val==8 | val==9) {//Si se oprima la tecla C y val esta en alguno de los valores del 1 al 9 entonces..
switch (key)
{
case 'C':
val= 1;
diah=0;
mesh=0;
anosh=0;
lcd.clear();
lcd.setCursor(1,0);           
lcd.print("Fecha de hoy:");
lcd.setCursor(2,1);            
lcd.print("dd/mm/aaaa");
break;
}
}
//////////////////////////////////INGRESA FECHA DE HOY
if(key && val==0) {//Si val es igual a 0 entonces..
switch (key)
{
case 'A'://Al oprimir la letra A el display escribe..
val= 1;//val cambia a 1
lcd.clear();
lcd.setCursor(2,0);           
lcd.print("Fecha de hoy:");
lcd.setCursor(2,1);            
lcd.print("dd/mm/aaaa");
break;
}
}
//////////////////////////////////PRIMER NUMERO DIAH
if(key && val==1) {//Si val es 1 entonces..
 switch (key)
{
case '0'://al escribir el numero 0
lcd.setCursor(2,1);            
lcd.print(key);//El display escribe el numero que se oprimio
val= 2;//el valor cambia a 2
diah=diah+0;// se suman 0 dias a los dias
break;
case '1':
lcd.setCursor(2,1);            
lcd.print(key);
val= 2;
diah=diah+10;
break;
case '2':
lcd.setCursor(2,1);            
lcd.print(key);
val= 2;
diah=diah+20;
break;
case '3':
lcd.setCursor(2,1);            
lcd.print(key);
val= 2;
diah=diah+30;
break;
}
}
//////////////////////////////////////SEGUNDO NUMERO DIAH
else if(key && val==2) {
switch (key)
{
case '0':
val= 3;
diah=diah+0;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '1':
val= 3;
diah=diah+1;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '2':
val= 3;
diah=diah+2;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '3':
val= 3;
diah=diah+3;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '4':
val= 3;
diah=diah+4;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '5':
val= 3;
diah=diah+5;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '6':
val= 3;
diah=diah+6;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '7':
val= 3;
diah=diah+7;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '8':
val= 3;
diah=diah+8;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '9':
val= 3;
diah=diah+9;
lcd.setCursor(3,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////PRIMER NUMERO MESH
else if(key && val==3) {
switch (key)
{
case '0':
val= 4;
lcd.setCursor(5,1);           
lcd.print(key);
break;
case '1':
val= 4;
mesh=mesh+10;
lcd.setCursor(5,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////SEGUNDO NUMERO MESH
else if(key && val==4) {
switch (key)
{
case '0':
val= 5;
mesh= mesh+0;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '1':
val= 5;
mesh= mesh+1;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '2':
val= 5;
mesh= mesh+2;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '3':
val= 5;
mesh= mesh+3;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '4':
val= 5;
mesh= mesh+4;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '5':
val= 5;
mesh= mesh+5;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '6':
val= 5;
mesh= mesh+6;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '7':
val= 5;
mesh= mesh+7;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '8':
val= 5;
mesh= mesh+8;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '9':
val= 5;
mesh= mesh+9;
lcd.setCursor(6,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////PRIMER NUMERO AÑO
else if(key && val==5) {
switch (key)
{
case '1':
val= 6;
anosh= anosh+1000;
lcd.setCursor(8,1);           
lcd.print(key);
break;
case '2':
val= 6;
anosh= anosh+2000;
lcd.setCursor(8,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////SEGUNDO NUMERO AÑOH
else if(key && val==6) {
switch (key)
{
case '0':
val= 7;
lcd.setCursor(9,1);           
lcd.print(key);
break;
case '9':
val= 7;
anosh=anosh+900;
lcd.setCursor(9,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////TERCER NUMERO AÑOH
else if(key && val==7) {
switch (key)
{
case '0':
val= 8;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '1':
val= 8;
anosh=anosh+10;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '2':
val= 8;
anosh=anosh+20;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '3':
val= 8;
anosh=anosh+30;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '4':
val= 8;
anosh=anosh+40;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '5':
val= 8;
anosh=anosh+50;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '6':
val= 8;
anosh=anosh+60;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '7':
val= 8;
anosh=anosh+45;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '8':
val= 8;
anosh=anosh+80;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '9':
val= 8;
anosh=anosh+90;
lcd.setCursor(10,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////CUARTO NUMERO AÑOH
else if(key && val==8) {
switch (key)
{
case '0':
val= 9;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '1':
val= 9;
anosh=anosh+1;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '2':
val= 9;
anosh=anosh+2;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '3':
val= 9;
anosh=anosh+3;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '4':
val= 9;
anosh=anosh+4;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '5':
val= 9;
anosh=anosh+5;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '6':
val= 9;
anosh=anosh+6;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '7':
val= 9;
anosh=anosh+7;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '8':
val= 9;
anosh=anosh+8;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '9':
val= 9;
anosh=anosh+9;
lcd.setCursor(11,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////BORRAR FECHA DE NACIMIENTO
if(key && val==10 | val==11 |val==12 | val==13 | val==14 |val==15 | val==16 | val==17 | val==18) {
switch (key)
{
case 'C':
val= 10;
diac=0;
mesc=0;
anosc=0;
lcd.clear();
lcd.setCursor(2,0);           
lcd.print("Nacimiento:");
lcd.setCursor(2,1);            
lcd.print("dd/mm/aaaa");
break;
}
}
//////////////////////////////////INGRESA FECHA DE NACIMIENTO////////////////////////////////
if(key && val==9) {
switch (key)
{
case 'B':
val= 10;
lcd.clear();
lcd.setCursor(2,0);           
lcd.print("Nacimiento:");
lcd.setCursor(2,1);            
lcd.print("dd/mm/aaaa");
break;
}
}
//////////////////////////////////PRIMER NUMERO DIAC
if(key && val==10) {
 switch (key)
{
case '0':
lcd.setCursor(2,1);            
lcd.print(key);
val= 11;
diac=diac+0;
break;
case '1':
lcd.setCursor(2,1);            
lcd.print(key);
val= 11;
diac=diac+10;
break;
case '2':
lcd.setCursor(2,1);            
lcd.print(key);
val= 11;
diac=diac+20;
break;
case '3':
lcd.setCursor(2,1);            
lcd.print(key);
val= 11;
diac=diac+30;
break;
}
}
//////////////////////////////////////SEGUNDO NUMERO DIAC
else if(key && val==11) {
switch (key)
{
case '0':
val= 12;
diac=diac+0;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '1':
val= 12;
diac=diac+1;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '2':
val= 12;
diac=diac+2;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '3':
val= 12;
diac=diac+3;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '4':
val= 12;
diac=diac+4;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '5':
val= 12;
diac=diac+5;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '6':
val= 12;
diac=diac+6;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '7':
val= 12;
diac=diac+7;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '8':
val= 12;
diac=diac+8;
lcd.setCursor(3,1);           
lcd.print(key);
break;
case '9':
val= 12;
diac=diac+9;
lcd.setCursor(3,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////PRIMER NUMERO MESC
else if(key && val==12) {
switch (key)
{
case '0':
val= 13;
lcd.setCursor(5,1);           
lcd.print(key);
break;
case '1':
val= 13;
mesc=mesc+10;
lcd.setCursor(5,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////SEGUNDO NUMERO MESC
else if(key && val==13) {
switch (key)
{
case '0':
val= 14;
mesc= mesc+0;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '1':
val= 14;
mesc= mesc+1;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '2':
val= 14;
mesc= mesc+2;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '3':
val= 14;
mesc= mesc+3;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '4':
val= 14;
mesc= mesc+4;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '5':
val= 14;
mesc= mesc+5;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '6':
val= 14;
mesc= mesc+6;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '7':
val= 14;
mesc= mesc+7;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '8':
val= 14;
mesc= mesc+8;
lcd.setCursor(6,1);           
lcd.print(key);
break;
case '9':
val= 14;
mesc= mesc+9;
lcd.setCursor(6,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////PRIMER NUMERO AÑOC
else if(key && val==14) {
switch (key)
{
case '1':
val= 15;
anosc= anosc+1000;
lcd.setCursor(8,1);           
lcd.print(key);
break;
case '2':
val= 15;
anosc= anosc+2000;
lcd.setCursor(8,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////SEGUNDO NUMERO AÑOC
else if(key && val==15) {
switch (key)
{
case '0':
val= 16;
lcd.setCursor(9,1);           
lcd.print(key);
break;
case '9':
val= 16;
anosc=anosc+900;
lcd.setCursor(9,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////TERCER NUMERO AÑOC
else if(key && val==16) {
switch (key)
{
case '0':
val= 17;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '1':
val= 17;
anosc=anosc+10;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '2':
val= 17;
anosc=anosc+20;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '3':
val= 17;
anosc=anosc+30;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '4':
val= 17;
anosc=anosc+40;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '5':
val= 17;
anosc=anosc+50;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '6':
val= 17;
anosc=anosc+60;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '7':
val= 17;
anosc=anosc+45;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '8':
val= 17;
anosc=anosc+80;
lcd.setCursor(10,1);           
lcd.print(key);
break;
case '9':
val= 17;
anosc=anosc+90;
lcd.setCursor(10,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////CUARTO NUMERO AÑOC
else if(key && val==17) {
switch (key)
{
case '0':
val= 18;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '1':
val= 18;
anosc=anosc+1;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '2':
val= 18;
anosc=anosc+2;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '3':
val= 18;
anosc=anosc+3;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '4':
val= 18;
anosc=anosc+4;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '5':
val= 18;
anosc=anosc+5;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '6':
val= 18;
anosc=anosc+6;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '7':
val= 18;
anosc=anosc+7;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '8':
val= 18;
anosc=anosc+8;
lcd.setCursor(11,1);           
lcd.print(key);
break;
case '9':
val= 18;
anosc=anosc+9;
lcd.setCursor(11,1);           
lcd.print(key);
break;
}
}
//////////////////////////////////CALCULANDO
else if(key && val==18) {
switch (key)
{
case 'B':
val= 20;
lcd.clear();
lcd.setCursor(2,0);           
lcd.print("Calculando...");
lcd.setCursor(0,1);           
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.clear();
lcd.setCursor(2,0);           
lcd.print("Calculando...");
lcd.setCursor(0,1);           
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.clear();
lcd.setCursor(2,0);           
lcd.print("Calculando...");
lcd.setCursor(0,1);           
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
lcd.write(cuadro);
delay (45);
break;
}
}
//////////////////////////////////Calculo
total=((anosh-anosc)*(365.242189))+((diah-diac)+((mesh-mesc)*(365.242189/12)));// Formula par determinar los dias 
anosvividos=anosh-anosc;
//////////////////////////////////USTED HA VIVIDO
if(val==20 && anosvividos <=89) {//Si los años vividos son menos que 89 y val es igual a 20 entonces...
val= 21;
lcd.clear();
lcd.setCursor(0,0);           
lcd.print("Usted ha vivido:");
lcd.setCursor(2,1);           
lcd.print(total);
lcd.setCursor(9,1);           
lcd.write("dias");
} else if (val==20){// De lo contrarios, es decir si los años ingresados son mayores que 89 entonces..
val= 21;
lcd.clear();
lcd.setCursor(1,0);           
lcd.print("Usted deberia");
lcd.setCursor(1,1);           
lcd.write("estar muerto");
}
//////////////////////////////////RESET
if(key) {//Volvemos a poner todos los valores en 0 para que inicie de nuevo
switch (key)
{
case '*':
lcd.clear();
diah= 0;
mesh= 0;
anosh= 0;
diac= 0;
mesc= 0;
anosc= 0;
anosvividos= 0;
total= 0;
val= 0;
break;
}
}
//////////////////////////////////FIN
}
//ElectroCrea.com