Paso 4: Código
El siguiente código fue utilizado con la placa Arduino Uno e incluye algunos comentarios para entender mejor su funcionamiento. Recomiendo descargues el código y que lo analices desde el programa. Recuerda descargar las librerias necesarias para utilizar el Teclado Matrical 4 x 4 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