include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Servo.h>
//SE AGREGA LIBRERÍAS PARA RTC
#include <ThreeWire.h>
#include <RtcDS1302.h>
//SE CREA Y CONFIGURA OBJETO PARA MANEJAR RTC
ThreeWire myWire(4,5,2); //PINES IO, SCLK, CE -> DE RTC DS1302
RtcDS1302<ThreeWire> Rtc(myWire);
#define BTN_UP1 0
#define BTN_UP 2
#define BTN_DOWN 3
#define tMAX 3 //Tareas maximas en este caso vale 1 por que el cero cuenta
int dd[30]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30};
int mm[12]={1,2,3,4,5,6,7,8,9,10,11,12};
int yy[10]={23,24,25,26,27,28,29,30,31,32};
char info[120];
int h_u=0,h_d=0,m_u=0,m_d=0;
//arreglos para guardar horas y minutos de los horarios de los 4 medicamentos
int med1_h[28],med2_h[28],med3_h[28],med4_h[28];
int med1_m[28],med2_m[28],med3_m[28],med4_m[28];
const byte rowsCount = 4;
const byte columsCount = 4;
int D_EEPROM=2;
//variables utilizadas para cambiar pagina,identificar dia de la semana y el medicamento
int pag=1,iden_sem,num_med=0;
int med=0,j=0,dia;
//valores de arreglo para limites en la verificacion de horas y despacho de medicamento
//int d=0,e=0,f=0,g=0,b=0;
byte d0=0,e0=0,f0=0,g0=0;
byte d4=4,e4=4,f4=4,g4=4;
byte d8=8,e8=8,f8=8,g8=8;
byte d12=12,e12=12,f12=12,g12=12;
byte d16=16,e16=16,f16=16,g16=16;
byte d20=20,e20=20,f20=20,g20=20;
byte d24=24,e24=24,f24=24,g24=24;
//constante utilizadas para guardar tados en los arreglos de los medicamentos de horas
//y minutos en la funcion almacena_med
byte c1=0,c2=0,c3=0,c4=0;
byte c5=4,c6=4,c7=4,c8=4;
byte c9=8,c10=8,c11=8,c12=8;
byte c13=12,c14=12,c15=12,c16=12;
byte c17=16,c18=16,c19=16,c20=16;
byte c21=20,c22=20,c23=20,c24=20;
byte c25=24,c26=24,c27=24,c28=24;
//Definimos nuesra keypad
char keys[rowsCount][columsCount] = {
{ '1','2','3', 'A' },
{ '4','5','6', 'B' },
{ '7','8','9', 'C' },
{ '*','0','#', 'D' }
};
//definicion para control de servomotores
Servo uno;
Servo dos;
Servo tres;
Servo cuatro;
// Figura del cursor flecha
byte cursorArrow[8] = {B10000, B11000, B11100, B11110, B11100, B11000, B10000};
// Figura del cursor carita feliz
byte check[8] ={0x0, 0x9, 0x9, 0x0, 0x9, 0x6, 0x0, 0x0};
// Figura del cursor carita triste
byte bad[8] ={0x0, 0x9, 0x9, 0x0, 0x6, 0x9, 0x0, 0x0};
const byte rowPins[rowsCount] = { 13,12,11,10 };
const byte columnPins[columsCount] = { 9,8,7,6 };
LiquidCrystal_I2C lcd(0x27,20,4); //Dirección 0x27 y 16 columnas x 2 filas
Keypad keypad = Keypad(makeKeymap(keys), rowPins, columnPins, rowsCount, columsCount);
char buttonPresed,letra;
//INICIALIZACION DE PANTALLA LCD, TECLADO MATRICIAL
void setup() {
// SE INICAR MONITOR SERIE E IMPRIME FECHA Y HORA
uno.attach(14);
dos.attach(15);
tres.attach(16);
cuatro.attach(17);
Serial.begin(57600);
Rtc.Begin();// SE INICIALIZA RTC
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);//SE CONFIGURA FECHA Y HORA ACTUAL
printDateTime(compiled); //SE IMPRIME FECHA Y HORA
Rtc.SetDateTime(compiled);
lcd.init();// Inicializar el LCD
lcd.backlight();//Encender la luz de fondo.
lcd.clear();
// MENSAJE DE APERTURA, SOLO SE VIZUALIZARA UNA VEZ
lcd.print(" Bienvenidos a ");
lcd.setCursor(0,1);
lcd.print(" SMACM");
delay(2000); //Solo por que me da hueva pensar en otra forma ahorita
// Se añaden los caracteres especiales al objeto LCD:
lcd.createChar (0,cursorArrow);
lcd.createChar (1,check);
lcd.createChar (2,bad);
lcd.clear();
}
void loop() {
info[0]=byte(1);
info[1]=byte(2);
info[2]=byte(2);
info[3]=byte(1);
info[4]=byte(1);
info[5]=byte(1);
info[6]=byte(1);
info[7]=byte(2);
//MENU PRINCIPAL DEL PROGRAMA
/*
A --> SUBMENU HISTORIAL
B --> SUBMENU DE CONSULTAR HORARIO
C --> SUBMENU DE AGREGAR MEDICAMENTO
*/
MP: lcd.setCursor(0,0); lcd.print("MENU ");
lcd.setCursor(0,1); lcd.print("A) Historial ");
buttonPresed = keypad.getKey();
if (buttonPresed == 'A'){
MENU_HISTORIAL();//SDe dirige a menu de historial
}
lcd.setCursor(0,2); lcd.print("B) Consultar horario");
buttonPresed = keypad.getKey();
if (buttonPresed == 'B'){
MENU_CH();//Se dirige a submenu de consultar horario
}
lcd.setCursor(0,3); lcd.print("C) Agregar medicina ");
buttonPresed = keypad.getKey();
if (buttonPresed == 'C'){
num_med=num_med+1;
MENU_AM();//Se dirige a submenu de agregar medicamento
}
//SE OBTENIE FECHA Y HORA ACTUAL Y SE ACTUALIZA
RtcDateTime now = Rtc.GetDateTime();
printDateTime(now);
despacha(now);
}
//Menu y submenu's de historial
void MENU_HISTORIAL () {
int posCursor = 2, opcMenu = -5;
// Mensaje de inicio
lcd.clear();
lcd.setCursor(0, 0); lcd.print(" Seleccione la fecha ");
lcd.setCursor(0, 1); lcd.print(" para consultar:");
//muestra primera fecha del mes a consultar
lcd.setCursor(1,2);
lcd.print(dd[0]);lcd.print("-");lcd.print(mm[5]);lcd.print("-");lcd.print(yy[0]);
//Muestra la opcion para irse a la siguiente pagina con fechas del mes
lcd.setCursor(1,3);
lcd.print("Siguiente -->");
do{
buttonPresed = keypad.getKey();
// Nos ayuda a mostrar en pantalla la flecha del cursor para elegir opciones
lcd.setCursor(0, posCursor);
lcd.write(byte (0)); //Pintamos flecha en LCD
if(buttonPresed == 'A')
MENU_MueveCursor(&posCursor, tMAX, BTN_DOWN);//Se desplaza en el menu la flecha hacia arriba al presionar A
else if(buttonPresed == 'B')
MENU_MueveCursor(&posCursor, tMAX, BTN_UP);//Se desplaza en el menu la flecha hacia abajo al presionar B
else if(buttonPresed == 'C')
opcMenu = posCursor; //le asigmamops un valor al curso dependiendo de en que fila este para poder realizar la siguiente accion
else if(buttonPresed == 'D') //Se le asigna -3 a la variable del cursor
opcMenu = -3;
pag=1; //definimos que estamos en la pagina 1 del mes
med=1;
switch(opcMenu){
case 2:
Diagnostico(); //Se dirige a una opcion para observar el informe de ese dia, si acato o no el tratamiento el paciente
opcMenu = -5;
break;
case 3:
Pagina_de_horario(); //Si el opcMenu tiene la opcion de 2 se ira al siguiente submenu que mostrara las demas fechas del mes (SIGUIENTE)
opcMenu = -5;
break;
default:
break;
}
}while (opcMenu != -3); //si opcMenu es -3 (es decir cuando se aprieta D) se regresa al menu principal
}
//Esta rutina posiciona el cursor (flecha) em la linea deseada
void MENU_MueveCursor(int *pos, int max, char ope){
if(ope)
if(*pos < max) *pos += 1;
else *pos = 2;
else
if(*pos > 2) *pos -= 1;
else *pos = max;
// Se borran los cursores:
lcd.setCursor(0, 2); lcd.print(" ");
lcd.setCursor(0, 3); lcd.print(" ");
}
//Funcion para mostrar si se cumple o no el tratamiento DEL PRIMER DIA DEL MES
void Diagnostico(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Medicamento 1 "); lcd.setCursor(15, 0); lcd.write(info[0]);
lcd.setCursor(0,1);
lcd.print(" Medicamento 2 "); lcd.setCursor(15, 1); lcd.write(info[1]);
lcd.setCursor(0,2);
lcd.print(" Medicamento 3 "); lcd.setCursor(15, 2); lcd.write(info[2]);
lcd.setCursor(0,3);
lcd.print(" Medicamento 4 "); lcd.setCursor(15, 3); lcd.write(info[3]);
}
//Nos mostrara las paginas del historial con cada dia del mes, si es que llegamos al final, se moestrara un mensaje de que ha sido toda la informacion
void Pagina_de_horario(){
int mpag;
fechas: mpag=3*pag;
lcd.clear();
int posCursor = 0, opcMenu = -5;
if(mpag>30){
lcd.setCursor(1,0);//funcion para decir que se acabo la informacion del mes
lcd.print("Ha sido todo el ");
lcd.setCursor(1,1);
lcd.print("historial del mes");
lcd.setCursor(1,3);
lcd.print("D) Salir");
}
else{
lcd.setCursor(1,0);
lcd.print(dd[mpag-2]);lcd.print("-");lcd.print(mm[5]);lcd.print("-");lcd.print(yy[0]);//Nos muestra las fechas del mes en cada pagina
lcd.setCursor(1,1);
lcd.print(dd[mpag-1]);lcd.print("-");lcd.print(mm[5]);lcd.print("-");lcd.print(yy[0]);
lcd.setCursor(1,2);
lcd.print(dd[mpag]);lcd.print("-");lcd.print(mm[5]);lcd.print("-");lcd.print(yy[0]);
lcd.setCursor(1,3);
lcd.print("Siguiente -->");
}
do{
buttonPresed = keypad.getKey();
// Cursor que indica la opcion seleccioanda:
lcd.setCursor(0, posCursor);
lcd.write(byte (0)); //Pintamos flecha en LCD
if(buttonPresed == 'A')
MENU02_MueveCursor(&posCursor, tMAX, BTN_DOWN);//Se desplaza en el menu la flecha hacia arriba al presionar A
else if(buttonPresed == 'B')
MENU02_MueveCursor(&posCursor, tMAX, BTN_UP1);//Se desplaza en el menu la flecha hacia abajo al presionar B
else if(buttonPresed == 'C')//le asigmamops un valor al curso dependiendo de en que fila este para poder realizar la siguiente accion
opcMenu = posCursor;
else if(buttonPresed == 'D')//Se le asigna -3 a la variable del cursor
opcMenu = -3;
switch(opcMenu){
case 0:
informe();// nos da un informe de si se ingiriio adecuadamente los 4 medicamentos en ese dia
opcMenu = -5;
break;
case 1:
informe();
opcMenu = -5;
break;
case 2:
informe();
opcMenu = -5;
break;
case 3:
pag++; //aumenta el valor para cambiar de pagiona
med++; //aumenta el valor para poder consultar la informacion en los ARREGLOS DE INFO DEPENDIENDO DEL DIA
goto fechas;
opcMenu = -5;
break;
default:
break;
}
}while (opcMenu != -3);
}
//Funcion hecha para poder consultar el horario de cualquiera de los 4 medicamentos
void MENU_CH () {
int posCursor=0,opcMenu = -5;
//Mensaje para elegir el horario del medicamento a consultar
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Elige el horario");
lcd.setCursor(0,1);
lcd.print("del medicamento a");
lcd.setCursor(0,2);
lcd.print("consultar");
lcd.setCursor(0,3);
lcd.print(" -->");
delay(3000);
// submenu para elegir el horario
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Medicamento 1");
lcd.setCursor(1,1);
lcd.print("Medicamento 2");
lcd.setCursor(1,2);
lcd.print("Medicamento 3");
lcd.setCursor(1,3);
lcd.print("Medicamento 4");
do{
buttonPresed = keypad.getKey();
// Cursor que indica la opcion seleccioanda:
lcd.setCursor(0, posCursor);
lcd.write(byte (0)); //Pintamos flecha en LCD
if(buttonPresed == 'A')
MENU02_MueveCursor(&posCursor, tMAX, BTN_DOWN);//Sube flecha
else if(buttonPresed == 'B')
MENU02_MueveCursor(&posCursor, tMAX, BTN_UP1);//Baja flecha
else if(buttonPresed == 'C'){
opcMenu = posCursor;//asigna valor a opcMenu
}
else if(buttonPresed == 'D')
opcMenu = -3;//se sale al menu prncipal
switch(opcMenu){
case 0:
MENU_CHM (1); //muestra horario de medicamento 1----------------------------------------------------------------------------------------------------
opcMenu = -5;
break;
case 1:
MENU_CHM (2); //muestra horario de medicamento 2
opcMenu = -5;
break;
case 2:
MENU_CHM (3); //muestra horario de medicamento 3
opcMenu = -5;
break;
case 3:
MENU_CHM (4);//muestra horario de medicamento 4
opcMenu = -5;
break;
default:
break;
}
}while (opcMenu != -3);// opcMenu = -3 se va al menu principal
}
//Funcion para agregar medicamento
void MENU_AM () {
int posCursor=0,opcMenu = -5;
// Si se ha ingresado al menu 4 veces, ya no se puede almacenar mas medicamentos
if(num_med>4){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Solo puedes");
lcd.setCursor(0,1);
lcd.print("almacenar cuatro");
lcd.setCursor(0,2);
lcd.print("medicamentos");
delay(4000);
}
else{
//Selecciona el dia en que vas a agregar las dosis del medicamento
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Selecciona el dia");
lcd.setCursor(0,1);
lcd.print("para consumir tu ");
lcd.setCursor(0,2);
lcd.print("medicamento");
lcd.setCursor(0,3);
lcd.print(" :)");
delay(4000);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Lunes");
lcd.setCursor(1,1);
lcd.print("Martes");
lcd.setCursor(1,2);
lcd.print("Miercoles");
lcd.setCursor(1,3);
lcd.print("Siguiente -->");
do{
buttonPresed = keypad.getKey();
// Cursor que indica la opcion seleccioanda:
lcd.setCursor(0, posCursor);
lcd.write(byte (0)); //Pintamos flecha en LCD
if(buttonPresed == 'A')
MENU02_MueveCursor(&posCursor, tMAX, BTN_DOWN);
else if(buttonPresed == 'B')
MENU02_MueveCursor(&posCursor, tMAX, BTN_UP1);
else if(buttonPresed == 'C'){
opcMenu = posCursor;
}
else if(buttonPresed == 'D')
opcMenu = -3;
switch(opcMenu){
case 0:
iden_sem=1; //se le asigna un valor entero al dia seleccionado con iden_sem
horas();//funcion para agregar el horario de maximo 4 dosis por dia
opcMenu = -5;
break;
case 1:
iden_sem=2;
horas();
opcMenu = -5;
break;
case 2:
iden_sem=3;
horas();
opcMenu = -5;
break;
case 3:
AM_pagina2();//Se dirige a la segunda pagina de dias de la semana
opcMenu = -5;
break;
default:
break;
}
}while (opcMenu != -3);
}
}
//Esta rutina posiciona el cursor (flecha) em la linea deseada
void MENU02_MueveCursor(int *pos, int max, char ope){
if(ope)
if(*pos < max) *pos += 1; //Si la posicion del cursor es menor al maximo
else *pos = 0;// se incrementara esta y si no se mantendra ahi
else
if(*pos > 0) *pos -= 1;//Si la posicon del cursor es mayor a 0 solo de podra
else *pos = max;//decrementar o mantener es la posion maxima
// Se borran los cursores:
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" ");
lcd.setCursor(0, 2); lcd.print(" ");
lcd.setCursor(0, 3); lcd.print(" ");
}
//Realiza lño mismo que la funcion de AM solo que para los dias de jueves a domingo
void AM_pagina2(){
int posCursor=0,opcMenu=-5;
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Jueves");
lcd.setCursor(1,1);
lcd.print("Viernes");
lcd.setCursor(1,2);
lcd.print("Sabado");
lcd.setCursor(1,3);
lcd.print("Domingo");
do{
inicio:
buttonPresed = keypad.getKey();
// Cursor que indica la opcion seleccioanda:
lcd.setCursor(0, posCursor);
lcd.write(byte (0)); //Pintamos flecha en LCD
if(buttonPresed == 'A')
MENU02_MueveCursor(&posCursor, tMAX, BTN_DOWN);
else if(buttonPresed == 'B')
MENU02_MueveCursor(&posCursor, tMAX, BTN_UP1);
else if(buttonPresed == 'C'){
opcMenu = posCursor;}
else if(buttonPresed == 'D')
opcMenu = -3;
switch(opcMenu){
case 0:
iden_sem=4;
horas();
opcMenu = -5;
break;
case 1:
iden_sem=5;
horas();
opcMenu = -5;
break;
case 2:
iden_sem=6;
horas();
opcMenu = -5;
break;
case 3:
iden_sem=7;
horas();
opcMenu = -5;
break;
default:
break;
}
}while (opcMenu != -3);
}
//nos muestra si se consumio adecuadamente durante el dia los cuatro medicamentos
void informe(){
med=med*4;
lcd.setCursor(0,0);
lcd.print(" Medicamento 1 "); lcd.setCursor(15, 0); lcd.write(info[med]);
lcd.setCursor(0,1);
lcd.print(" Medicamento 2 "); lcd.setCursor(15, 1); lcd.write(info[med+1]);
lcd.setCursor(0,2);
lcd.print(" Medicamento 3 "); lcd.setCursor(15, 2); lcd.write(info[med+2]);
lcd.setCursor(0,3);
lcd.print(" Medicamento 4 "); lcd.setCursor(15, 3); lcd.write(info[med+3]);
}
//funcion para agregar 4 dosis maximas por dia, su hora y fecha
void horas(){
int opcMenu=-5,hora=0,minuto=0,cursor=7;
//mensaje para mostrara en la pantalla los valores de la hora que quiere guardar
inicio:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ingrese la hora para");
lcd.setCursor(0,1);
lcd.print("del medicamento");
lcd.setCursor(0,2);
lcd.print(" 00:00");
lcd.setCursor(0,3);
lcd.print("D) Salir C) Ok");
do{
buttonPresed = keypad.getKey();
switch(buttonPresed){
case '0':
lcd.setCursor(cursor,2);
lcd.print("0");
if(cursor==8){
h_d=0;
}
else if(cursor==7){
h_u=0;
}
else if(cursor==10){
m_d=0;
}
else if(cursor==11){
m_u=0;
}
break;
case '1':
lcd.setCursor(cursor,2);
lcd.print("1");
if(cursor==8){
h_d=1;
}
else if(cursor==7){
h_u=1;
}
else if(cursor==10){
m_d=1;
}
else if(cursor==11){
m_u=1;
}
break;
case '2':
lcd.setCursor(cursor,2);
lcd.print("2");
if(cursor==8){
h_d=2;
}
else if(cursor==7){
h_u=2;
}
else if(cursor==10){
m_d=2;
}
else if(cursor==11){
m_u=2;
}
break;
case '3':
lcd.setCursor(cursor,2);
lcd.print("3");
if(cursor==8){
h_d=3;
}
else if(cursor==7){
h_u=3;
}
else if(cursor==10){
m_d=3;
}
else if(cursor==11){
m_u=3;
}
break;
case '4':
lcd.setCursor(cursor,2);
lcd.print("4");
if(cursor==8){
h_d=4;
}
else if(cursor==7){
h_u=4;
}
else if(cursor==10){
m_d=4;
}
else if(cursor==11){
m_u=4;
}
break;
case '5':
lcd.setCursor(cursor,2);
lcd.print("5");
if(cursor==8){
h_d=5;
}
else if(cursor==7){
h_u=5;
}
else if(cursor==10){
m_d=5;
}
else if(cursor==11){
m_u=5;
}
break;
case '6':
lcd.setCursor(cursor,2);
lcd.print("6");
if(cursor==8){
h_d=6;
}
else if(cursor==7){
h_u=6;
}
else if(cursor==10){
m_d=6;
}
else if(cursor==11){
m_u=6;
}
break;
case '7':
lcd.setCursor(cursor,2);
lcd.print("7");
if(cursor==8){
h_d=7;
}
else if(cursor==7){
h_u=7;
}
else if(cursor==10){
m_d=7;
}
else if(cursor==11){
m_u=7;
}
break;
case '8':
lcd.setCursor(cursor,2);
lcd.print("8");
if(cursor==8){
h_d=8;
}
else if(cursor==7){
h_u=8;
}
else if(cursor==10){
m_d=8;
}
else if(cursor==11){
m_u=8;
}
break;
case '9':
lcd.setCursor(cursor,2);
lcd.print("9");
if(cursor==8){
h_d=9;
}
else if(cursor==7){
h_u=9;
}
else if(cursor==10){
m_d=9;
}
else if(cursor==11){
m_u=9;
}
break;
}
if(buttonPresed=='A'){
cursor++;
if(cursor==12){
cursor=11;
}
}
else if(buttonPresed=='B'){
cursor--;
if(cursor==6){
cursor=7;
}
}
hora=h_u*10+h_d;
minuto=m_d*10+m_u;
if(buttonPresed=='C'){
if(hora>23||minuto>59){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("La hora ingresada no");
lcd.setCursor(0,1);
lcd.print("puede alamacenarse");
lcd.setCursor(0,2);
lcd.print("Ingrese de nuevo ");
lcd.setCursor(0,3);
lcd.print("la hora de la dosis");
delay(4000);
goto inicio;
}
almacena_med(iden_sem,num_med,hora,minuto);//almacena la hora y minuto de la dosis en el dia seleccionado
mas_dosis();//te pregunta si quieres seguir agragando dosis en el dia, irte a otro dia o salirte al menu princial
}
else if(buttonPresed == 'D'){
opcMenu = -3;}//te sales al menu principal*/
}
while(opcMenu!=-3);
}
/*if(buttonPresed == 'A'){//incrementa el valor de la hora
hora++;
if(hora>9 && hora<24){
lcd.setCursor(7,2);
}else{
lcd.setCursor(8,2);
}
if(hora>23 || hora<0){
lcd.setCursor(7,2);
lcd.print(0);
lcd.setCursor(8,2);
hora=0;
}
lcd.print(hora);}
else if(buttonPresed == 'B'){//incrementa el valor de los minutos
minuto++;
if(minuto>9 && minuto<60){
lcd.setCursor(10,2);
}else{
lcd.setCursor(11,2);
}
if(minuto>59 || minuto<0){
lcd.setCursor(10,2);
lcd.print(0);
lcd.setCursor(11,2);
minuto=0;
}
lcd.print(minuto);}
else if(buttonPresed == 'C'){
almacena_med(iden_sem,num_med,hora,minuto);//almacena la hora y minuto de la dosis en el dia seleccionado
mas_dosis();//te pregunta si quieres seguir agragando dosis en el dia, irte a otro dia o salirte al menu princial
}
else if(buttonPresed == 'D'){
opcMenu = -3;}//te sales al menu principal*/
//Funcion para irte aL SUBMENU Y PODER AGREGAR MAS DOSIS en el dia o no
void mas_dosis(){
int opcMenu=-5;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Desea agregar otra");
lcd.setCursor(0,1);
lcd.print("hora a este dia?");
lcd.setCursor(0,3);
lcd.print("A) No B) Si D)Menu");
do{
buttonPresed = keypad.getKey();
if(buttonPresed == 'A'){
MENU_AM();}//te dirige al menu de agregar medicamentos en el dia
else if(buttonPresed == 'B'){
horas();}
else if(buttonPresed == 'D'){
opcMenu = -3;}
}while (opcMenu != -3);
}
//funciona para almacenar datos de horas y minutos en diferentes arreglos
//w=dia de la semana, m=numero de medicamento
//h=valor de hora,min=valor de minuto
void almacena_med(int w,int m,int h,int minu){
if(m>0 && m<5){
switch(w){
case 1:
switch(m){
case 1:
med1_h[c1]=h;
med1_m[c1]=minu;
c1++;
break;
case 2:
med2_h[c2]=h;
med2_m[c2]=minu;
c2++;
break;
case 3:
med3_h[c3]=h;
med3_m[c3]=minu;
c3++;
break;
case 4:
med4_h[c4]=h;
med4_m[c4]=minu;
c4++;
break;
}
break;
case 2:
switch(m){
case 1:
med1_h[c5]=h;
med1_m[c5]=minu;
c5++;
break;
case 2:
med2_h[c6]=h;
med2_m[c6]=minu;
c6++;
break;
case 3:
med3_h[c7]=h;
med3_m[c7]=minu;
c7++;
break;
case 4:
med4_h[c8]=h;
med4_m[c8]=minu;
c8++;
break;
}
break;
case 3:
switch(m){
case 1:
med1_h[c9]=h;
med1_m[c9]=minu;
c9++;
break;
case 2:
med2_h[c10]=h;
med2_m[c10]=minu;
c10++;
break;
case 3:
med3_h[c11]=h;
med3_m[c11]=minu;
c11++;
break;
case 4:
med4_h[c12]=h;
med4_m[c12]=minu;
c12++;
break;
}
break;
case 4:
switch(m){
case 1:
med1_h[c13]=h;
med1_m[c13]=minu;
c13++;
break;
case 2:
med2_h[c14]=h;
med2_m[c14]=minu;
c14++;
break;
case 3:
med3_h[c15]=h;
med3_m[c15]=minu;
c15++;
break;
case 4:
med4_h[c16]=h;
med4_m[c16]=minu;
c16++;
break;
}
break;
case 5:
switch(m){
case 1:
med1_h[c17]=h;
med1_m[c17]=minu;
c17++;
break;
case 2:
med2_h[c18]=h;
med2_m[c18]=minu;
c18++;
break;
case 3:
med3_h[c19]=h;
med3_m[c19]=minu;
c19++;
break;
case 4:
med4_h[c20]=h;
med4_m[c20]=minu;
c20++;
break;
}
break;
case 6:
switch(m){
case 1:
med1_h[c21]=h;
med1_m[c1]=minu;
c21++;
break;
case 2:
med2_h[c22]=h;
med2_m[c22]=minu;
c22++;
break;
case 3:
med3_h[c23]=h;
med3_m[c3]=minu;
c23++;
break;
case 4:
med4_h[c24]=h;
med4_m[c24]=minu;
c24++;
break;
}
break;
case 7:
switch(m){
case 1:
med1_h[c25]=h;
med1_m[c25]=minu;
c25++;
break;
case 2:
med2_h[c26]=h;
med2_m[c26]=minu;
c26++;
break;
case 3:
med3_h[c27]=h;
med3_m[c27]=minu;
c27++;
break;
case 4:
med4_h[c28]=h;
med4_m[c28]=minu;
c28++;
break;
}
break;
}
}
}
//Funcion para imprimir horario en pantalla
void mostrar_horarios(int medicamento,byte dia){
int opcMenu=-5;
int h[28],m[28],posCursor,i;
switch(medicamento){
case 1:
for(i=0;i<28;i++){
h[i]=med1_h[i];
m[i]=med1_m[i];
}
break;
case 2:
for(i=0;i<28;i++){
h[i]=med2_h[i];
m[i]=med2_m[i];
}
break;
case 3:
for(i=0;i<28;i++){
h[i]=med3_h[i];
m[i]=med3_m[i];
}
break;
case 4:
for(i=0;i<28;i++){
h[i]=med4_h[i];
m[i]=med4_m[i];
}
break;
}
switch(dia){
case 1:
j=0;
break;
case 2:
j=4;
break;
case 3:
j=8;
break;
case 4:
j=12;
break;
case 5:
j=16;
break;
case 6:
j=20;
break;
case 7:
j=24;
break;
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Las horas son:");
lcd.setCursor(0,1);
lcd.print(h[j]);
lcd.print(":");
lcd.print(m[j]);
lcd.print(" ");
lcd.print(h[j+1]);
lcd.print(":");
lcd.print(m[j+1]);
lcd.setCursor(0,2);
lcd.print(h[j+2]);
lcd.print(":");
lcd.print(m[j+2]);
lcd.print(" ");
lcd.print(h[j+3]);
lcd.print(":");
lcd.print(m[j+3]);
delay(4000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Desea cambiar ");
lcd.setCursor(0,1);
lcd.print("alguna hora? ");
lcd.setCursor(0,2);
lcd.print("A) Si D) No");
do{
buttonPresed = keypad.getKey();
if(buttonPresed == 'A'){
cambiar_horario(medicamento,dia);
}
else if(buttonPresed == 'D'){
opcMenu=-3;
}
}while(opcMenu!=-3);
}
//Funcion para consultar dia de del horario de cada medicamento
void MENU_CHM (byte med) {
int posCursor=0,opcMenu = -5;
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Lunes");
lcd.setCursor(1,1);
lcd.print("Martes");
lcd.setCursor(1,2);
lcd.print("Miercoles");
lcd.setCursor(1,3);
lcd.print("Siguiente -->");
do{
buttonPresed = keypad.getKey();
// Cursor que indica la opcion seleccioanda:
lcd.setCursor(0, posCursor);
lcd.write(byte (0)); //Pintamos flecha en LCD
if(buttonPresed == 'A')
MENU02_MueveCursor(&posCursor, tMAX, BTN_DOWN);
else if(buttonPresed == 'B')
MENU02_MueveCursor(&posCursor, tMAX, BTN_UP1);
else if(buttonPresed == 'C'){
opcMenu = posCursor;
}
else if(buttonPresed == 'D')
opcMenu = -3;
switch(opcMenu){
case 0:
dia=1; //se le asigna un valor entero al dia seleccionado con iden_sem
mostrar_horarios(med,dia);//funcion para agregar el horario de maximo 4 dosis por dia
opcMenu = -5;
break;
case 1:
dia=2; //se le asigna un valor entero al dia seleccionado con iden_sem
mostrar_horarios(med,dia);//funcion para agregar el horario de maximo 4 dosis por dia
opcMenu = -5;
break;
case 2:
dia=3; //se le asigna un valor entero al dia seleccionado con iden_sem
mostrar_horarios(med,dia);//funcion para agregar el horario de maximo 4 dosis por dia
opcMenu = -5;
break;
case 3:
CHM_pagina2(med);//Se dirige a la segunda pagina de dias de la semana
opcMenu = -5;
break;
default:
break;
}
}while (opcMenu != -3);
}
//Funcion para ir a la segunda pagina de dias a consultar en el horario del medicamento seleccionado
void CHM_pagina2(byte med){
int posCursor=0,opcMenu;
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Jueves");
lcd.setCursor(1,1);
lcd.print("Viernes");
lcd.setCursor(1,2);
lcd.print("Sabado");
lcd.setCursor(1,3);
lcd.print("Domingo");
do{
buttonPresed = keypad.getKey();
// Cursor que indica la opcion seleccioanda:
lcd.setCursor(0, posCursor);
lcd.write(byte (0)); //Pintamos flecha en LCD
if(buttonPresed == 'A')
MENU02_MueveCursor(&posCursor, tMAX, BTN_DOWN);
else if(buttonPresed == 'B')
MENU02_MueveCursor(&posCursor, tMAX, BTN_UP1);
else if(buttonPresed == 'C'){
opcMenu = posCursor;}
else if(buttonPresed == 'D')
opcMenu = -3;
switch(opcMenu){
case 0:
dia=4;
mostrar_horarios(med,dia);
opcMenu = -5;
break;
case 1:
dia=5;
mostrar_horarios(med,dia);
opcMenu = -5;
break;
case 2:
dia=6;
mostrar_horarios(med,dia);
opcMenu = -5;
break;
case 3:
dia=7;
mostrar_horarios(med,dia);
opcMenu = -5;
break;
default:
break;
}
}while (opcMenu != -3);
}
//Funcion para modificar horas del medicamento
void cambiar_horario(byte medicamento,byte dia){
int opcMenu=-5;
int h[28],m[28],med=medicamento,i;
byte dia1=dia;
switch(medicamento){
case 1:
for(i=0;i<28;i++){
h[i]=med1_h[i];
m[i]=med1_m[i];
}
break;
case 2:
for(i=0;i<28;i++){
h[i]=med2_h[i];
m[i]=med2_m[i];
}
break;
case 3:
for(i=0;i<28;i++){
h[i]=med3_h[i];
m[i]=med3_m[i];
}
break;
case 4:
for(i=0;i<28;i++){
h[i]=med4_h[i];
m[i]=med4_m[i];
}
break;
}
switch(dia){
case 1:
j=0;
break;
case 2:
j=4;
break;
case 3:
j=8;
break;
case 4:
j=12;
break;
case 5:
j=16;
break;
case 6:
j=20;
break;
case 7:
j=24;
break;
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("1) ");
lcd.print(h[j]);
lcd.print(":");
lcd.print(m[j]);
lcd.setCursor(0,1);
lcd.print("2) ");
lcd.print(h[j+1]);
lcd.print(":");
lcd.print(m[j+1]);
lcd.setCursor(0,2);
lcd.print("3) ");
lcd.print(h[j+2]);
lcd.print(":");
lcd.print(m[j+2]);
lcd.setCursor(0,3);
lcd.print("4) ");
lcd.print(h[j+3]);
lcd.print(":");
lcd.print(m[j+3]);
do{
buttonPresed = keypad.getKey();
if(buttonPresed == '1'){
modifica_hora(med,dia1,0);
opcMenu=-3;}
else if(buttonPresed == '2'){
modifica_hora(med,dia1,1);
opcMenu=-3;}
else if(buttonPresed == '3'){
modifica_hora(med,dia1,2);
opcMenu=-3;
}
else if(buttonPresed == '4'){
modifica_hora(med,dia1,3);
opcMenu=-3;
}
}while (opcMenu != -3);
}
//menu para modificar la hora del dia del medicamento actual
void modifica_hora(byte med,byte dia1,byte i){
int hora=0,minuto=0,opcMenu=-5,cursor=7;
//mensaje para mostrara en la pantalla los valores de la hora que quiere guardar
inicio:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ingrese la hora para");
lcd.setCursor(0,1);
lcd.print("del medicamento");
lcd.setCursor(0,2);
lcd.print(" 00:00");
lcd.setCursor(0,3);
lcd.print("D) Salir C) Ok");
do{
buttonPresed = keypad.getKey();
switch(buttonPresed){
case '0':
lcd.setCursor(cursor,2);
lcd.print("0");
if(cursor==8){
h_d=0;
}
else if(cursor==7){
h_u=0;
}
else if(cursor==10){
m_d=0;
}
else if(cursor==11){
m_u=0;
}
break;
case '1':
lcd.setCursor(cursor,2);
lcd.print("1");
if(cursor==8){
h_d=1;
}
else if(cursor==7){
h_u=1;
}
else if(cursor==10){
m_d=1;
}
else if(cursor==11){
m_u=1;
}
break;
case '2':
lcd.setCursor(cursor,2);
lcd.print("2");
if(cursor==8){
h_d=2;
}
else if(cursor==7){
h_u=2;
}
else if(cursor==10){
m_d=2;
}
else if(cursor==11){
m_u=2;
}
break;
case '3':
lcd.setCursor(cursor,2);
lcd.print("3");
if(cursor==8){
h_d=3;
}
else if(cursor==7){
h_u=3;
}
else if(cursor==10){
m_d=3;
}
else if(cursor==11){
m_u=3;
}
break;
case '4':
lcd.setCursor(cursor,2);
lcd.print("4");
if(cursor==8){
h_d=4;
}
else if(cursor==7){
h_u=4;
}
else if(cursor==10){
m_d=4;
}
else if(cursor==11){
m_u=4;
}
break;
case '5':
lcd.setCursor(cursor,2);
lcd.print("5");
if(cursor==8){
h_d=5;
}
else if(cursor==7){
h_u=5;
}
else if(cursor==10){
m_d=5;
}
else if(cursor==11){
m_u=5;
}
break;
case '6':
lcd.setCursor(cursor,2);
lcd.print("6");
if(cursor==8){
h_d=6;
}
else if(cursor==7){
h_u=6;
}
else if(cursor==10){
m_d=6;
}
else if(cursor==11){
m_u=6;
}
break;
case '7':
lcd.setCursor(cursor,2);
lcd.print("7");
if(cursor==8){
h_d=7;
}
else if(cursor==7){
h_u=7;
}
else if(cursor==10){
m_d=7;
}
else if(cursor==11){
m_u=7;
}
break;
case '8':
lcd.setCursor(cursor,2);
lcd.print("8");
if(cursor==8){
h_d=8;
}
else if(cursor==7){
h_u=8;
}
else if(cursor==10){
m_d=8;
}
else if(cursor==11){
m_u=8;
}
break;
case '9':
lcd.setCursor(cursor,2);
lcd.print("9");
if(cursor==8){
h_d=9;
}
else if(cursor==7){
h_u=9;
}
else if(cursor==10){
m_d=9;
}
else if(cursor==11){
m_u=9;
}
break;
}
if(buttonPresed=='A'){
cursor++;
if(cursor==12){
cursor=11;
}
}
else if(buttonPresed=='B'){
cursor--;
if(cursor==6){
cursor=7;
}
}
hora=h_u*10+h_d;
minuto=m_d*10+m_u;
if(buttonPresed=='C'){
if(hora>23||minuto>59){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("La hora ingresada no");
lcd.setCursor(0,1);
lcd.print("puede alamacenarse");
lcd.setCursor(0,2);
lcd.print("Ingrese de nuevo ");
lcd.setCursor(0,3);
lcd.print("la hora de la dosis");
delay(4000);
goto inicio;
}
guarda_mod(med,dia1,hora,minuto,i);//almacena la hora y minuto de la dosis en el dia seleccionado
opcMenu=-3;}//te sales al menu principal
}
while (opcMenu != -3);
}
//Funcion para guardar el dato actual o modificarlo
void guarda_mod(int medicamento,int dia,int hora,int minuto,int incremento){
int opcMenu=-5;
int h[28],m[28],med=medicamento,i;
byte dia1=dia;
switch(medicamento){
case 1:
for(i=0;i<28;i++){
h[i]=med1_h[i];
m[i]=med1_m[i];
}
break;
case 2:
for(i=0;i<28;i++){
h[i]=med2_h[i];
m[i]=med2_m[i];
}
break;
case 3:
for(i=0;i<28;i++){
h[i]=med3_h[i];
m[i]=med3_m[i];
}
break;
case 4:
for(i=0;i<28;i++){
h[i]=med4_h[i];
m[i]=med4_m[i];
}
break;
}
switch(dia){
case 1:
j=0;
break;
case 2:
j=4;
break;
case 3:
j=8;
break;
case 4:
j=12;
break;
case 5:
j=16;
break;
case 6:
j=20;
break;
case 7:
j=24;
break;
}
j=j+incremento;
h[j]=hora;
m[j]=minuto;
//actualizar dato
switch(medicamento){
case 1:
med1_h[j]=h[j];
med1_m[j]=m[j];
break;
case 2:
med2_h[j]=h[j];
med2_m[j]=m[j];
break;
case 3:
med3_h[j]=h[j];
med3_m[j]=m[j];
break;
case 4:
med4_h[j]=h[j];
med4_m[j]=m[j];
break;
}
}
#define countof(a) (sizeof(a) / sizeof(a[0]))
//FUNCION PARA IMPRIMIR FECHA Y HORA CON FORMATO ADECUADO
void printDateTime(const RtcDateTime& dt){
int hr,mr;
char datestring[20];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u:%02u"),//SE CONFURA FORMATO DE FECHA Y HORA
dt.Month(),
dt.Day(),
dt.Year(),
dt.Hour(),
dt.Minute(),
dt.Second() );
//SE IMPRIME LA FECHA Y HORA EN LCD
lcd.setCursor(12,0);
lcd.print(dt.Hour());
lcd.print(":");
lcd.print(dt.Minute());
lcd.print(":");
lcd.print(dt.Second());
lcd.print(" ");
/* hr=dt.Hour();
mr=dt.Minute();
while(hr==med1_h[b] && mr==med1_m[b]){
uno.write(30);
delay(2000);
uno.write(0);
delay(2000);
b++;
}*/
}
void despacha(const RtcDateTime& dt){
int hr,mr;
hr=dt.Hour();
mr=dt.Minute();
switch(D_EEPROM){
case 1:
while(hr==med1_h[d0] && mr==med1_m[d0]){
uno.write(30);
delay(2000);
uno.write(0);
delay(2000);
d0++;
}
while(hr==med2_h[e0] && mr==med2_m[e0]){
dos.write(30);
delay(2000);
dos.write(0);
delay(2000);
e0++;
}
while(hr==med3_h[f0] && mr==med3_m[f0]){
tres.write(30);
delay(2000);
tres.write(0);
delay(2000);
f0++;
}
while(hr==med4_h[g0] && mr==med4_m[g0]){
cuatro.write(30);
delay(2000);
cuatro.write(0);
delay(2000);
g0++;
}
break;
case 2:
while(hr==med1_h[d4] && mr==med1_m[d4]){
uno.write(30);
delay(2000);
uno.write(0);
delay(2000);
d4++;
}
while(hr==med2_h[e4] && mr==med2_m[e4]){
dos.write(30);
delay(2000);
dos.write(0);
delay(2000);
e4++;
}
while(hr==med3_h[f4] && mr==med3_m[f4]){
tres.write(30);
delay(2000);
tres.write(0);
delay(2000);
f4++;
}
while(hr==med4_h[g4] && mr==med4_m[g4]){
cuatro.write(30);
delay(2000);
cuatro.write(0);
delay(2000);
g4++;
}
break;
case 3:
while(hr==med1_h[d8] && mr==med1_m[d8]){
uno.write(30);
delay(2000);
uno.write(0);
delay(2000);
d8++;
}
while(hr==med2_h[e8] && mr==med2_m[e8]){
dos.write(30);
delay(2000);
dos.write(0);
delay(2000);
e8++;
}
while(hr==med3_h[f8] && mr==med3_m[f8]){
tres.write(30);
delay(2000);
tres.write(0);
delay(2000);
f8++;
}
while(hr==med4_h[g8] && mr==med4_m[g8]){
cuatro.write(30);
delay(2000);
cuatro.write(0);
delay(2000);
g8++;
}
break;
case 4:
while(hr==med1_h[d12] && mr==med1_m[d12]){
uno.write(30);
delay(2000);
uno.write(0);
delay(2000);
d12++;
}
while(hr==med2_h[e12] && mr==med2_m[e12]){
dos.write(30);
delay(2000);
dos.write(0);
delay(2000);
e12++;
}
while(hr==med3_h[f12] && mr==med3_m[f12]){
tres.write(30);
delay(2000);
tres.write(0);
delay(2000);
f12++;
}
while(hr==med4_h[g12] && mr==med4_m[g12]){
cuatro.write(30);
delay(2000);
cuatro.write(0);
delay(2000);
g12++;
}
break;
case 5:
while(hr==med1_h[d16] && mr==med1_m[d16]){
uno.write(30);
delay(2000);
uno.write(0);
delay(2000);
d16++;
}
while(hr==med2_h[e16] && mr==med2_m[e16]){
dos.write(30);
delay(2000);
dos.write(0);
delay(2000);
e16++;
}
while(hr==med3_h[f16] && mr==med3_m[f16]){
tres.write(30);
delay(2000);
tres.write(0);
delay(2000);
f16++;
}
while(hr==med4_h[g16] && mr==med4_m[g16]){
cuatro.write(30);
delay(2000);
cuatro.write(0);
delay(2000);
g16++;
}
break;
case 6:
while(hr==med1_h[d20] && mr==med1_m[d20]){
uno.write(30);
delay(2000);
uno.write(0);
delay(2000);
d20++;
}
while(hr==med2_h[e20] && mr==med2_m[e20]){
dos.write(30);
delay(2000);
dos.write(0);
delay(2000);
e20++;
}
while(hr==med3_h[f20] && mr==med3_m[f20]){
tres.write(30);
delay(2000);
tres.write(0);
delay(2000);
f20++;
}
while(hr==med4_h[g20] && mr==med4_m[g20]){
cuatro.write(30);
delay(2000);
cuatro.write(0);
delay(2000);
g20++;
}
break;
case 7:
while(hr==med1_h[d24] && mr==med1_m[d24]){
uno.write(30);
delay(2000);
uno.write(0);
delay(2000);
d24++;
}
while(hr==med2_h[e24] && mr==med2_m[e24]){
dos.write(30);
delay(2000);
dos.write(0);
delay(2000);
e24++;
}
while(hr==med3_h[f24] && mr==med3_m[f24]){
tres.write(30);
delay(2000);
tres.write(0);
delay(2000);
f24++;
}
while(hr==med4_h[g24] && mr==med4_m[g24]){
cuatro.write(30);
delay(2000);
cuatro.write(0);
delay(2000);
g24++;
}
break;
}
}