Version Beta para la FRDM-KL46Z del original de Arduino Uno

Dependencies:   mbed TextLCD

Revision:
0:f1e9b42f90d0
Child:
1:456851b4e285
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Sep 20 02:26:46 2018 +0000
@@ -0,0 +1,1232 @@
+/*******************************************************************************
+*
+* ARCHIVO:      main.cpp
+*
+* PROYECTO:     FRDM-KL46Z_Deshidratador
+*
+* PLATAFORMA:   FRDM-KL46Z
+*
+* DISPOSITIVO:  MKL46Z256VLL4
+*
+* HERRAMIENTA:  Mbed Compiler
+*
+* DESCRIPCION:  El programa principal lee los datos provenientes del sensor de
+*               humedad y temperatura DHT22. Formatea los datos y los despliega
+*               por la terminal serial.
+*               Posee un menú de Configuración por medio de la Pantalla LCD
+*               
+*
+* VERSION:      Beta
+* REV:          A
+* RELEASE:      0
+*
+* AUTOR(ES):    Antulio Morgado Valle, Raziel López Escamilla
+*
+* FECHA:        10/20/2018
+*
+*******************************************************************************/
+
+/*
+** ===================================================================
+**     Librerias del Programa
+** ===================================================================
+*/
+#include "mbed.h"
+#include "stdio.h"
+#include "TextLCD.h"
+#include "I2C.h"
+#include "SPI.h"
+#include "Serial.h" 
+//#include "LiquidCrystal_I2C.h"
+//#include "DHT.h"
+#include "DHT.h"
+
+/*
+** ===================================================================
+**     Definiciones y Constantes del programa.
+** ===================================================================
+*/
+
+#define LCDFILAS        4
+#define LCDCOLUMNAS     20
+
+#define TAPWM           255
+
+#define NOFRUTAS        11
+#define CONDALARM       2
+
+#define DHT_TIPO        DHT22
+#define DHT_PIN         7
+#define  on         0               // Estado para boton presionado
+#define off         1               // Estado para boton sin presionar
+#define hold        2
+#define release     3
+#define Buzz_On     1               // Buzzer Encendido
+#define Buzz_Off    0               // Buzzer Apagadp
+#define HIGH        1
+#define LOW         0
+/*
+** -------------------------------------------------------------------
+**    Inicialización de los Pines de Entrada.
+** -------------------------------------------------------------------
+*/
+DigitalIn   PIN_SWITCH     (PTC4,PullUp);  // Switch de Puerta Abierta
+DigitalIn   PIN_BOK        (PTC6,PullUp);  // Botón OK
+DigitalIn   PIN_BDERECHO   (PTC7,PullUp);  // Botón DERECHA
+DigitalIn   PIN_BARRIBA    (PTC8,PullUp);  // Botón ARRIBA
+DigitalIn   PIN_BABAJO     (PTC9,PullUp);  // Botón ABAJO
+DigitalIn   PIN_BIZQUIERDO (PTC10,PullUp); // Botón IZQUIERDA
+DigitalIn   PIN_BRETURN    (PTC11,PullUp); // Botón RETURN 
+/*
+** -------------------------------------------------------------------
+**    Inicialización de los Pines de Salida.
+** -------------------------------------------------------------------
+*/
+DigitalOut  PIN_BUZZER     (PTB20);  // Buzzer Piezo Eléctrico
+DigitalOut  PIN_QUEMADOR   (PTE30);  // Encendido/Apagado del Elemento Calefactor  
+DigitalOut  Red_Led        (PTE29);  // Led de Actividad del Programa
+DigitalOut  Green_Led      (PTD5);   // Led de Actividad del Programa
+/*
+** -------------------------------------------------------------------
+**    Inicialización de las Entradas Analógicas.
+** -------------------------------------------------------------------
+*/
+PwmOut      PIN_MOTOR      (PTE31);  // PWM Motor
+
+/*
+** -------------------------------------------------------------------
+**    Inicialización de las Entradas Analógicas.
+** -------------------------------------------------------------------
+*/
+//AnalogIn    Temperatura   (PTB0);    // Sensor de Temperatura:       LM35
+//AnalogIn    Fotocelda     (PTB1);    // Sensor de Luminosidad:       Fotocelda
+//AnalogIn    Ozono         (PTB2);    // Sensor de Ozono:             KS123
+/*
+** -------------------------------------------------------------------
+**    Inicialización de los Pines de Funciones Especiales.
+** -------------------------------------------------------------------
+*/
+/************************************************* 
+* Initialize the library with the numbers of the interface pins
+* Board Freedom FRDM-KL46Z
+* IDE  Mbed On Line Compiler
+* LCD  I2C  PCF8574A
+* Pin  Board    LCD
+*      I2C_SCL  SCL (white) + resistance pull-up 4.7k
+*      I2C_SDA  SDA (blue)  + resistance pull-up 4.7k
+*      5V       5V  (red)
+*      GND      GND (black)
+***************************************************/
+//LiquidCrystal_I2C lcd(0x7E, LCDCOLUMNAS, LCDFILAS);
+//i2c_LCD lcd(0x7E, LCDCOLUMNAS, LCDFILAS);
+
+/************************************************* 
+* Initialize the library with the numbers of the interface pins
+* Board Freedom FRDM-KL46Z
+* IDE  Mbed On Line Compiler
+* LCD  SPI  74595
+* Pin  Board     LCD
+*      SPI_MOSI  SER   (white) 
+*      SPI_MISO  none  (blue)  
+*      SPI_CLK   SRCLK
+*      SPI_PCS   RCLK
+*      5V       5V  (red)
+*      GND      GND (black)
+***************************************************/
+ // Host PC Communication channels
+Serial      Terminal(USBTX, USBRX);         // Tx, Rx
+//Serial      Terminal(PTA2,PTA1);          // Terminal Serial
+//Serial      Terminal(PTE1, PTE0);         // Tx, Rx Using MAX3232 or BlueTooth
+
+// I2C Communication
+I2C         i2c_LCD(PTC2,PTC1);             // SDA, SCL
+//I2C         i2c_LCD(PTE0,PTE1);             // SDA, SCL
+
+// SPI Communication
+SPI         spi_LCD(PTD6,PTD7,PTD5,PTD4);   // MOSI, MISO, SCLK, SSEL
+
+// LCD Type LCDType  LCD16x2;
+
+// LCD instantiation 
+//TextLCD LCD(PTC5, PTC6, PTC8, PTC9, PTC10, PCT11, TextLCD::LCD20x2); // 4bit bus: rs, e, d4-d7
+TextLCD_SPI lcd(&spi_LCD, PTD4, TextLCD::LCD16x4, TextLCD::HD44780);   // SPI bus, SN74595 expander, CS pin, LCD Type 
+//TextLCD_I2C lcd(&i2c_LCD, 0x7E, TextLCD::LCD16x4);                   // I2C bus, PCF8574A Arduino Shield, LCD Type
+
+//librerias del DHT22  
+DHT dht(PTA13, DHT22);     // DHT_PIN, DHT_TIPO
+
+/*
+** ===================================================================
+**     Variables del Programa
+** ===================================================================
+*/
+/* -------------------------------------------------------------------
+**   Variables Booleanas.
+**
+**   Para la Botonera, Checar_Botones()
+**   Variables de cada Boton.
+**   Posibles Valores:
+**    0 - No esta siendo apretado.
+**    1 - Esta siendo apretado.
+** -------------------------------------------------------------------*/
+bool B_Arriba;
+bool B_Abajo;
+bool B_Izquierdo;
+bool B_Derecho;
+bool B_Ok;
+bool B_Return;
+
+/* -------------------------------------------------------------------
+**   Variables Booleanas.
+**
+**   Para el Motor y Quemador
+**     Variables de componentes a controlar.
+**   Posibles Valores:
+**    0 - Dispositivo apagado.
+**    1 - Dispositivo encendido.
+** -------------------------------------------------------------------*/
+bool Motor;
+bool Quemador;
+
+/* -------------------------------------------------------------------
+**   Variables Booleanas.
+**
+**   Para el Control de Interfaz.
+**     Variables que ayudan al desplazamiento de cada interfaz.
+**   Posibles Valores.
+**    0 - Acción Autorizada.
+**    1-  Acción No Autorizada.
+** -------------------------------------------------------------------*/
+bool Bandera;
+bool Avanzar;
+bool Deshidratando;
+bool PuertaAb;
+bool Scroll_Cambio;
+
+/* -------------------------------------------------------------------
+**   Variables enteras sin signo.
+**
+**   La variables guardan las opciones disponibles de la interfaz.
+** -------------------------------------------------------------------*/
+
+uint16_t Opcion;        //Guarda la opción actual en la que se encuentra la interfaz.
+uint16_t Opcion_Ant;    //Guarda la opción Anterior en la que se encontraba la interfaz.
+uint16_t Opcion_Max;    //Guarda el número máximo de opciones disponibles en el menú que se encuentra la Interfaz.
+uint16_t Scroll;
+
+/* -------------------------------------------------------------------
+**   Variables flotantes.
+**
+**   Variables que guardan datos de los sensores.
+** -------------------------------------------------------------------*/
+
+float h;                    //Guarda la Humedad del ambiente.
+float t;                    //Guarda la Temperatura del ambiente.
+float TF;                   //Variable que guarda la temperatura final.
+float HF;                   //Variable que guarda la humedad final.
+
+//Variables de Rangos de control
+float Hot_min = 25;
+float Hot_max = 35;
+float Hum_min = 70;
+float Hum_max = 90;
+
+/* -------------------------------------------------------------------
+**   Variables de tipo caracter.
+**
+**   Arreglo de Caracteres
+** -------------------------------------------------------------------*/
+char     Sensores[CONDALARM][20] = {" TEMPERATURA", " HUMEDAD"};      //Arreglo que guarda el nombre de los sensores
+char     Fruta[NOFRUTAS][20] = {"ARANDANO", "AJO", "HIGO", "MELON", "MANZANA", "PLATANO", "PAPA", "JITOMATE", "MANGO", "UVA", "OTRO"};  // Arreglo que guarda el nombre de las frutas disponibles
+int16_t  Temp[NOFRUTAS]     = {        55,   55,    65,     60,       50,       70,    55,        65,      65,   55,    55};            // Vector que contiene temperatura de deshidratacion de la fruta.
+int16_t  Hume[NOFRUTAS]     = {        15,   10,    16,     18,       14,       15,    12,         8,      16,   15,    15};            //Vector que contiene la humedad de la fruta.
+int16_t  Seg;                //Variable que guarda segundos.
+int16_t  Min;                //Variable que guarda minuros.
+int16_t  Hor;                //Variable que guarda horas.
+
+char     Flecha = 126;       //Tiene el valor en ascii de la flecha.
+char     Porcentaje = 37;
+char     Celcius = 223;
+int16_t  NInterrupciones;
+int16_t  DC;
+
+/*
+** ===================================================================
+**   Declaración de Funciones Prototipo
+**     Funciones de Usuario.
+** ===================================================================
+*/
+void setup(void);
+void Checar_Botones();
+bool Deshidratacion(int FrutaD);
+void Checar_Calefactor(int TempD);
+void Interrupcion();
+void Intro();
+void Imprime_Menu();
+void Imprime_InfoDeshidratacion();
+void Imprime_InfoSensores();
+void Imprime_Tiempo(int, int);
+void Inicio();
+void Conf_Otro();
+void Alarmas();
+void Contacto();
+void Acerca();
+void Imprime_Flecha();
+void Apagar_Calefactor();
+void Reporte_Des();
+bool inf_fruta(int);
+bool Puerta_Abierta();
+void Conteo_Cronometro();
+void Init_Conometro();
+void Init_Var();
+void ConfT2_PWM3(int);
+void CalefactorON();
+void CalefactorOFF();
+void MotorON(int);
+void MotorOFF();
+
+/*
+** ###################################################################
+**
+**           P R O G R A M A     P R I N C I P A L
+**
+**     para la operación del microcontrolador MKL46Z256VLL4.
+**
+** ###################################################################
+*/
+int main()
+{
+
+    setup(); 
+/*
+** -------------------------------------------------------------------
+**    Inicialización de las Interrupciones.
+**    Ticker Inicialzation 
+** -------------------------------------------------------------------
+*/
+Ticker TimerInt;        // Asignación del vector de interrupción para el Ticker
+
+/*
+** ===================================================================
+**    InicializaciÓn interna de la Tarjeta FRDM-KL46Z.
+** ===================================================================
+*/
+
+ 
+  TimerInt.attach(&Interrupcion, 0.250);   // Periodo de Interrupción = 250ms  
+  
+  Init_Var();                   //Inicializamos variables iniciales.
+  Scroll = 0;                   //Colocamos scroll de pantalla en 0;
+  Opcion_Ant = 1;               //Colocamos Opcion anterior en 1
+  Opcion_Max = 4;               //Número Máximo de opciones es 4.
+//  interrupts();                 //Autoriza las interrupciones.
+  Imprime_Menu();               //Imprime el Menú.
+  while (!Avanzar) {            //Entra al Bucle hasta que el valor de Avanzar no cambie a 1.
+    Imprime_Flecha();           //Imprime la Flecha en el display en la posicion de la opcion.
+    wait_ms(250);                 //Colocamos un retraso de 250 ms para que no entre a un bucle infinito y tenga tiempo disponible para hacer otras interrupciones.
+  }
+  switch (Opcion) {            //Dependiendo la opción seleccionada llama a la función correspondiente.
+    case 1:
+      Inicio();
+      break;
+    case 2:
+      Conf_Otro();
+      break;
+    case 3:
+      Contacto();
+      break;
+    case 4:
+      Acerca();
+      break;
+  }
+}
+
+
+
+
+void setup() {
+/* Prueba del Buzzer */      
+    PIN_BUZZER = Buzz_On;
+    wait_ms(750);
+    PIN_BUZZER = Buzz_Off;
+    wait_ms(125);
+    PIN_BUZZER = Buzz_On;
+    wait_ms(250);
+    PIN_BUZZER = Buzz_Off;   
+    wait_ms(125);
+    PIN_BUZZER = Buzz_On;
+    wait_ms(500);
+    PIN_BUZZER = Buzz_Off;
+/* Configufración del Display LCD */      /* Mucho OjO !!! */
+  spi_LCD.frequency(1000000);    // Frecuencia de operación para el SPI
+  spi_LCD.format(8,0);              // Modo de Operación para el SPI
+//  i2c_LCD.frequency(1000000);    // Frecuencia de operación para el I2C
+//  i2c_LCD.start();                  // Inicio de operación para el I2C 
+/* Arranque del Display LCD */  
+//  lcd.init(TextLCD::LCDDatalength, 4 ); // Enciende la Iluminación de Fondo
+  lcd.setBacklight(TextLCD::LightOn); // Enciende la Iluminación de Fondo
+  lcd.setCursor(TextLCD::CurOff_BlkOff);
+  lcd.cls();                        // Limpia el Display LCD
+  lcd.printf("Hello World!\n");     // El LCD saluda al Mundo!
+  lcd.printf("Hola Mundo!\n");      // El LCD saluda al Mundo!
+  lcd.printf("Ciao Mondo!\n");      // El LCD saluda al Mundo!
+  lcd.printf("Bonjour le Monde");  // El LCD saluda al Mundo! 
+  wait(10); 
+  Terminal.printf(" LCD Display is Wake Up!.\n\r"); 
+  lcd.cls();                             // Limpia el Display LCD
+  lcd.setBacklight(TextLCD::LightOff);   // Apaga la Iluminación de Fondo
+  //  TimerInt.attach(&On_Timer_Interrupt, 0.001);   // Periodo de Interrupción = 1ms
+  Timer Elpased_Time;              //Inicialia el Tiempo a Transcurrir
+  Elpased_Time.start();
+  for (int row=0; row<lcd.rows(); row++) // Prueba toda la Pantalla
+  {
+   uint16_t col=0; 
+    lcd.putc('0' + row);       
+    for (col=1; col<lcd.columns()-1; col++) 
+    {    
+      lcd.putc('*');
+    }
+    lcd.putc('+');  
+  }  
+  Terminal.baud(115200);                  // Se inicia la comunicación serial.
+//  TimerInt.initialize(250000);            // El Temporizador se dispara cada 8 ms.
+  uint16_t NInterrupciones = 0;                  //Inicia contador en 0.
+
+//  TimerInt.attachInterrupt(Interrupcion); // Activa la interrupcion y la asocia a la función Interrupción().
+//  lcd.init();                         // Se inicia la LCD.
+//  dht.begin();                          // Se inicia el sensor de Humedad y Temperatura.
+//  lcd.backlight();                      // Se enciende luz de fondo de la LCD.
+
+  Intro();                              // Se ejecuta la introducción de la LCD.
+}
+
+
+/***    Fin de la initialization interna.     ***/
+
+
+/*
+** ===================================================================
+**     Prototipo   :  Init_Var (Inicializa variables de estado)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Esta función inicializa las banderas de estado para
+**         "Bandera", "Avanzar" y "Opción"
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Init_Var() {
+  Bandera = 0;                  //Bandera en 0.
+  Avanzar = 0;                  //Avanzar en 0.
+  Opcion = 1;                   //Colocamos en Opcion 1.
+}
+
+/*
+** ===================================================================
+**     Prototipo   :  Imprime_Flecha() (Imprime la Flecha)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Con ayuda de las opciones, imprime la flecha en la opcion
+**         seleccionada, moviendola a traves del menú.
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+
+void Imprime_Flecha() {
+  lcd.locate(0, Opcion_Ant - 1 - Scroll); //Coloca cursor de la LCD en la Opcion Anterior.
+  lcd.printf(" ");                            //Borra la flecha que previamente impresa.
+  lcd.locate(0, Opcion - 1 - Scroll);     //Coloca cursor de la LCD en la Opcion Actual.
+  lcd.setUDC(0, (char *) udc_0);  // Show |>
+//  lcd.setUDC(Flecha);                         //Imprime la nueva flecha.
+}
+
+/*
+** ===================================================================
+**     Prototipo   :  Checar_Botones() (Verifica el estado de la botonera)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Verifica si algún boton está siendo presionado,
+**         e indaga su posición y envia por la terminal serial
+**         la ubicación del botón seleccionado
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+
+void Checar_Botones() {
+  B_Arriba = DigitalIn(PIN_BARRIBA); //Lee el pin y lo asigna a la variable booleana correspondiente.
+  if (B_Arriba) //Si se presionó envia mensaje al serial para mostarlo en la terminal.
+    Terminal.printf("Arriba\n");
+
+  B_Abajo = DigitalIn(PIN_BABAJO);
+  if (B_Abajo)
+    Terminal.printf("Abajo\n");
+
+  B_Izquierdo = DigitalIn(PIN_BIZQUIERDO);
+  if (B_Izquierdo)
+    Terminal.printf("Izquierdo\n");
+
+  B_Derecho = DigitalIn(PIN_BDERECHO);
+  if (B_Derecho)
+    Terminal.printf("Derecho\n");
+
+  B_Ok = DigitalIn(PIN_BOK);
+  if (B_Ok)
+    Terminal.printf("Ok\n");
+
+  B_Return = DigitalIn(PIN_BRETURN);
+  if (B_Return)
+    Terminal.printf("Return\n");
+
+  if (B_Arriba || B_Abajo || B_Izquierdo || B_Derecho || B_Ok || B_Return ) { //Verifica si algun boton fue apretado
+    PIN_BUZZER = Buzz_On;                                           //Enciende el buzzer.
+  } else
+    PIN_BUZZER = Buzz_Off;                                            //Si no se presiono algun boton se apaga el buzzer.
+}
+
+/*
+** ===================================================================
+**     Prototipo   :  Interrupcion() (Verifica el estado de la botonera)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Con las interrupciones activadas se manda llamar a esta funcion.
+**         Verifica si algun boton esta siendo presionado y habilita o
+**         deshabiita banderas para Avanzar dentro del menú de la interfaz.
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+
+void Interrupcion() {
+
+  if (Deshidratando) {
+    Conteo_Cronometro();                                                     //Cronometro Activado.
+    PuertaAb = !PIN_SWITCH;                                                  //Checa el estado de la puerta.
+  }
+
+  Checar_Botones();                                                           //Lee el estado de los botones.
+
+  if (B_Arriba || B_Abajo || B_Izquierdo || B_Derecho || B_Ok || B_Return ) { //Checa si algun boton fue presionado.
+    if (Opcion_Max && (B_Arriba || B_Abajo)) {                                //Checamos si exite opciones disponibles y si se activo el boton de arriba y abajo.
+
+      if (B_Arriba && (Opcion == Scroll + 1) && (Scroll != 0) && (Opcion_Max > 4)) { //Entra al if si se Activa el Boton de arriba, existe un scroll, nos encontramos en la opcion mas alta disponible en el display.
+        Scroll_Cambio = 1;                                                  //Indicamos que se debe hacer un cambio de Scroll.
+        Scroll--;                                                           //Decrementamos el Scroll.
+        Opcion_Ant = Opcion;                                                //Actualizamos valor a la variable que guarda las opciones anteriores.
+        Opcion--;                                                           //Decrementa el valor de opción.
+      }
+      else if (B_Arriba && (Opcion != 1) ) {                                  //Checamos si presionamos Arriba la opcion no es la primera.
+        Opcion_Ant = Opcion;                                                  //Actualizamos valor a la variable que guarda las opciones anteriores.
+        Opcion--;
+//        Terminal.printf(Opcion);
+      }
+      else if (B_Abajo && (Opcion == Scroll + 4) && (Opcion < (Opcion_Max)) && (Opcion_Max > 4)) { //Checamos si presionamos Abajo la opcion es la 4ta de la pantalla, el scroll no es el ultimo posible y nuestras opciones son mayores a 4.
+        Scroll_Cambio = 1;                                                   //Indicamos que se debe hacer un cambio de Scroll.
+        Scroll++;          //Decrementamos el Scroll.
+        Opcion_Ant = Opcion;                                                 //Atualiza opcion anterior.
+        Opcion++;
+      }
+      else if (B_Abajo && (Opcion != Opcion_Max) ) {                         //Checa si se presiona el boton de abajo y la opcion actual no es la ultima opción.
+        Opcion_Ant = Opcion;                                                 //Atualiza opcion anterior.
+        Opcion++;                                                            //Incrementa la opcion.
+      }
+    }
+    else if (B_Ok) {                                                         //Verifica si presionamos el Boton OK.
+      Bandera = 1;                                                           //Cambia bandera a 1 permitiendo el paso a la siguiente acción.
+      Avanzar = 1;
+    }
+    else if (B_Return) {                                                     //Checa si se presiono el boton de regreso.
+      Bandera = 1;                                                           //Cambia bandera a 1 permitiendo el paso a la siguiente acción.
+      Avanzar = 0;                                                           //Permite el paso a la opción anterior.
+    }
+  }
+}
+
+
+/*
+** ===================================================================
+**     Prototipo   :  Intro() (Envia mensajes a la pantalla LCD)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Envia mensajes al inicio del programa a traves del LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Intro() {
+  lcd.cls();
+  lcd.locate(0,0);
+  lcd.locate(7, 0);
+  lcd.printf("I.P.N.");
+  lcd.locate(5, 1);
+  lcd.printf("E.S.I.M.E.");
+  lcd.locate(3, 2);
+  lcd.printf("DESHIDRATADOR");
+  wait_ms(2000);
+}
+
+/*
+** ===================================================================
+**     Prototipo   :  Imprime_Menu() (Imprime el Menú en la pantalla LCD)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Envia mensajes y coloca mensajes del menú en la LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Imprime_Menu() {
+  lcd.cls();
+  lcd.locate(0,0);
+  lcd.locate(1, 0);
+  lcd.printf("MENU");
+  lcd.locate(1, 1);
+  lcd.printf("PERSONALIZAR");
+  //lcd.print("CONF OTRO");
+  lcd.locate(1, 2);
+  lcd.printf("CONTACTO");
+  lcd.locate(1, 3);
+  lcd.printf("ACERCA DE... ");
+}
+
+/*
+** ===================================================================
+**     Prototipo   :  Imprime_InfoDeshidratacion() (Imprime info en la pantalla LCD)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Envia mensajes sobre las variables y el estado de operación
+**         del deshidratador y coloca mensajes en la pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Imprime_InfoDeshidratacion() {
+  lcd.cls();
+  lcd.locate(0, 0);
+  lcd.printf("TEMPERATURA: ");
+  lcd.locate(0, 1);
+  lcd.printf("HUMEDAD:     %");
+  lcd.locate(0, 2);
+  lcd.printf("VENT:     QUEM: ");
+  lcd.locate(0, 3);
+  lcd.printf("TIEMPO:");
+}
+/*
+** ===================================================================
+**     Prototipo   :  Imprime_InfoSensores() (Imprime info en la pantalla LCD)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Imprime las mediciones datos e información obtenida de los
+**         sensores y es enviada a la pantalla LCD.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Imprime_InfoSensores() {
+  uint16_t Porcentaje;
+  lcd.locate(12, 0);         //Coloca el cursor en la columna 12 y fila 0.
+//  lcd.printf(t);                 //Imprime valores de temperatura.
+  lcd.locate(8, 1);          //Coloca el cursor en la columna 8 fila 1.
+//  lcd.printf(h);                 //Imprime valores de humedad.
+  lcd.locate(6, 2);          //Coloca el cursor en columna 6 fila 2.
+  Porcentaje = DC * 100 / 255;
+  if (Motor) {                  //Vericamos estado del motor.
+//    lcd.printf(Porcentaje);      //Si - Imprime en LCD ON.
+    lcd.printf("%");
+  } else                         //No.
+    lcd.printf("OFF");           //Imprime en LCD OFF.
+  lcd.locate(16, 2);         //Colocamos cursor en columna 9 , fila 3.
+  if (Quemador)                 //Verificamos estado del quemador.
+    lcd.printf("ON ");           //Si - imprime mensaje en LCD de ON.
+  else                          //No.
+    lcd.printf("OFF");           //Imprime mesaje en LCD de OFF.
+}
+/*
+** ===================================================================
+**     Prototipo   :  Imprime_Tiempo() (Imprime info en la pantalla LCD)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Imprime en la LCD el tiempo transcurrido.
+**         Formatea el mensaje y los despliega en la pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+**     Variables Globales:
+**       uint16_t Columna - Almacena el valor de columna en la que desea imprimir en la LCD.
+**       uint16_t Fila    - Almacena el valor de fila en la que desea imprimir en la LCD.
+** ===================================================================
+*/
+void Imprime_Tiempo(int Columna,int Fila) {
+  lcd.locate(Columna, Fila);
+  if (Hor < 10)
+    lcd.printf("0");
+//  lcd.printf(Hor);
+  lcd.printf(":");
+  if (Min < 10)
+    lcd.printf("0");
+//  lcd.printf(Min);
+  lcd.printf(":");
+  if (Seg < 10)
+    lcd.printf("0");
+//  lcd.printf(Seg);
+  lcd.printf(" ");
+}
+/*
+** ===================================================================
+**     Prototipo   :  Inicio() (Despliega Menú en la pantalla LCD)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Inicia el proceso de deshidratación.
+**         Imprime el menú de inicio en la pantalla LCD y permite
+**         navegar dentro de él.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Inicio() {
+
+  bool MenuInicio;                            //Variable que permite regresar a esta opción.
+  MenuInicio = true;                          //Inicializamos variable con verdadero.
+  Scroll = 0;                                 //Colocamos Scroll de pantalla en 0 (no hay scroll);
+  while (MenuInicio) {                        //Mientras este en 1 MenuInicio repetira el proceso de esta opción.
+    Init_Var();                               //Se inicializan las variables.
+    Opcion_Ant = 1;                           //Opcion anterior en 1.
+    Opcion_Max = NOFRUTAS;                    //El máximo número de opciones.
+    do {
+      Scroll_Cambio = 0;                      //Indicamos que no hay cambio de scroll por ahora.
+      lcd.cls();                            //Limpiamos LCD.
+      for (int c = 0; c < 4; c++) {           //FOR que imprime nombres de las frutas en las 4 lineas de la LDC.
+        lcd.locate(1, c);                  //Coloca el cursor al inicio de la fila.
+        lcd.printf(Fruta[c + Scroll]);         //Imprime el nombre de la Fruta dependiendo el valor del scroll.
+      }
+      while (!Bandera && !Scroll_Cambio) {    //Entra en un bucle de espera hasta que se active la bandera con 1.
+        Imprime_Flecha();                     //Imprime la Flecha en el display en la posicion de la opcion.
+        wait_ms(250);                         //Aplicamos un retardo para no hacer un bucle infinito.
+      }
+    } while (Scroll_Cambio);                   //Este ciclo se repite mientras exista cambios en el Scroll.
+    if (Avanzar)                               //Si se activa la variable avanzar con 1.
+      MenuInicio = Deshidratacion(Opcion - 1); //Comienza Deshidratacion.
+    else
+      MenuInicio = 0;                          //regresa al menu anterior.
+  }
+}
+
+/*
+** ===================================================================
+**     Prototipo   :  Deshidratación() (Despliega Menú en la pantalla LCD)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Supervisa el proceso de deshidratación.
+**         Imprime el menú de estado en la pantalla LCD y actualiza
+**         los datos en tirmpo real.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Llamado por: Inicio()
+**     Argumentos  : Ninguno
+**     Retorna     : valor BOOLEANO.
+**          0 - Deshidratacion cancelada
+**          1 - Final de la deshidratación.
+** ===================================================================
+*/
+bool Deshidratacion(int FrutaD) {
+
+  //Mostramos informacion de fruta.
+  Deshidratando = inf_fruta(FrutaD);
+  if (Deshidratando) {
+    //Colocamos variables en condiciones iniciales.
+    Opcion_Max = 0;                 //0 no existen opciones disponibles.
+    Init_Var();                     //Se inicializan las variables.
+    Init_Conometro();               //Iniciamos variables del cronometro.
+    //ConfT2_PWM3(TAPWM);           //Configuracion de Timer2 PARA MODO FAST PWM EN PIN 3.
+    while (!Bandera && !Avanzar) {                         //Ciclo que se repite hasta que la bandera no sea activada.
+      if (PuertaAb)                                        //Checa si la puerta esta abierta
+        Deshidratando = Puerta_Abierta();                  //SI - Dependiedo de la decision del usuario puede o no continuar la deshidratación.
+      else {                                               //NO...
+        Imprime_InfoDeshidratacion();                      //Colocamos mensajes en la LCD.
+        while (!PuertaAb && Deshidratando && !Bandera) {   //Mientras la puerta este cerrada y la variable Desidratando sea verdadera.
+          h = dht.ReadHumidity();                          //Se lee la humedad
+ //         t = dht.ReadTemperature(0);                      //Se lee la temperatura: CELCIUS=0,FARENHEIT=1,KELVIN=2
+          Checar_Calefactor(Temp[FrutaD]);                 //Verifica sesores y enciende componentes.
+          Imprime_InfoSensores();                          //Impresion de informacion de sensores,
+          Imprime_Tiempo(7, 3);                            //Impresion de Tiempo.
+          if (Hor == 5 && Min == 30)                       //Tiempo Transcurrido es igual a 5:30:XX .
+            Bandera = 1;                                   // SI - Termina el proceso.
+        }
+      }
+    }
+    //Deshidratacion terminada.
+    TF = t;                                                //Almagenamos el valor final de temperatura.
+    HF = h;                                                //Almagenamos el valor final de humedad.
+    Deshidratando = 0;                                     //Indica que termina la deshidratacion.
+    Apagar_Calefactor();                                   //Apaga el calefactor.
+    Reporte_Des();                                         //Muestra reporte de deshidratacion.
+    return 1;                                              //Indicamos que termino la deshidratación.
+  }
+  else
+    return 0;                                            //Indica que no se inicio el proceso.
+}
+/*
+** ===================================================================
+**     Prototipo   :  inf_fruta() (Confugura pramatros de deshidratación)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Despliega en la LCD la informacion de la fruta seleccionada.
+**         Imprime el menú de estado en la pantalla LCD y actualiza
+**         los datos en tirmpo real.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  :
+**            uint16_t Fruit - recibe el numero de fruta contenido en los arreglos.
+**     Retorna     : valor BOOLEANO.
+**              0 - Continuar con deshidratacion.
+**              1 - Cancelar.
+** ===================================================================
+*/
+bool inf_fruta(int Fruit) {
+
+  //Colocamos variables en condiciones iniciales.
+  Opcion_Max = 0;                 //0 no existen opciones disponibles.
+  Init_Var();                     //Inicializamos variables
+
+  lcd.cls();                    //Limpiamos pantalla.
+  lcd.locate(0, 0);
+  lcd.printf(Fruta[Fruit]);        //Imprimimos nombre de fruta.
+  lcd.locate(0, 1);
+  lcd.printf("TEMPERATURA MAX: ");
+//  lcd.printf(Temp[Fruit]);         //Imprimimos temperatura maxima de fruta.
+  lcd.locate(0, 2);
+  lcd.printf("HUMEDAD MAX: ");
+//  lcd.printf(Hume[Fruit]);        //Imprimimos humedad maxima de fruta.
+  lcd.locate(0, 3);
+  lcd.printf("ATRAS             OK");
+
+  while (!Bandera) {            //Esperamos hasta que se presione algun boton (atras o adelante).
+    wait_ms(250);
+  }
+  if (Avanzar)                  //Verificamos si el Boton fue el de Avanzar.
+    return 1;
+  else
+    return 0;
+}
+/*
+** ===================================================================
+**     Prototipo   :  Puerta_Abierta() (Despliega info en la pantalla LCD)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Rutina que se ejecuta a la hora de abrir la puerta durante
+**         el proceso de deshidratación.
+**         Pone en pause el proceso hasta que se cierre nuevamente la
+**         puerta.
+**         Imprime el estado en la pantalla LCD.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+bool Puerta_Abierta() {
+  Init_Var();
+  CalefactorOFF();
+  lcd.cls();
+  lcd.locate(0, 0);
+  lcd.printf("PUERTA  ABIERTA");
+  lcd.locate(0, 1);
+  lcd.printf("    PROCESO");
+  lcd.locate(0, 2);
+  lcd.printf(" SUSPENDIDO");
+  wait_ms(5000);
+  lcd.cls();
+  lcd.locate(0, 0);
+  lcd.printf("    POR FAVOR   ");
+  lcd.locate(0, 1);
+  lcd.printf("     CIERRE");
+  lcd.locate(0, 2);
+  lcd.printf(" LA PUERTA");
+  lcd.locate(0, 3);
+  lcd.printf(" PARA CONTINUAR!");
+  
+  while (PuertaAb && !Avanzar)  //Mientras la puerta está abierta
+    wait_ms(250);
+  return !Avanzar;              //Se detiene el proceso
+}
+/*
+** ===================================================================
+**     Prototipo   :  Checar_Calefactor() (Verifica estado del calefactor)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Enciende o apaga de calefactor con ayuda de las variables de
+**         humedad y temperatura.
+**         Imprime el menú de estado en la pantalla LCD y actualiza
+**         los datos en tirmpo real.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Checar_Calefactor(int TempD) {
+  if ((t > (TempD - 2) && t < (TempD + 1)) || (h > 75))
+    MotorON(130);
+  else if (t < (TempD - 2) && (h <= 75))
+    MotorOFF();
+  else if (t >= (TempD + 1))
+    MotorON(196);
+
+  if (t <= (TempD - 1)) {       //Checa si el quemador esta apagado y su tempertatura es igual o menor que la temperatura de la fruta.
+    wait_ms(1000);                //Retardo de 1 seg.
+    CalefactorON();
+  }
+  else if (t >= (TempD + 1)) {  //Checa si el motor esta encendido y la si la temperatura es mayor a la maxima permitida
+    CalefactorOFF();
+    wait_ms(2000);                //retardo de 2 segundos.
+  }
+}
+/*
+** ===================================================================
+**     Prototipo   :  Apagar_Calefactor() (Apaga el calefactor)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Apaga de calefactor despues de haber terminado el proceso
+**         de deshidratacion.
+**         Imprime el menú de estado en la pantalla LCD y actualiza
+**         los datos en tirmpo real.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Apagar_Calefactor() {
+  lcd.cls();
+  lcd.locate(5, 0);
+  lcd.printf("ENFRIANDO");
+  lcd.locate(6, 1);
+  lcd.printf("SISTEMA");
+  lcd.locate(2, 2);
+  lcd.printf("ESPERE POR FAVOR");
+  lcd.locate(0, 3);
+  lcd.printf("TEMPERATURA: ");
+  CalefactorOFF();
+  //Enfriado del sistema
+  do {
+//    t = dht.ReadTemperature(0);    //Se lee la temperatura: CELCIUS=0, FARENHEIT=1, KELVIN=2
+    lcd.locate(13, 3);
+//    lcd.printf(t);
+    wait_ms(1000);
+  } while (t > 37);
+  MotorOFF();
+}
+/*
+** ===================================================================
+**     Prototipo   :  Reporte_Des() (Reporta el estado del proceso)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Despliega en la LCD valores finales de humedad, temperatura
+**         y tiempo total del proceso de deshidratación.
+**         Imprime el menú de estado en la pantalla LCD y actualiza
+**         los datos en tirmpo real.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Reporte_Des() {
+  //Colocamos variables en condiciones iniciales.
+  Opcion_Max = 0;                 //0 no existen opciones disponibles.
+  Init_Var();
+
+  lcd.cls();
+  lcd.locate(0, 0);
+  lcd.printf(" PROCESO TERMINADO");
+  lcd.locate(0, 1);
+  lcd.printf("TEMP. FINAL: ");
+//  lcd.printf(TF);
+  lcd.locate(0, 2);
+  lcd.printf("HUM. FINAL: ");
+//  lcd.printf(HF);
+  lcd.locate(0, 3);
+  lcd.printf("TIEMPO DES:");
+
+  Imprime_Tiempo(12, 3);
+  while (!Avanzar) {
+    wait_ms(250);
+  }
+
+}
+/*
+** ===================================================================
+**     Prototipo   :  Conf_Otro() (Configura parámetros de deshidratación)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Configura valores de opcion del menú: OTRO
+**         en el cual se puede seleccionar valores para la temperatura
+**         y humedad de otro alimento que se desee deshidratar.
+**         Imprime el menú de estado en la pantalla LCD y actualiza
+**         los datos en tirmpo real.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Conf_Otro() {
+ uint16_t MenuConf;
+ uint16_t Temp_Aux;
+ uint16_t Hume_Aux;
+  MenuConf = 1;
+  while (MenuConf) {                    
+    Init_Var();                         //se inicializan los valores
+    Scroll = 0;                         //No hay scroll.
+    Opcion_Ant = 1;                     //Iniciamos Opcion anterior = 1.
+    Opcion_Max = CONDALARM;             //Opciones iguales a las alarmas disponibles.
+
+    lcd.cls();                        //Limpiamos pantalla.
+    lcd.locate(1, 0);
+    lcd.printf("TEMPERATURA MAX: ");
+//    lcd.printf(Temp[NOFRUTAS - 1]);      //Imprimimos temperatura maxima de fruta.
+    lcd.locate(1, 1);
+    lcd.printf("HUMEDAD MAX: ");
+//    lcd.printf(Hume[NOFRUTAS - 1]);      //Imprimimos humedad maxima de fruta.
+    lcd.locate(0, 3);
+    lcd.printf("CANCELAR          OK");
+    Temp_Aux = Temp[NOFRUTAS - 1];      //Son guardadas en una variable auxiliar.
+    Hume_Aux = Hume[NOFRUTAS - 1];      //Humedad gurdada en una variable auxiliar
+    while (!Bandera) {
+      Imprime_Flecha();
+      if (Opcion == 1 && B_Derecho) {   //Opcion de temperatura DERECHA.
+        Temp_Aux++;                     //Incrementa tempertura de variable auxiliar.
+      }
+      else if (Opcion == 1 && B_Izquierdo) { //Opcion de temperatura IZQUIERDA.
+        Temp_Aux--;                      //Decrementa temperatura de la variable auxiliar.
+      }
+      else if (Opcion == 2 && B_Derecho) {   //Opcion de humedad DERECHA.
+        Hume_Aux++;                      //Incrementa humedad de la variable auxiliar.
+      }
+      else if (Opcion == 2 && B_Izquierdo) { //Opcion de humedad IZQUIERA.
+        Hume_Aux--;                      //Decrementa humedad de la variable auxiliar.
+      }
+      //Mostramos valores modificados.
+      lcd.locate(18, 0);
+//      lcd.printf(Temp_Aux);
+      lcd.locate(14, 1);
+//      lcd.printf(Hume_Aux);
+      wait_ms(250);
+    }
+    if (Avanzar) {                      //Si aprieta el boton OK
+      Temp[NOFRUTAS - 1] = Temp_Aux;    //Aplica cambio a variable original de temperatura.
+      Hume[NOFRUTAS - 1] = Hume_Aux;    //Aplica cambio a variable original de humedad.
+      lcd.cls();                      //Limpiamos pantalla.
+      lcd.locate(0, 1);
+      lcd.printf("      VALORES");
+//      lcd.printf(Temp[NOFRUTAS - 1]);    //Imprimimos temperatura maxima de fruta.
+      lcd.locate(1, 2);
+      lcd.printf("    ACTUALIZADOS");
+//      lcd.printf(Hume[NOFRUTAS - 1]);    //Imprimimos humedad maxima de fruta.
+      wait_ms(2000);
+    }
+    MenuConf = 0;
+  }
+}
+/*
+** ===================================================================
+**     Prototipo   :  Init_Cronometro() (Configura el cronómetro)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Configura valores iniciales del cronómetro.
+**         Imprime el menú de estado en la pantalla LCD y actualiza
+**         los datos en tirmpo real.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Init_Conometro() {
+  Seg = 0;
+  Min = 0;
+  Hor = 0;
+}
+/*
+** ===================================================================
+**     Prototipo   :  Conteo_Cronometro() (incrementa el cronómetro)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Incrementa variables que realizan el conteo del tiempo
+**         transcurrido del proceso de deshidratación.
+**         Imprime el menú de estado en la pantalla LCD y actualiza
+**         los datos en tirmpo real.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Conteo_Cronometro() {
+  NInterrupciones++;                        //Incrementa valor de interrupciones (Deacuerdo a la interrupcion se incrementa cada 250 ms).
+  if (NInterrupciones >= 4) {               //Al completar al menos 4 interrupciones (4x250ms=1S) tendriamos al menos 1s.
+    Seg++;                                  //Incrementamos el valor de la variable que almacena los segundos.
+    NInterrupciones = NInterrupciones - 4;  //Decrementamos las 4 interrupciones que representan el segundo.
+    if (Seg > 59) {                         //Si tenemos mas de 59 segundos...
+      Seg = 0;                              //Reiniciamos variable Seg.
+      Min++;                                //Incrementamos los minutos.
+      if (Min > 59) {                       //Si tenemos mas de 59 minutos...
+        Min = 0;                            //Reiniciams la variable Min.
+        Hor++;                              //Incrementamos el valor de las horas.
+      }
+    }
+  }
+}
+/*
+** ===================================================================
+**     Prototipo   :  ConfT2_PWM3() (configuración del PWM3)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Configuracion de Timer2 PARA MODO FAST PWM EN PIN 3.
+**     Argumentos  : Recibe varieble entera
+**           uint16_t DUTYCYCLE - Ciclo util del PWM
+**                            0=0%    255=100%
+**     Retorna     : Nada
+** ===================================================================
+*/
+void ConfT2_PWM3(int DUTYCYCLE) {
+  //TIMER2
+  
+//  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
+//  TCCR2B =  _BV(CS22) | _BV(CS21) | _BV(CS20);
+//  OCR2B = DUTYCYCLE;                                         //Ancho de pulso.
+  //Aqui termina configuración.
+}
+/*
+** ===================================================================
+**     Prototipo   :  CalefactorON() (Encendido del elemento Calefactor)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Enciende el elemento Calefactor.
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void CalefactorON() {
+  Quemador = 1;                      //Coloca en variable el valor 1.
+  PIN_QUEMADOR = HIGH;
+}
+/*
+** ===================================================================
+**     Prototipo   :  CalefactorOFF() (Apagado del elemento Calefactor)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Apaga el elemento Calefactor.
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void CalefactorOFF() {
+  Quemador = 0;                        //Colocamos en variable valor 0.
+  PIN_QUEMADOR = LOW;
+}
+/*
+** ===================================================================
+**     Prototipo   :  MotorON() (Enciende el Ventilador)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Enciende el ventilador del deshidratador.
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void MotorON(int CicloUtil) {
+  DC = CicloUtil;
+  Motor = 1;
+  PIN_MOTOR = DC;    //Encendemos Ventilador.
+}
+/*
+** ===================================================================
+**     Prototipo   :  MotorOFF() (Apaga el Ventilador)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Apaga el ventilador del deshidratador.
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void MotorOFF() {
+  Motor = 0;
+  PIN_MOTOR = 0;    //Apagamos Ventilador.
+}
+/*
+** ===================================================================
+**     Prototipo   :  Contacto() (Muestra info en la pantalla LCD)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Muestra en la pantalla información de contacto con los autores.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Contacto() {
+  Bandera = 0;
+  Avanzar = 0;
+  lcd.cls();
+  lcd.locate(0,0);
+  lcd.printf("ATEAM & TEAM-T Unltd");
+  lcd.locate(0, 1);
+  lcd.printf("Antulio Morgado Valle");
+  lcd.locate(0, 2);
+  lcd.printf("Raziel Lopez Escamilla");
+  lcd.locate(0, 3);
+  lcd.printf("IPN ESIME Zacatenco");
+  while (!Bandera)
+    wait_ms(250);
+}
+/*
+** ===================================================================
+**     Prototipo   :  Acerca() (Muestra info en la pantalla LCD)
+**     Componente  :  Cpu [MKL46Z256VLL]
+**     Descripción :
+**         Muestra en la pantalla información del prototipo y de los autores.
+**         Envia los respectivos mensajes y los despliega en la
+**         pantalla LCD.
+**         Limpia la interfaz del LCD
+**     Argumentos  : Ninguno
+**     Retorna     : Nada
+** ===================================================================
+*/
+void Acerca() {
+  Bandera = 0;
+  Avanzar = 0;
+  lcd.cls();
+  lcd.locate(0,0);
+  lcd.printf("PROTOTIPO ELABORADO ");
+  lcd.locate(0, 1);
+  lcd.printf("  POR PROFESORES Y ");
+  lcd.locate(0, 2);
+  lcd.printf("  ALUMNOS DE ESIME ");
+  lcd.locate(0, 3);
+  lcd.printf("Version: Beta");
+  while (!Bandera)
+    wait_ms(250);
+}