En este proyecto se realizará un dispositivo que me permita setear con un menú, el rango de temperatura que deseo que tenga un objeto
main.cpp
- Committer:
- CecileDenoy
- Date:
- 2019-09-26
- Revision:
- 6:b3ef00edb541
- Parent:
- 5:74abbdf4c68a
- Child:
- 7:1e1ce686b124
File content as of revision 6:b3ef00edb541:
#define MULTIPLE_PROBES #define DATA_PIN A0 #include "mbed.h" #include "DS1820.h" #include "QEI.h" #include "DebounceIn.h" #define MAX_PROBES 16 #define ON 0 #define OFF 1 #define letraT 10 #define letraC 11 #define guion 12 enum pantalla{MUESTRA_ACTUAL=0 , MUESTRA_T1, MUESTRA_T2 ,MUESTRA_TC, MODIFICO_T1 , MODIFICO_T2, MODIFICO_TC}; QEI wheel (PTA17, PTA16, NC, 624);//giros del encoder //Segmentos Displays DigitalOut PUNTO(PTE31); DigitalOut segmento_A(PTC0); DigitalOut segmento_B(PTB8); DigitalOut segmento_C(PTB9); DigitalOut segmento_D(PTC3); DigitalOut segmento_E(PTC4); DigitalOut segmento_F(PTC5); DigitalOut segmento_G(PTC6); // Habilitaciones displays DigitalOut hab1(PTD7); DigitalOut hab2(PTD6); //Encoder DigitalIn A (PTB10); DigitalIn B (PTB11); //Pulsador Encoder DigitalIn pulsador(A1); Ticker temp_1; Ticker temp_2; Ticker temp_3; unsigned char giro_horario=0; unsigned char giro_antihorario=0; int valor=91,anterior=0; unsigned char decena=0; unsigned char unidad=0; unsigned char estado_encoder=0; unsigned char nuevo_t1=0, nuevo_t2=0, nuevo_tc=0; unsigned char display[13]={ 0b11000000, //0 0b11111001, //1 0b10100100, //2 0b10110000, //3 0b10011001, //4 0b10010010, //5 0b10000010, //6 0b11111000, //7 0b10000000, //8 0b10011000, //9 0b10000111, //t 0b10100111, //c 0b10111111 // - }; //DECLARO VARIABLES int tiempo=0,temp_actual=0,modo=0, estado_display=0; int temp=0,dec=0,uni=0; DS1820* probe[MAX_PROBES]; //DECLARO FUNCIONES void detecto_sentido_de_giro(); //SENTIDO GIRO DEL ENCODER void encoder(); //FUNCIONAMIENTO ENCODER void interrumpe(); void muestreo_display(unsigned char numero); //VALORES EN EL DISPLAY void funcion_muestradisplay(); //HABILITACIONES DE LOS DISPLAYS void display_t1(); //MUESTRA "T1" EN DISPLAY void display_t2(); //MUESTRA "T2" EN DISPLAY void display_tc(); // MUESTRA "TC" EN DISPLAY void mostrar_display(unsigned char cosa); // SEPARO EN DECENAS Y UNIDADES LOS DISPLAYS int leo_temperatura(); // LEO TEMPERATURA SENSADA void inicializo_sensor_temp(); void temperatura_act(); //OBTENGO VALOR DE LA TEMPERATURA ACTUAL void m_e_display(); //MAQUINA DE ESTADOS DEL "MENU" DEL DISPLAY int main() { inicializo_sensor_temp(); temp_1.attach(&funcion_muestradisplay, 0.001); temp_2.attach(&interrumpe, 0.001); while(1) { temperatura_act(); encoder(); m_e_display(); } } //Funciones void detecto_sentido_de_giro(void){ if(anterior<valor){ giro_horario=1; giro_antihorario=0; } if(anterior>valor){ giro_horario=0; giro_antihorario=1; } if(anterior==valor){ giro_horario=0; giro_antihorario=0; } } void encoder(void){ if(valor<99&&valor>0){ valor=wheel.getPulses(); detecto_sentido_de_giro(); anterior=valor; } else{ valor=wheel.getPulses(); if(valor>99)valor=99;//si es mayor que 99 que muestre 99 if(valor<0)valor=0; } } void interrumpe(){ if(tiempo>0)tiempo--; } void muestreo_display(unsigned char numero){ segmento_A=display[numero]&0b00000001; segmento_B=(display[numero]&0b00000010)>>1; segmento_C=(display[numero]&0b00000100)>>2; segmento_D=(display[numero]&0b00001000)>>3; segmento_E=(display[numero]&0b00010000)>>4; segmento_F=(display[numero]&0b00100000)>>5; segmento_G=(display[numero]&0b01000000)>>6; } void funcion_muestradisplay(){//10mS if(hab1==ON){ hab1=OFF; hab2=OFF; muestreo_display(decena); hab1=OFF; hab2=ON; }else{ hab1=OFF; hab2=OFF; muestreo_display(unidad); hab1=ON; hab2=OFF; } } void display_t1(void){ decena=letraT; unidad=1; funcion_muestradisplay(); } void display_t2(void){ decena=letraT; unidad=2; funcion_muestradisplay(); } void display_tc(void){ decena=letraT; unidad=letraC; funcion_muestradisplay(); } void mostrar_display(unsigned char temp_3){ decena=temp_3/10; unidad=temp_3%10; } int leo_temperatura(void){ int grados=0; probe[0]->convertTemperature(false, DS1820::all_devices); //Start temperature conversion, wait until ready grados=probe[0]->temperature(); return grados; } void inicializo_sensor_temp(void){ // Initialize the probe array to DS1820 objects int num_devices = 0; while(DS1820::unassignedProbe(DATA_PIN)) { probe[num_devices] = new DS1820(DATA_PIN); num_devices++; if (num_devices == MAX_PROBES) break; } } void temperatura_act(void){ if(tiempo==0){ tiempo=50; temp=leo_temperatura(); if(temp>0&&temp<99){//solo valores que se pueden mostrar por el display (0-99) dec=(temp/10); uni=(temp%10); } } temp_actual=dec*10+uni; } void m_e_display(void){ switch(estado_display){ case MUESTRA_ACTUAL: temperatura_act();//Sensa la temperatura y la vuelca en la variable temp actual mostrar_display(temp_actual);//Muestra temperatura actual hasta que se presina el pulsador y va al menu if(pulsador==ON) estado_display=MUESTRA_T1; //Se presiona el pulsador, entonces se accede al menu break; case MUESTRA_T1: //Comienza el menu mostrando opcion para configurar T1 (temperatura inferior) display_t1();//muestra t1 if(pulsador==ON){ valor = nuevo_t1; estado_display=MODIFICO_T1; //Al presionar por segunda vez, se puede modificar el valor de T1 con el encoder } if(giro_horario==1) estado_display=MUESTRA_T2;// Si se gira en sentido horario se accede a la configuracion de T2 if(giro_antihorario==1) estado_display=MUESTRA_TC;//Si se gira en sentido antihorario se mostrará la temperatura actual break; case MUESTRA_T2: display_t2();//muestra t2 if(pulsador==ON) estado_display=MODIFICO_T2;//Al presionar por segunda vez, se puede modificar el valor de T2 con el encoder if(giro_horario==1) estado_display=MUESTRA_TC; // Si se gira en sentido horario se accede a la configuracion de TC if(giro_antihorario==1) estado_display=MUESTRA_T1;// Si se gira en sentido antihorario se accede a la configuracion de T1 break; case MUESTRA_TC: display_tc();//muestra tc if(pulsador==ON) estado_display=MODIFICO_TC; //Al presionar por segunda vez, se puede modificar el valor de TC con el encoder if(giro_horario==1) estado_display=MUESTRA_T1;// Si se gira en sentido horario se muestra en el display la temperatura actual if(giro_antihorario==1) estado_display=MUESTRA_T2;// Si se gira en sentido antihorario se accede a la configuracion de T2 break; case MODIFICO_T1: nuevo_t1=valor; mostrar_display(nuevo_t1);//muestra if(pulsador==ON){ estado_display=MUESTRA_T2; //Configuro T1 y muestro T2 valor=0; } break; case MODIFICO_T2: nuevo_t2=valor; mostrar_display(nuevo_t2);//muestra if(pulsador==ON) { estado_display=MUESTRA_TC; //Configuro T2 y muestro TC valor=0; } break; case MODIFICO_TC: nuevo_tc=valor; mostrar_display(nuevo_tc);//muestra tc if(pulsador==ON) {estado_display=MUESTRA_ACTUAL; //Configuro TC y muestro Temp actual valor=0;} break; } }