Introduction: Calculando Cuantos Dias Has Vivido Con Arduino
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:
- Caja para proyecto (Steren)
- Arduino Uno
- Teclado Matrical 4x4
- Display 16x2
- Módulo serial I2C para Display LCD (sirve para controlar el display con solo 2 pines)
- DC Hembra con rosca
- Fuente de 5v.
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