
Programa del ejercicio 3 del TP1
Dependencies: TSI TextLCD mbed
Fork of TP1_eje3_pruebas by
main.cpp
- Committer:
- AntoPR
- Date:
- 2018-05-03
- Revision:
- 1:3f6a40496afa
- Parent:
- 0:ab9c6ff1dbc0
- Child:
- 2:cf60169c5172
File content as of revision 1:3f6a40496afa:
#include "mbed.h" #include "TextLCD.h" #include "TSISensor.h" TextLCD lcd(PTA1,PTA2,PTD4,PTA12,PTA4,PTA5,TextLCD::LCD16x2); TSISensor tsi; Ticker tim1; Ticker tim2; /* Debug props */ DigitalOut d_set_led(LED1); DigitalOut buzzer(PTC8); DigitalOut alarma_led(PTC9); DigitalIn pull_setting(PTC3,PullUp);//sw_setting DigitalIn pull_mode(PTC0,PullUp);//sw_mode DigitalIn pull_enter(PTC7,PullUp);//sw_enter AnalogIn sensor(PTB0); DigitalOut calefactor(PTC4); enum{TEMP, TIME}; //MODE_BUTTON_ME enum{T_30MIN, T_1HORA, T_2HORAS}; //SET_OFF_TIME_ME enum{PRENDIDO, APAGADO, APAGADO_2}; //ALARMA_ME enum{SIN_PRESIONAR,ESPERA_TIMER,PRESIONADO,ESPERA_SOLTAR}; //ANTIREBOTE_ME enum{NO_SETEANDO, SETEANDO}; //SETEANDO_ME enum{WAIT,SETEADA};//SET_TEMP_SLIDER_ME enum{RES_ENCENDIDA,RES_APAGADA};//CONTROL_CALENTADOR_ME #define ALARMA_ON 1 //ALARMA_ME #define ALARMA_OFF 0 #define LED_ON 1 //ALARMA_ME #define LED_OFF 0 #define P_ON 0 //ANTIREBOTE_ME #define P_OFF 1 #define C_ON 1 //CONTROL_CALENTADOR_ME #define C_OFF 0 #define TEMP_MAX 100 #define SET_TEMPERATURA_INIT 25 #define TEMP_SET 0 #define ERROR_RANGE 2 #define TIME_OFF 1 #define DEBUG_TIME 100 //100 = TRUE (debug), 1 = FALSE (normal operation) #define MEDIA_HORA 1800/DEBUG_TIME #define UNA_HORA 3600/DEBUG_TIME #define DOS_HORAS 7200/DEBUG_TIME #define SET_OFF_TIME_INIT DOS_HORAS //cambiar a gusto #define UN_MINUTO 60/10 //10 for debug, 1 for normal operation #define ANTIREBOTE_TMO 10 void MODE_BUTTON_ME(); unsigned char mode_estado = TEMP; unsigned char mode = 0; unsigned int hor=0,minu=0,seg=0; void SET_OFF_TIME_ME(); unsigned char set_off_time_estado = T_30MIN; void SET_TEMP_SLIDER_ME(void); unsigned char set_temp_slider_estado=WAIT; unsigned char t=0; unsigned char set_temperatura=SET_TEMPERATURA_INIT; void CONTROL_CALENTADOR_ME(void); unsigned char control_calentador_estado = RES_ENCENDIDA; float temp_real = 0; void ALARMA_ME(); unsigned char alarma_estado = APAGADO; void time_off(); unsigned int set_off_time_tmo = SET_OFF_TIME_INIT; unsigned int bz_tmo = SET_OFF_TIME_INIT - UN_MINUTO; void SETTING_ANTIREBOTE_ME (void); unsigned char setting_antirebote_estado = SIN_PRESIONAR; unsigned char sw_setting = 0; unsigned char seteando=0; void SETEANDO_ME(void); unsigned char seteando_estado=NO_SETEANDO; void MODE_ANTIREBOTE_ME (void); unsigned char mode_antirebote_estado = SIN_PRESIONAR; unsigned char sw_mode = 0; void ENTER_ANTIREBOTE_ME(void); unsigned char enter_antirebote_estado = SIN_PRESIONAR; unsigned char sw_enter = 0; void t_10ms_antirebote(void); unsigned char setting_antirebote_tmo=0; unsigned char mode_antirebote_tmo=0; unsigned char enter_antirebote_tmo=0; int main() { tim1.attach(&time_off,1); tim2.attach(&t_10ms_antirebote,0.01); wait(1); while(1) { SETTING_ANTIREBOTE_ME(); MODE_ANTIREBOTE_ME(); ENTER_ANTIREBOTE_ME(); SETEANDO_ME(); wait(0.05); MODE_BUTTON_ME(); wait(0.05); SET_TEMP_SLIDER_ME(); wait(0.05); SET_OFF_TIME_ME(); wait(0.05); CONTROL_CALENTADOR_ME(); wait(0.01); ALARMA_ME(); } } void time_off(){ if (set_off_time_tmo>0) set_off_time_tmo--; if(bz_tmo>0) bz_tmo--; } void t_10ms_antirebote (){ if(setting_antirebote_tmo > 0) setting_antirebote_tmo--; if(mode_antirebote_tmo > 0) mode_antirebote_tmo--; if(enter_antirebote_tmo > 0) enter_antirebote_tmo--; } void SETEANDO_ME(){ switch(seteando_estado){ default: case NO_SETEANDO: seteando=0; d_set_led=1;// debug led off lcd.locate(14,0); lcd.printf("NS"); if(sw_setting==1){ seteando_estado=SETEANDO; /* RESET DE SET_TEMP_SLIDER_ME y ALARMA_ME */ set_temp_slider_estado=WAIT; } break; case SETEANDO: seteando=1; d_set_led=0;//debug led on lcd.locate(14,0); lcd.printf(" S"); if(sw_setting==1){ seteando_estado=NO_SETEANDO; } break; }//cierra sw }//cierra SETEANDO_ME void MODE_BUTTON_ME(){ switch (mode_estado){ default: case TEMP: mode=TEMP_SET; //lcd.cls(); lcd.locate(0,0); lcd.printf("TEMP SET: "); lcd.locate(10,0); if(seteando==0){ lcd.printf("%d ",set_temperatura); } if (sw_mode==1){ mode_estado=TIME; } break; case TIME: mode=TIME_OFF; //lcd.cls(); lcd.locate(0,0); lcd.printf("TIEMPO OFF: "); lcd.locate(0,1); if(seteando==0){ hor = (int)(set_off_time_tmo / 3600); minu = (int)((set_off_time_tmo - hor * 3600) / 60); seg = set_off_time_tmo - (hor * 3600 + minu * 60); lcd.printf("%02d:%02d:%02d ",hor,minu,seg); } if (sw_mode==1){ mode_estado=TEMP; } break; }//cierra sw }//cierra MODE_BUTTON_ME void SET_OFF_TIME_ME(){ if(seteando==1){ if(mode==TIME_OFF){ switch (set_off_time_estado){ default: case T_30MIN: set_off_time_tmo=MEDIA_HORA; //EN SEG lcd.printf("30 minutos "); if(sw_enter==1){ set_off_time_estado=T_1HORA; } break; case T_1HORA: set_off_time_tmo=UNA_HORA; //EN SEG lcd.printf("1 hora "); if(sw_enter==1){ set_off_time_estado=T_2HORAS; } break; case T_2HORAS: set_off_time_tmo=DOS_HORAS; //EN SEG lcd.printf("2 horas "); if(sw_enter==1){ set_off_time_estado=T_30MIN; } break; }//cierra sw bz_tmo = set_off_time_tmo - UN_MINUTO; //la alarma debe sonar 1 minuto antes de apagarse wait(0.1); }//cierra if mode }//cierra if seteando }//cierra SET_OFF_TIME_ME void SET_TEMP_SLIDER_ME(){ if(seteando==1){ if(mode==TEMP_SET){ switch(set_temp_slider_estado){ default: case WAIT: t = (tsi.readDistance() * TEMP_MAX) / 40; lcd.printf("%d ",t); if(sw_enter == 1){ set_temperatura = t; set_temp_slider_estado=SETEADA; } break; case SETEADA: lcd.printf("%d ",set_temperatura); /*if(sw_setting == 1) set_temp_slider_estado=WAIT;*/ break; }//cierra sw }//cierra if mode }//cierra if seteando }//cierra SET_TEMP_SLIDER_ME void CONTROL_CALENTADOR_ME(){ switch(control_calentador_estado){ default: case RES_ENCENDIDA: calefactor= C_ON; temp_real = sensor.read()*TEMP_MAX; if(mode==TEMP){ lcd.locate(0,1); lcd.printf("TEMP REAL: %02.2f",temp_real); } if(temp_real > (set_temperatura + ERROR_RANGE)){ control_calentador_estado = RES_APAGADA; } break; case RES_APAGADA: calefactor=C_OFF; temp_real = sensor.read()*TEMP_MAX; if(mode==TEMP){ lcd.locate(0,1); lcd.printf("TEMP REAL: %02.2f",temp_real); } if(temp_real < (set_temperatura - ERROR_RANGE)){ control_calentador_estado = RES_ENCENDIDA; } break; }//cierra sw }//cierra CONTROL_CALENTADOR_ME void ALARMA_ME(){ switch(alarma_estado){ default: case APAGADO: buzzer=0;//off alarma_led=LED_OFF; if(bz_tmo==0){ alarma_estado=PRENDIDO; bz_tmo=2;//2 segundos on } break; case PRENDIDO: buzzer=1;//on alarma_led = LED_ON; if(bz_tmo==0){ alarma_estado=APAGADO_2; } break; case APAGADO_2: buzzer=0;//off alarma_led=LED_ON; if(sw_setting==1){ set_off_time_tmo = SET_OFF_TIME_INIT; bz_tmo = SET_OFF_TIME_INIT - UN_MINUTO; alarma_estado=APAGADO; } break; }//cierra sw }//cierra ME void SETTING_ANTIREBOTE_ME(){ switch(setting_antirebote_estado){ default: case SIN_PRESIONAR: sw_setting = 0; if(pull_setting==P_ON){ setting_antirebote_estado = ESPERA_TIMER; setting_antirebote_tmo = ANTIREBOTE_TMO; } break; case ESPERA_TIMER: sw_setting = 0; if(setting_antirebote_tmo == 0){ if(pull_setting==P_ON) setting_antirebote_estado = PRESIONADO; else setting_antirebote_estado = SIN_PRESIONAR; } break; case PRESIONADO: sw_setting = 1; setting_antirebote_estado = ESPERA_SOLTAR; break; case ESPERA_SOLTAR: sw_setting = 0; if(pull_setting == P_OFF) setting_antirebote_estado = SIN_PRESIONAR; break; }//ciera sw }//cierra ANTIREBOTE_ME void MODE_ANTIREBOTE_ME(){ switch(mode_antirebote_estado){ default: case SIN_PRESIONAR: sw_mode = 0; if(pull_mode==P_ON){ mode_antirebote_estado = ESPERA_TIMER; mode_antirebote_tmo = ANTIREBOTE_TMO; } break; case ESPERA_TIMER: sw_mode = 0; if(mode_antirebote_tmo == 0){ if(pull_mode==P_ON) mode_antirebote_estado = PRESIONADO; else mode_antirebote_estado = SIN_PRESIONAR; } break; case PRESIONADO: sw_mode = 1; mode_antirebote_estado = ESPERA_SOLTAR; break; case ESPERA_SOLTAR: sw_mode = 0; if(pull_mode == P_OFF) mode_antirebote_estado = SIN_PRESIONAR; break; }//ciera sw }//cierra ANTIREBOTE_ME void ENTER_ANTIREBOTE_ME(){ switch(enter_antirebote_estado){ default: case SIN_PRESIONAR: sw_enter = 0; if(pull_enter==P_ON){ enter_antirebote_estado = ESPERA_TIMER; enter_antirebote_tmo = ANTIREBOTE_TMO; } break; case ESPERA_TIMER: sw_enter = 0; if(enter_antirebote_tmo == 0){ if(pull_enter==P_ON) enter_antirebote_estado = PRESIONADO; else enter_antirebote_estado = SIN_PRESIONAR; } break; case PRESIONADO: sw_enter = 1; enter_antirebote_estado = ESPERA_SOLTAR; break; case ESPERA_SOLTAR: sw_enter = 0; if(pull_enter == P_OFF) enter_antirebote_estado = SIN_PRESIONAR; break; }//ciera sw }//cierra ANTIREBOTE_ME