Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- JulioDLuna
- Date:
- 2019-05-31
- Revision:
- 0:9f1d9b302ed4
- Child:
- 1:dfa13453f7d2
- Child:
- 2:ca7dc66b33ed
File content as of revision 0:9f1d9b302ed4:
/* ########################################################################### ** Archivo : main.c ** Proyecto : FRDM-KL46Z_Proyecto Ensamblado Baño Automático ** Procesador : MKL46Z256VLL4 ** Herramienta : Mbed ** Version : Driver 01.01 ** Compilador : GNU C Compiler ** Fecha/Hora : 14-07-2015, 11:48, # CodeGen: 0 ** Descripción : ** Componentes : GPIO, Timer, etc . ** Configuraciones : Includes, Stacks y Drivers externos ** Autores : ** ATEAM Development Group: Camacho Camacho Fermín Rodrigo Luna Villanueva Julio Daniel Sánchez Zarazua Edgar Omar ** - ** ** Versión : Beta ** Revisión : A ** Release : 0 ** Bugs & Fixes : ** Date : 20/10/2019 ** Added support for Led_RGB ** 22/09/2018 ** Added LCD Menu, Beta version (with bugs) ** ** ###########################################################################*/ /* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : Includes :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ #include "mbed.h" /* :............................................................................... : Definiciones :............................................................................... */ #define On 0 #define off 1 #define TRUE 1 #define FALSE 0 #define hold 2 // Estado para boton mantenido #define release 3 // Estado para boton liberado #define TRUE 1 #define FALSE 0 #define Ticker_Time 1000 // Tiempo del Ticker (us) #define Rate_Time 2 // Tiempo de Encendido de los Digitos (ms) #define Scan_Time 2 // Tiempo de Barrido del Display (ms) #define Shift_Time 2 // Tiempo de corrimiento (x Counter_Time) #define Counter_Time 100 // Tiempo de counter (ms) #define Size_String 20 // Tamaño del Buffer de Caracteres #define Digit_Null 0xFF // Valor para apagar los Segmentos #define Degree_Symbol 0x0F // Valor para el Símbolo de Grados /* +------------------------------------------------------------------------------- | Configuración de Puertos +------------------------------------------------------------------------------- */ Ticker Barrido; // Interrupción del Timer BusOut Anodos(PTA14, PTA15, PTA16, PTA17); // Salidas a los anodos del display: A4 A3 A2 A1 BusOut Catodos(PTE16, PTE17, PTE18, PTE19, PTE20, PTE21, PTE22, PTE23); // Salidas a los catodos: g f a b c d e p DigitalOut Green_Led (PTD5); // Led de Actividad del Programa DigitalOut Red_Led (PTE29); // Led de Actividad del Programa DigitalIn Selector_seguro(PTD3); DigitalIn Limit_switch(PTB20); DigitalOut Ventilador(PTD4); //Relé DigitalOut Luz(PTD7); //Relé DigitalOut Seguro(PTD6); //Relé DigitalOut Red(PTE6); DigitalOut Green(PTE3); DigitalOut Blue(PTE2); DigitalOut Buzzer(PTE31); /* +------------------------------------------------------------------------------- | Variables Globales de Usuario +------------------------------------------------------------------------------- */ uint16_t Rate=325; // 1000us=1ms uint8_t cont_1ms=0; uint8_t cont_10ms=0; uint8_t cont_100ms=0; uint8_t cont_1s=0; bool Flag1=FALSE; bool Flag2=FALSE; uint8_t u=0; //Para el DISPLAY de 7 segmentos: /*Para CATODO COMUN: // 0 1 2 3 4 5 6 7 8 9 A b C d E f G h I j K L M n o p q r S t u v w X y z //uint8_t Segmentos[]={0x7F,0x18,0xB6,0xBC,0xD8,0xEC,0xEE,0x38,0xFE,0xFC,0xFA,0xCE,0x66,0x9E,0xE6,0xE2,0x6E,0xCA,0x42,0x1C,0xD2,0x46,0x7A,0x8A,0x8E,0xF2,0xF8,0xC2,0xEC,0xC6,0x0E,0x1E,0x5E,0xDA,0xC8,0xB6}; // Millares,Centenas,Decenas,Unidades //uint8_t Digitos[]={0x0E, 0x0D, 0x0B, 0x07}; // Para descomponer el valor en multiplos //Multiplos[]={Millares,Centenas,Decenas,Unidades} Utilizar C.I. 74LS126 como Latch para c/u de los segmentos del Display*/ //Para ANODO COMUN: // 0 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 31 32 33 34 35 36 37 // 0 1 2 3 4 5 6 7 8 9 A b C d E f G h I j K L M n o p q r S t u v w X y z space - uint8_t Segmentos[]={0x81,0xE7,0x49,0x43,0x27,0x13,0x11,0xC7,0x01,0x03,0x05,0x31,0x99,0x61,0x19,0x1D,0x91,0x35,0xBD,0xB3,0x2D,0xB9,0x85,0x75,0x71,0x0D,0x07,0x3D,0x13,0x39,0xF1,0xE1,0xA1,0x25,0x37,0x49,0xFF,0x7F}; // Millares,Centenas,Decenas,Unidades uint8_t Digitos[]={0x01, 0x02, 0x04, 0x08, 0x00, 0xFF}; // Para descomponer el valor en multiplos //Multiplos[]={Millares,Centenas,Decenas,Unidades} //Utilizar C.I. 74LS125 como Latch para c/u de los segmentos del Display uint8_t Mensaje1[]={36,36,24,12,30,25,10,13,24,36,36,36}; // MENSAJE Ocupado uint8_t Mensaje2[]={36,36,13,18,28,25,24,23,18,11,21,14.36,36}; // MENSAJE Disponible uint8_t Mensaje3[]={36,36,11,18,14,23,31,14,23,18,13,24,36,36}; // MENSAJE Bienvenido uint8_t Numeros[]={11,10,23,24,36,36,36,36}; //MENSAJE INICIAL Bano uint8_t Cadena[]={11,18,14,23,31,14,23,18,13,24,36,36}; //BUFFER Bienvenidos uint8_t scan_rate = Scan_Time ; uint8_t shift_rate= Shift_Time; uint16_t counter=1250; uint8_t i=0; uint8_t nchar=0; bool flag1=FALSE; bool flag2=FALSE; bool mode=0; uint8_t punto_decimal=0; //Posición del Punto Decimal: 0=sin punto, 1=unidades, 2=decenas, 3=centemas 4=millares, uint8_t control=0; /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | Definición de los Vectores de Interrupción ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ void Barrido_OnInterrupt(void); /* ________________________________________________________________________________ | | Funciones Prototipo |_______________________________________________________________________________ */ // Las Funciones Prototipo van aquí ! bool BanoDisponible(void); bool BanoOcupado(void); bool PuertaAbierta(void); void Display(void); void Mensaje(void); /* #=============================================================================== | | P R O G R A M A P R I N C I P A L | #=============================================================================== */ ////////////////////////////// PROGRAMA PRINCIPAL ////////////////////////////////////////// int main() { Buzzer=1; wait(0.020); Buzzer=0; Red=0; Blue=1; Green=0; wait(0.5); Barrido.attach_us(&Barrido_OnInterrupt, Rate); // Le asigna el periodo de barrido cada 10 ms while(true) { if(Limit_switch==1 && Selector_seguro==0) { //Puerta Cerrada (BAÑO DISPONIBLE) Seguro=0; //Seguro desactivado BanoDisponible(); } if(Limit_switch==1 && Selector_seguro==1) { //Puerta Cerrada (BAÑO OCUPADO) Seguro=1; //Seguro activado BanoOcupado(); } if(Limit_switch==0 && Selector_seguro==0) { //Puerta Abierta Seguro=0; //Desactivado PuertaAbierta(); } // LLama al Barrido del Display if (flag1==TRUE) { if (mode==1) { Numeros[i]=Cadena[i+nchar]; // Aqui está el ptroblema!!!! if (nchar >= Size_String) nchar=0; // Restablece el contador de caractres if (i==4) { i=0; mode=0; // Nos vamos a modo 0 } } Anodos=Digitos[4]; // Apaga todos los Digitos (Evita fantasmas) Catodos=Segmentos[Numeros[i]]; // Actualiza los segmentos if (i==4) Catodos=(Segmentos[Numeros[i]]& 0xFE); // Enciende el punto decimal Anodos=Digitos[i]; // Activa el Digito en cuestión i++; // Apunta al siguiente dígito if (i==4) // Es el últino digito? { i=0; // Reinicia el Barriodo mode=0; // Nos vamos a modo 0 Red_Led=!Red_Led; // Parpadeo del Led Rojo } flag1=FALSE; // Apaga la Bandera 1 } if (flag2==TRUE) // Está puesta la Bandera 2? { shift_rate--; // Decrementa el contador de Corrimientos if (!shift_rate) // Es Cero? { mode=1; // Tiempo entre desplazamientos del mensaje shift_rate = Shift_Time; // Restablece el triempo de los corrimientos nchar++; // corrimiento al siguiente conjunto de de caracteres i=0; // Restablece el índice para comenzar el Barrido } Green_Led=!Green_Led; // Parpadeo del Led Verde flag2=FALSE; // Apaga la Bandera 2 } } // END while } // END main /* ................................................................................ : Rutinas de los Vectores de Interrupción ................................................................................ */ void Barrido_OnInterrupt(void) // Rutina de Atención al Ticker { //El servicio a la interrupcion van aqui! cont_1ms++; scan_rate++; counter--; if(scan_rate==4) { scan_rate=0; flag1=TRUE; } if (cont_1ms>=10) { cont_10ms++; cont_1ms=0; } if (cont_10ms>=10) { cont_100ms++; cont_10ms=0; } if (cont_100ms>=10) { cont_1s++; cont_100ms=0; } if (cont_1s>=10) { cont_1s=0; } if (!counter) { counter=300; flag2=TRUE; } } /* END Events */ // Rutinas de Atención a Interrupciones ////////////////////////// BARRIDO DEL DISPLAY //////////////////////////////////// void Display() { // Barrido del Display // /*if (Flag2==TRUE) { Anodos=Digitos[4]; // Evita Fantasmas Catodos=Segmentos[copia[i]]; Anodos=Digitos[i]; i++; if (i==4) { //PROBLEMA? i=0; } Flag1=FALSE; } */ } // End Display ////////////////////////// FUNCIONES ESTADO DEL BAÑO //////////////////////////////////// bool BanoDisponible() { Luz=0; Ventilador=0; //Luz y entilador apagados Seguro=0; //Seguro desactivado Green=0; Red=1; Blue=1; control=2; Mensaje(); return true; } bool BanoOcupado() { Luz=1; Ventilador=1; //Luz y ventilador encendidos Seguro=1; // Seguro Activado Red=0; Green=1; Blue=1; control=1; Mensaje(); return true; } bool PuertaAbierta() { Luz=1; Ventilador=1; Green=1; Red=0; Blue=0; control=3; Mensaje(); return true; } ////////////////////////// MENSAJES //////////////////////////////////// void Mensaje() { //corrimiento de mensaje// switch (control) { case 1: for(uint8_t o=0;o<=13;o++){ Cadena[o] = Mensaje1[o]; } break; case 2: for(uint8_t o=0;o<=13;o++){ Cadena[o] = Mensaje2[o]; } break; case 3: for(uint8_t o=0;o<=13;o++){ Cadena[o] = Mensaje3[o]; } break; } } // END Mbed