En este proyecto se realizará un dispositivo que me permita setear con un menú, el rango de temperatura que deseo que tenga un objeto

Dependencies:   mbed QEI DS1820

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;      
     }
     
 }