/*----------------------------------------------------------------------------------------------------------------------------------------
* ---------------------------------------------------------------------------------------------------------------------------------------
* DISPENSADOR AUTOMÁTICO DE ALIMENTO BALANCEADO (D.A.A.B.) v. 2.0
* Diseñado y programado por Agustín Marozzi
*----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------------------------
* LIBRERIAS
---------------------------------------------------------------------------------------------------------------------------------------*/
#include <Key.h>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <Servo.h>
/*---------------------------------------------------------------------------------------------------------------------------------------
* OBJETOS Y DEPENDENCIAS DEL HARDWARE
----------------------------------------------------------------------------------------------------------------------------------------*/
/*______________________________________________________TECLADO__________________________________________________________________________*/
const byte FILAS=4;
const byte COLUMNAS=4;
char keys[FILAS][COLUMNAS]={
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte pinesFilas[FILAS]={9,8,7,6};
byte pinesColumnas[COLUMNAS]={5,4,3,2};
Keypad teclado=Keypad(makeKeymap(keys),pinesFilas,pinesColumnas,FILAS,COLUMNAS);
/*___________________________________________________PANTALLA LCD_________________________________________________________________________*/
LiquidCrystal_I2C lcd (0x27,16,2);
/*______________________________________________________SERVO_____________________________________________________________________________*/
Servo servo1;
#define PINSERVO 12
#define PULSO_MIN 600
#define PULSO_MAX 2450
/*___________________________________________________RELOJ (RTC)__________________________________________________________________________*/
RTC_DS3231 rtc;
/*____________________________________________________PULSADOR____________________________________________________________________________*/
#define PULSADOR_LUZ 10
/*-----------------------------------------------------------------------------------------------------------------------------------------
* VARIABLES
-----------------------------------------------------------------------------------------------------------------------------------------*/
bool estado_pulsador_luz=false;
bool estado_luz_lcd=true;
char tecla;
byte contador=1;
bool estado_A1=false;
bool estado_A2=false;
bool estado_A3=false;
byte destino_alarma1=1;
byte destino_alarma2=1;
byte destino_alarma3=1;
bool estado_setA1=false;
bool estado_setA2=false;
bool estado_setA3=false;
byte posicion=1;
int hora_alarma1;
int minutos_alarma1;
char HORA_ALARMA1[2]={'2','1'};
char MINUTOS_ALARMA1[2]={'3','1'};
char HORA_ALARMA2[2]={'2','2'};
char MINUTOS_ALARMA2[2]={'3','2'};
char HORA_ALARMA3[2]={'2','3'};
char MINUTOS_ALARMA3[2]={'3','3'};
/*-----------------------------------------------------------------------------------------------------------------------------------------
* FUNCIONES
*-----------------------------------------------------------------------------------------------------------------------------------------
LISTADO:
1- setup
2- loop
3- Bienvenido
4- Menu_1
5- Accion_1
6- Menu_2
7- Accion_2
8- Menu_3
9- Accion_3
10- Menu_Alarma1()
11- Accion_Alarma1()
12- Cargar_alarma1()
13- Menu_Alarma2()
14- Accion_alarma2()
15- Cargar_alarma2()
16- Menu_alarma3()
17- Accion_alarma3()
xx- Dispensar_DaVinci
xx- Dispensar_Dasha
xx- Dispensar_Ambos
*/
/*******************************************************************************************************************************************
*******************************************************************************************************************************************
SETUP
*******************************************************************************************************************************************
******************************************************************************************************************************************/
void setup(){
Serial.begin(9600); //Descomentar esta línea si deseamos realizar pruebas con el monitor serie
//Pin del pulsador (luz lcd) como entrada
pinMode(PULSADOR_LUZ,INPUT);
// El teclado no necesita Setup
//PANTALLA LCD
lcd.init();
lcd.backlight();
lcd.clear();
//SERVO
servo1.attach(PINSERVO, PULSO_MIN, PULSO_MAX);
//MÓDULO RTC
if(!rtc.begin()){
lcd.setCursor(6,1);
lcd.print("RTC");
lcd.setCursor(1,1);
lcd.print("No encontrado!");
while(1);
}
//Descomentar la siguiente línea si queremos ajustar hora del RTC -> Descomentar, conectar placa a computadora, subir, comentar y subir nuevamente.
//rtc.adjust(DateTime(__DATE__,__TIME__));
//Servo se pone en posicion 90
servo1.write(90);
//Función de bienvenida (solo se corre una vez en el setup -> ver en funciones)
//Bienvenido();
}
/**********************************************************************************************************************************************
**********************************************************************************************************************************************
* LOOP
**********************************************************************************************************************************************
**********************************************************************************************************************************************/
void loop(){
//CONTROL LUZ LCD CON PULSADOR
if(estado_luz_lcd==true){
lcd.backlight();
}
else{
lcd.noBacklight();
}
if(digitalRead(PULSADOR_LUZ)==HIGH && estado_pulsador_luz==false){
estado_pulsador_luz=true;
estado_luz_lcd= !estado_luz_lcd;
delay(200);
}
estado_pulsador_luz=false;
//MAIN CONTROL DEL MENU
tecla=teclado.getKey();
if(tecla != 0){
lcd.clear();
delay(100);
}
if(contador == 1){
Menu_1();
Accion_1();
}
if(contador==2){
Menu_2();
Accion_2();
}
if(contador==3){
Menu_3();
Accion_3();
}
if(estado_setA1==true){
Menu_Alarma1();
Cargar_alarma1();
}
if(estado_setA2==true){
Menu_Alarma2();
Cargar_alarma2();
}
if(estado_setA3==true){
Menu_Alarma3();
Cargar_alarma3();
}
if(contador==5){
Menu_Alarma1();
Accion_Alarma1();
}
if(contador==6){
Menu_Alarma2();
Accion_Alarma2();
}
if(contador==7){
Menu_Alarma3();
Accion_Alarma3();
}
} // ------------------------------------------------- FIN DEL LOOP -----------------------------------------------------------------------
/*.............................................................................................................................................
* Bienvenido()
*............................................................................................................................................*/
void Bienvenido(){
lcd.clear();
lcd.setCursor(4,0);
lcd.print("DAAB v2.0");
lcd.setCursor(3,1);
lcd.print("By: Marozzi");
delay(3000);
lcd.clear();
lcd.setCursor(3,0);
lcd.print("BIENVENIDO");
delay(3500);
lcd.clear();
delay(500);
}
/*.............................................................................................................................................
Menu_1()
..............................................................................................................................................*/
void Menu_1(){
lcd.setCursor(0,0);
lcd.print("A)Disp. C)Otros");
lcd.setCursor(0,1);
lcd.print("B)Alarma");
lcd.setCursor(11,1);
DateTime fecha=rtc.now();
lcd.print(fecha.hour());
lcd.setCursor(13,1);
lcd.print(":");
lcd.setCursor(14,1);
lcd.print(fecha.minute());
}
/*.............................................................................................................................................
Accion_1()
*.............................................................................................................................................*/
void Accion_1(){
if(tecla == 'A'){
lcd.clear();
contador=2;
}
if(tecla == 'B'){
lcd.clear();
contador=3;
}
if(tecla == 'C'){
lcd.clear();
contador=4;
}
}
/*.............................................................................................................................................
Menu_2()
*............................................................................................................................................*/
void Menu_2(){
lcd.setCursor(0,0);
lcd.print("1)DaVin 3)AMB.");
lcd.setCursor(0,1);
lcd.print("2)Dasha *)Atras");
}
/*..............................................................................................................................................
Accion_2()
...............................................................................................................................................*/
void Accion_2(){
if(tecla=='1'){
// Dispensar_DaVinci();
}
if(tecla=='2'){
Dispensar_Dasha();
}
if(tecla=='3'){
Dispensar_Ambos();
}
if(tecla=='*'){
lcd.clear();
contador=1;
}
}
/*...........................................................................................................................................
Menu_3
............................................................................................................................................*/
void Menu_3(){
lcd.setCursor(0,0);
lcd.print("AL1>");
lcd.setCursor(4,0);
if(estado_A1==false){
lcd.print("OFF");
}
else{
lcd.print("ON ");
}
lcd.setCursor(9,0);
lcd.print("AL3>");
lcd.setCursor(13,0);
if(estado_A3==false){
lcd.print("OFF");
}
else{
lcd.print("ON ");
}
lcd.setCursor(0,1);
lcd.print("AL2>");
lcd.setCursor(4,1);
if(estado_A2==false){
lcd.print("OFF");
}
else{
lcd.print("ON ");
}
lcd.setCursor(9,1);
lcd.print("*>Atras");
}
/*.............................................................................................................................................
* Accion_3
*............................................................................................................................................*/
void Accion_3(){
if(tecla=='1'){
lcd.clear();
contador=5;
}
if(tecla=='2'){
lcd.clear();
contador=6;
}
if(tecla=='3'){
lcd.clear();
contador=7;
}
if(tecla=='*'){
lcd.clear();
contador=1;
}
}
/*..............................................................................................................................................
* Menu_Alarma1()
*............................................................................................................................................*/
void Menu_Alarma1(){
lcd.setCursor(0,0);
lcd.print("AL1:");
lcd.setCursor(5,0);
lcd.print("A)");
if(estado_A1==false){
lcd.print("OFF");
}
if(estado_A1==true){
lcd.print("ON ");
}
lcd.setCursor(11,0);
lcd.print("B)");
if(destino_alarma1==1){
lcd.print("DaV");
}
if(destino_alarma1==2){
lcd.print("DaS");
}
if(destino_alarma1==3){
lcd.print("AMB");
}
lcd.setCursor(0,1);
if(estado_setA1==false){
lcd.print("C) ");
}
if(estado_setA1==true){
lcd.print("C->");
}
lcd.setCursor(3,1);
for(byte i=0;i<2;i++){
lcd.print(HORA_ALARMA1[i]);
}
lcd.setCursor(5,1);
lcd.print(":");
lcd.setCursor(6,1);
for(byte i=0;i<2;i++){
lcd.print(MINUTOS_ALARMA1[i]);
}
lcd.setCursor(9,1);
lcd.print("*>Atras");
}
/*..............................................................................................................................................
* Accion_Alarma1()
*.............................................................................................................................................*/
void Accion_Alarma1(){
if(tecla=='A'){
estado_A1=!estado_A1;
}
if(tecla=='B'){
destino_alarma1++;
}
if(destino_alarma1>3){
destino_alarma1=1;
}
if(tecla=='C' && estado_setA1==false){
estado_setA1=!estado_setA1;
HORA_ALARMA1[0]=0;
HORA_ALARMA1[1]=0;
MINUTOS_ALARMA1[0]=0;
MINUTOS_ALARMA1[1]=0;
}
if(tecla=='*'){
lcd.clear();
contador=3;
}
}
/*.................................................................................................................................................
* Cargar_alarma1()
*................................................................................................................................................*/
void Cargar_alarma1(){
if(tecla !=0 && tecla=='1' || tecla=='2' || tecla=='3' || tecla=='4' || tecla=='5' || tecla=='6' || tecla=='7' || tecla=='8' || tecla=='9' || tecla=='0'){
switch(posicion){
case 1:
HORA_ALARMA1[0]=tecla;
posicion++;
break;
case 2:
HORA_ALARMA1[1]=tecla;
hora_alarma1=atoi(HORA_ALARMA1);
posicion++;
break;
case 3:
MINUTOS_ALARMA1[0]=tecla;
posicion++;
break;
case 4:
MINUTOS_ALARMA1[1]=tecla;
minutos_alarma1=atoi(MINUTOS_ALARMA1)/100;
posicion=1;
estado_setA1=false;
break;
}
}
Serial.print("Hora ");
Serial.println(hora_alarma1);
Serial.print("Minutos ");
Serial.println(minutos_alarma1);
if(tecla=='*'){
estado_setA1=false;
posicion=1;
HORA_ALARMA1[0]='_';
HORA_ALARMA1[1]='_';
MINUTOS_ALARMA1[0]='_';
MINUTOS_ALARMA1[1]='_';
lcd.clear();
contador=3;
}
}
/*..............................................................................................................................................
* Menu_Alarma2()
*............................................................................................................................................*/
void Menu_Alarma2(){
lcd.setCursor(0,0);
lcd.print("AL2:");
lcd.setCursor(5,0);
lcd.print("A)");
if(estado_A2==false){
lcd.print("OFF");
}
if(estado_A2==true){
lcd.print("ON ");
}
lcd.setCursor(11,0);
lcd.print("B)");
if(destino_alarma2==1){
lcd.print("DaV");
}
if(destino_alarma2==2){
lcd.print("DaS");
}
if(destino_alarma2==3){
lcd.print("AMB");
}
lcd.setCursor(0,1);
if(estado_setA2==false){
lcd.print("C) ");
}
if(estado_setA2==true){
lcd.print("C->");
}
lcd.setCursor(3,1);
for(byte i=0;i<2;i++){
lcd.print(HORA_ALARMA2[i]);
}
lcd.setCursor(5,1);
lcd.print(":");
lcd.setCursor(6,1);
for(byte i=0;i<2;i++){
lcd.print(MINUTOS_ALARMA2[i]);
}
lcd.setCursor(9,1);
lcd.print("*>Atras");
}
/*..............................................................................................................................................
* Accion_Alarma2()
*.............................................................................................................................................*/
void Accion_Alarma2(){
if(tecla=='A'){
estado_A2=!estado_A2;
}
if(tecla=='B'){
destino_alarma2++;
}
if(destino_alarma2>3){
destino_alarma2=1;
}
if(tecla=='C' && estado_setA2==false){
estado_setA2=!estado_setA2;
HORA_ALARMA2[0]='_';
HORA_ALARMA2[1]='_';
MINUTOS_ALARMA2[0]='_';
MINUTOS_ALARMA2[1]='_';
}
if(tecla=='*'){
lcd.clear();
contador=3;
}
}
/*.................................................................................................................................................
* Cargar_alarma2()
*................................................................................................................................................*/
void Cargar_alarma2(){
if(tecla !=0 && tecla=='1' || tecla=='2' || tecla=='3' || tecla=='4' || tecla=='5' || tecla=='6' || tecla=='7' || tecla=='8' || tecla=='9' || tecla=='0'){
switch(posicion){
case 1:
HORA_ALARMA2[0]=tecla;
posicion++;
break;
case 2:
HORA_ALARMA2[1]=tecla;
posicion++;
break;
case 3:
MINUTOS_ALARMA2[0]=tecla;
posicion++;
break;
case 4:
MINUTOS_ALARMA2[1]=tecla;
posicion=1;
estado_setA2=false;
break;
}
}
if(tecla=='*'){
estado_setA2=false;
posicion=1;
HORA_ALARMA2[0]='_';
HORA_ALARMA2[1]='_';
MINUTOS_ALARMA2[0]='_';
MINUTOS_ALARMA2[1]='_';
lcd.clear();
contador=3;
}
}
/*..............................................................................................................................................
* Menu_Alarma3()
*............................................................................................................................................*/
void Menu_Alarma3(){
lcd.setCursor(0,0);
lcd.print("AL3:");
lcd.setCursor(5,0);
lcd.print("A)");
if(estado_A3==false){
lcd.print("OFF");
}
if(estado_A3==true){
lcd.print("ON ");
}
lcd.setCursor(11,0);
lcd.print("B)");
if(destino_alarma3==1){
lcd.print("DaV");
}
if(destino_alarma3==2){
lcd.print("DaS");
}
if(destino_alarma3==3){
lcd.print("AMB");
}
lcd.setCursor(0,1);
if(estado_setA3==false){
lcd.print("C) ");
}
if(estado_setA3==true){
lcd.print("C->");
}
lcd.setCursor(3,1);
for(byte i=0;i<2;i++){
lcd.print(HORA_ALARMA3[i]);
}
lcd.setCursor(5,1);
lcd.print(":");
lcd.setCursor(6,1);
for(byte i=0;i<2;i++){
lcd.print(MINUTOS_ALARMA3[i]);
}
lcd.setCursor(9,1);
lcd.print("*>Atras");
}
/*..............................................................................................................................................
* Accion_Alarma3()
*.............................................................................................................................................*/
void Accion_Alarma3(){
if(tecla=='A'){
estado_A3=!estado_A3;
}
if(tecla=='B'){
destino_alarma3++;
}
if(destino_alarma3>3){
destino_alarma3=1;
}
if(tecla=='C' && estado_setA3==false){
estado_setA3=!estado_setA3;
HORA_ALARMA3[0]='_';
HORA_ALARMA3[1]='_';
MINUTOS_ALARMA3[0]='_';
MINUTOS_ALARMA3[1]='_';
}
if(tecla=='*'){
lcd.clear();
contador=3;
}
}
/*.................................................................................................................................................
* Cargar_alarma3()
*................................................................................................................................................*/
void Cargar_alarma3(){
if(tecla !=0 && tecla=='1' || tecla=='2' || tecla=='3' || tecla=='4' || tecla=='5' || tecla=='6' || tecla=='7' || tecla=='8' || tecla=='9' || tecla=='0'){
switch(posicion){
case 1:
HORA_ALARMA3[0]=tecla;
posicion++;
break;
case 2:
HORA_ALARMA3[1]=tecla;
posicion++;
break;
case 3:
MINUTOS_ALARMA3[0]=tecla;
posicion++;
break;
case 4:
MINUTOS_ALARMA3[1]=tecla;
posicion=1;
estado_setA3=false;
break;
}
}
if(tecla=='*'){
estado_setA3=false;
posicion=1;
HORA_ALARMA3[0]='_';
HORA_ALARMA3[1]='_';
MINUTOS_ALARMA3[0]='_';
MINUTOS_ALARMA3[1]='_';
lcd.clear();
contador=3;
}
}
/*.............................................................................................................................................
* Dispensar_DaVinci()
*...........................................................................................................................................*/
void Dispensar_DaVinci(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("<-DISPENSANDO");
lcd.setCursor(4,1);
lcd.print("Da Vinci");
servo1.write(0);
delay(650);
servo1.write(90);
delay(1000);
lcd.clear();
}
/*...............................................................................................................................................
* Dispensar_Daha()
*..............................................................................................................................................*/
void Dispensar_Dasha(){
lcd.clear();
lcd.setCursor(2,0);
lcd.print("DISPENSANDO->");
lcd.setCursor(6,1);
lcd.print("Dasha");
servo1.write(180);
delay(650);
servo1.write(90);
delay(1000);
lcd.clear();
}
/*..................................................................................................................................................
* Dispensar_Ambos()
*................................................................................................................................................*/
void Dispensar_Ambos(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("<-DISPENSANDO->");
lcd.setCursor(5,1);
lcd.print("Ambos.");
servo1.write(0);
delay(650);
servo1.write(90);
delay(500);
servo1.write(180);
delay(650);
servo1.write(90);
delay(500);
lcd.clear();
}