Punto 3 del TP1: Aire Acondicionado
Dependencies: DS18B20_1wire TextLCD mbed
main.cpp
- Committer:
- Joacolopez22
- Date:
- 2018-05-31
- Revision:
- 0:c9d0c42dc7f2
File content as of revision 0:c9d0c42dc7f2:
#include "mbed.h" #include "TextLCD.h" //ENTRADAS Y SALIDAS DigitalIn PULS_SUMA(PTC17); DigitalIn PULS_RESTA(PTC6); DigitalIn PULS_MODO(PTC12); DigitalIn PULS_ENCENDIDO(PTC16); DigitalOut ROJO(LED1); DigitalOut AZUL(LED3); TextLCD lcd(PTC7,PTB1,PTB2,PTB3,PTC2,PTC1, TextLCD::LCD20x4); // rs, e, d4-d7 AnalogIn ADC(PTB0); //ENUMS MAQUINA AIRE // enum {APAGADO, ESPERA_CALOR, CALOR , FRIO, ESPERA_FRIO,NO_GIRA,IZQUIERDA }; // ENUMS MAQUINA ANTIRREBOTE // enum { SUELTO, QUIZAS_PRESIONADO, PRESIONADO, QUIZAS_SUELTO }; //ENUMS MAQUINA DETECTOR DE FLANCOS // enum { NO_PRESIONADO, APRETADO, DEJO_APRETAR }; //OBJETOS // Ticker temporizador; Ticker med; //PROTOCOLOS // void AIRE_Control(int pulsa); int PULS_Antirrebote(void); int DETECTOR_Flancos(int maq_antirrebote); void Set_tempe(int m); void timer (void); void Medicion_tempe(void); void Manejo_display(int pul); //VARIABLES unsigned char AIRE_estado = APAGADO; unsigned char DETECTOR_estado = NO_PRESIONADO; unsigned char PULS_estado = SUELTO; int a = 0; int b = 0; int timeout = 0; int tempe_medida_anterior = 0; int tempe_medida = 0; int tempe_set = 20; int modo = 0; // Variable utilizada en maquina AIRE_Control // int pulsador =0 ; // Variable usada para maquina PULS_Antirrebote // int p =0; // Variable devuelta por maquina PULS_Antirrebote // int puls=0 ; // Variable devuelta por maquina DETECTOR_Flancos // int y = 0; // Variable utilizada en funcion manejo_display // //MAIN int main() { ROJO = 1; // Led rojo apagado // AZUL = 1; // Led azul apagado // temporizador.attach(&timer,0.001); med.attach(&Medicion_tempe, 1); while(1) { a = PULS_Antirrebote(); b = DETECTOR_Flancos(a); AIRE_Control(b); if(y == 1) { Set_tempe(b); } tempe_medida = (ADC*30); Manejo_display(b); } } void AIRE_Control (int pulsa) // Maneja los estados del Aire // { switch (AIRE_estado) { case APAGADO: if(pulsa == 4) { AIRE_estado=FRIO; } AZUL = 1; // Led azul apagado // ROJO = 1; // Led rojo apagado // modo = 0; break; case FRIO: if(pulsa == 4) { AIRE_estado = APAGADO; } if(pulsa == 3) { AIRE_estado = CALOR; } if(tempe_medida <= tempe_set) { AIRE_estado = ESPERA_FRIO; } AZUL = 0; // Led azul prendido // ROJO = 1; // Led rojo apagado // modo = 1; break; case CALOR: if(pulsa == 4) { AIRE_estado = APAGADO; } if(pulsa == 3) { AIRE_estado = FRIO; } if(tempe_medida >= tempe_set) { AIRE_estado = ESPERA_CALOR; } AZUL = 1; // Led azul apagado // ROJO = 0; // Led rojo prendido // modo = 2; break; case ESPERA_CALOR: if(tempe_medida == (tempe_set-2)) { AIRE_estado = CALOR; } if(pulsa == 4) { AIRE_estado=APAGADO; } if(pulsa == 3) { AIRE_estado = FRIO; } AZUL = 1; // Led azul apagado // ROJO = 1; // Led rpjo apagado // modo = 2; break; case ESPERA_FRIO: if(tempe_medida == (tempe_set+2)) { AIRE_estado = FRIO; } if(pulsa == 4) { AIRE_estado =APAGADO; } if(pulsa == 3) { AIRE_estado = CALOR; } AZUL = 1; // Led azul apagado // ROJO = 1; // Led rojo apagado // modo = 1; break; } } int PULS_Antirrebote(void) // Elimina el rebote del pulsador. Devuelve "0" si ningun { // pulsador fue presionado. Si se presiona un pulsador devuelve "1", if (PULS_SUMA == 1) { // "2","3" o "4" dependiendo de que pulsador fue presionado. pulsador = PULS_SUMA ; } if (PULS_RESTA == 1) { pulsador = PULS_RESTA ; } if (PULS_MODO == 1) { pulsador = PULS_MODO ; } if (PULS_ENCENDIDO == 1) { pulsador = PULS_ENCENDIDO ; } if (PULS_SUMA == 0 && PULS_RESTA == 0 && PULS_MODO == 0 && PULS_ENCENDIDO == 0) { pulsador = 0; } switch (PULS_estado) { default: case SUELTO: p = 0; if (pulsador == 1) { PULS_estado = QUIZAS_PRESIONADO; timeout = 30; } break; case QUIZAS_PRESIONADO: p = 0; if (timeout == 0 && pulsador == 1) { PULS_estado = PRESIONADO; } if (timeout == 0 && pulsador == 0) { PULS_estado = SUELTO; } break; case PRESIONADO: if (pulsador == PULS_SUMA) { p = 1; } if (pulsador == PULS_RESTA) { p = 2; } if (pulsador == PULS_MODO) { p = 3; } if (pulsador == PULS_ENCENDIDO) { p = 4; } if (pulsador == 0) { PULS_estado = QUIZAS_SUELTO; timeout = 30; } break; case QUIZAS_SUELTO: if (pulsador == PULS_SUMA) { p = 1; } if (pulsador == PULS_RESTA) { p = 2; } if (pulsador == PULS_MODO) { p = 3; } if (pulsador == PULS_ENCENDIDO) { p = 4; } if (timeout == 0 && pulsador == 1) { PULS_estado = PRESIONADO; } if (timeout == 0 && pulsador == 0) { PULS_estado = SUELTO; } break; } return p; } int DETECTOR_Flancos(int antirrebote) // Entrega un solo "1", un solo "2", un solo "3" o un solo "4" { // cada vez que se presiona un pulsador, dependiendo de cual fue. switch(DETECTOR_estado) { // Si no se presiona ningún pulsador devuelve "0". case NO_PRESIONADO: puls=0; if(antirrebote != 0) { DETECTOR_estado = APRETADO; } break; case APRETADO: if (antirrebote == 1) { puls = 1; } if (antirrebote == 2) { puls = 2; } if (antirrebote == 3) { puls = 3; } if (antirrebote == 4) { puls = 4; } DETECTOR_estado = DEJO_APRETAR; break; case DEJO_APRETAR: puls = 0; if(antirrebote == 0) { DETECTOR_estado = NO_PRESIONADO; } break; } return puls; } void Set_tempe(int m) // Incrementa o decrementa el valor de la temperatura { // seteada de acuerdo al valor de la variable "m" if(m == 1) { // (entregada por el detector de flancos). tempe_set++; } if(m == 2) { tempe_set--; } } void timer (void) { if (timeout >0) timeout--; } void Manejo_display(int pul) // Maneja el LCD // { if(pul == 4) { // Si se toca el pulsador de encendido...// y++; } if (y == 2) { y = 0; } if (y == 1) { // Cuando el Aire está prendido // lcd.TextLCD::locate(0, 0); lcd.printf("MODO:"); lcd.TextLCD::locate(0, 1); lcd.printf("Temp medida: %d", tempe_medida); lcd.TextLCD::locate(0, 2); lcd.printf("Temp seteada: %d", tempe_set ); } if(y == 0) { // Cuando el Aire está apagado // lcd.cls(); } if(pul == 1|| pul == 2) { // Si se incrementa o decrementa la lcd.locate(14,2); // temperatura seteada... lcd.printf("%d ",tempe_set); } if(modo == 1) { // Si la maquina AIRE_Control está en lcd.TextLCD::locate(6, 0); // estado FRIO... lcd.printf("FRIO "); } if(modo == 2) { lcd.TextLCD::locate(6, 0); // Si la maquina AIRE_Control está en lcd.printf("CALOR"); // estado CALOR... } if(tempe_medida_anterior != tempe_medida) { // Si cambia la temperatura medida.... lcd.locate(13,1); lcd.printf("%d ",tempe_medida); } } void Medicion_tempe(void) { tempe_medida_anterior = tempe_medida; }