Programa del ejercicio 3 del TP1

Dependencies:   TSI TextLCD mbed

Fork of TP1_eje3_pruebas by Anto y Lu 2018

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