Gonzalo Martinez
/
TPTemp
DS1820
Revision 13:00b2578c91be, committed 2019-06-23
- Comitter:
- gonzaloMS
- Date:
- Sun Jun 23 03:42:38 2019 +0000
- Parent:
- 12:e057a9a873c8
- Commit message:
- Comentado
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r e057a9a873c8 -r 00b2578c91be main.cpp --- a/main.cpp Wed Jun 19 12:41:27 2019 +0000 +++ b/main.cpp Sun Jun 23 03:42:38 2019 +0000 @@ -1,64 +1,89 @@ -/* - * Simple example program - * - * Note: Don't forget to connect a 4.7k Ohm resistor - * between the DS1820's data pin and the +3.3V pin - * - */ - -/* Single DS1820 sensor: */ +//Sensor DS1820 y cooler con tres cables #include "mbed.h" +//Incluyo librería del sensor #include "DS1820.h" -enum{LC,LC2,LA1,LA2,MT,PRESET,VM}; +//Creo los estados de las máquinas de estados +enum{LC,LC2,LA,LA2,SENSOR,PRESET,MOTOR}; +// |--------------|------------| +// SELECCIONADOR VELOCIDAD -InterruptIn rpm(D2); -PwmOut velocidadMotor(A2); -AnalogIn poter(A1); -DigitalIn pulsonator(D5); +//Defino como Interrupt In la entrada de los pulsos de los RPM. Entra a la función asociada a esta entrada cada vez que detecta un flanco ascendente +InterruptIn Rpm(D2); +//Defino como PWM Out la salida que va al motor del cooler. Va a controlar la velocidad del mismo +PwmOut Motor(A2); +//Defino como Analog In la entrada que va a leer el valor analógico entregado por el preset/potenciómetro +AnalogIn Preset(A1); +//Pulsador que cambia entre Lazo Cerrado y Lazo Abierto +DigitalIn Pulsador(D5); -Ticker tiempo; +//Creo Ticker +Ticker mideTiempo; + +//Función asociada al Ticker +void cuentaTiempo(); //Cuenta el tiempo para sacar las Preset y saca las Preset -int tempo=0; +//Función que se ejecuta con el Interrupt In +void cuentaRpm(); //Cada vez que entra por un pulso le suma 1 a una variable. Esta se reinicia cuando ya pasó 1 segundo y se sacaron las Preset + +//Funciones que son las máquinas de estados +void seleccionModo(); +void velocidadMotor(); -void tiempoFuncion(); -void select(); -void worker(); -void cuentaRpm(); +//Variables que guardan los estados de las máquinas de estados +int estadoSeleccion; +int estadoVelocidad; -int lala=0; +//Variable que guarda el tiempo para contar las Preset +int tiempo=0; + +//Variable que guarda las veces que se entró a la función del Interrupt In por los pulsos que indican los Preset +int veces=0; + +//Variable que guarda el valor de las Preset int valorRpm=0; -int lc=1,la=2,does=la,previously=0; -float t=0,p=0,vem=0; -int pres; -int estadoSelect, estadoWorker; -float algo; + +//Constantes que indican ambos modos +const int lazoCerrado=1; +const int lazoAbierto=2; + +//Variable que guarda el modo en el que se está +int modo=lazoCerrado; -DigitalOut led(LED1); -DS1820 ds1820(A0); // substitute D8 with the actual pin name connected to the DS1820 sensor -float temp = 0; -int result = 0; -int pulsator; +//Variable que guarda el valor que indica la velocidad que tiene que tener el motor. Es un float que varía entre 0f (0V) y 1f(3,3V), teniendo en cuenta los valores intermedios +float valorVelocidad=0; +//Variable que guarda el valor que entra del preset, de 0f (0V) a 1f (3,3V) +float valorPreset; + +DigitalOut led(LED1); //Led que indica si se están recibiendo los datos de temperatura +DS1820 ds1820(A0); //Pin de datos del sensor de temperatura. Hay que ponerle una R de pull up de 4K7 a 3,3V +float temp = 0; //Variable que guarda la temperatura +int result = 0; //Variable para la conversión de los datos de temperatura int main() { - tiempo.attach(&tiempoFuncion,0.01); - rpm.rise(&cuentaRpm); + //Vinculo el ticker con su función + mideTiempo.attach(&cuentaTiempo,0.01); //Hace cuentaTiempo cada 10 milisegundos + //Vinculo el Interrupt In con su función + Rpm.rise(&cuentaRpm); //Entra en cuentaRpm cada vez que hay un flanco ascendente + //Si hay sensor, empieza la conversión if (ds1820.begin()) { while (1) { - velocidadMotor=vem; - pulsator=pulsonator; - algo=poter.read(); - select(); - worker(); + //Hago que el valor de velocidad que tiene que ser según el programa se muestre a la salida + Motor=valorVelocidad; + //Hago que el valor leído del preset se guarde en la variable correspondiente + valorPreset=Preset.read(); + //Llamo a las funciones de máquinas de estados + seleccionModo(); + velocidadMotor(); + //Acá está toda la parte de la lectura de la temperatura, con funciones propias de la librería incluída ds1820.startConversion(); // start temperature conversion from analog to digital wait(1); // let DS1820 complete the temperature conversion result = ds1820.read(temp); // read temperature from DS1820 and perform cyclic redundancy check (CRC) switch (result) { case 0: // no errors -> 'temp' contains the value of measured temperature printf("temp = %3.1f%cC\r\n", temp, 176); - printf("Velocidad Motor (0-1): %1.2f \n",vem); break; case 1: // no sensor present -> 'temp' was not updated @@ -76,125 +101,151 @@ printf("No DS1820 sensor found!\r\n"); } -void tiempoFuncion() +void cuentaRpm() { - if(lala!=0) + //Cada vez que se detecta un pulso de los Rpm, le suma 1 a veces + veces++; +} + +void cuentaTiempo() +{ + //Apenas empiezan a llegar pulsos empieza a contar el tiempo. Entra acá cada 10 milisegundos, o sea que tiempo va a ser 100 cuando halla pasado 1 segundo + if(veces!=0) { - tempo++; + tiempo++; } else { valorRpm=0; } - if(tempo/100==1) + //Cuando halla pasado 1 segundo, se ve la cantidad de veces que se entró a la función anterior y se la multiplica por 60 para sacar cuántas serían por minuto + //Esas son las revoluciones por minuto (RPM) + //Se reinicia veces y tiempo y se vuelve a realizar el proceso + if(tiempo/100==1) { - valorRpm=lala*60; - lala=0; - tempo=0; + valorRpm=veces*60; + veces=0; + tiempo=0; } } -void cuentaRpm() -{ - lala++; -} - -void select(){ - switch(estadoSelect) +void seleccionModo(){ + switch(estadoSeleccion) { + default: case LC: - does=lc; - if(pulsonator==0) + //Empieza en modo de lazo cerrado + modo=lazoCerrado; + //Si se presiona el pulsador, cambia al estado LA, sino se queda en este estado + if(Pulsador==0) { - estadoSelect=LC; - }else + estadoSeleccion=LC; + } + else { - estadoSelect=LA1; + estadoSeleccion=LA; } break; - case LA1: - does=la; - if(pulsonator==1) + case LA: + //Cambia al otro modo, el de lazo abierto + modo=lazoAbierto; + //Si se mantiene presionado el pulsador, continua en este estado + //Si se suelta el pulsador, cambia al estado LA2 + if(Pulsador==1) { - estadoSelect=LA1; - }else + estadoSeleccion=LA; + } + else { - estadoSelect=LA2; + estadoSeleccion=LA2; } break; case LA2: - does=la; - if(pulsonator==0) + //Se mantiene en el modo de lazo abierto + modo=lazoAbierto; + //Si no se presiona el pulsador, se mantiene en este estado + //Si se presiona el pulsador, cambia al estado LC2 + if(Pulsador==0) { - estadoSelect=LA2; - }else + estadoSeleccion=LA2; + } + else { - estadoSelect=LC2; + estadoSeleccion=LC2; } break; case LC2: - does=lc; - if(pulsonator==1) + //Se cambia al modo de lazo cerrado + modo=lazoCerrado; + //Si se mantiene presionado el pulsador, se mantiene en este estado + //Si se suelta el pulsador, vuelve al estado LC + if(Pulsador==1) { - estadoSelect=LC2; + estadoSeleccion=LC2; } else { - estadoSelect=LC; + estadoSeleccion=LC; } break; } } -void worker(){ - if(does==lc) +void velocidadMotor(){ + //Printf que indican el modo y el valor de las variables + if(modo==lazoCerrado) { printf("Lazo cerrado \n"); } - else if(does==la) + else if(modo==lazoAbierto) { printf("Lazo abierto \n"); } - printf("percentage: %3.3f%%\n", algo*100.0f); + printf("Velocidad Motor (0-1): %1.2f \n",valorVelocidad); + printf("percentage: %3.3f%%\n", valorPreset*100.0f); printf("RPM: %d \n\n",valorRpm); - switch(estadoWorker) + switch(estadoVelocidad) { default: - case MT: - if(does==lc) + case SENSOR: + //Si el modo es lazo cerrado, se cambia al estado de velocidad del motor (MOTOR). Sino, cambia al estado PRESET + if(modo==lazoCerrado) { - t=temp; - previously=0; - estadoWorker=VM; - }else + estadoVelocidad=MOTOR; + } + else { - estadoWorker=PRESET; + estadoVelocidad=PRESET; } break; case PRESET: - if(does==la) + //Si el modo es lazo abierto, se cambia al estado de velocidad del motor (MOTOR). Sino, cambia al estado SENSOR + if(modo==lazoAbierto) { - previously=1; - estadoWorker=VM; - }else + estadoVelocidad=MOTOR; + } + else { - estadoWorker=MT; + estadoVelocidad=SENSOR; } break; - case VM: - if(previously==0) + case MOTOR: + //Si el modo es lazo cerrado, la velocidad del motor es en base a la temperatura. Vuelve al estado inicial + if(modo==lazoCerrado) { - vem=t/float(100); - estadoWorker=MT; - }else + valorVelocidad=temp/float(100); + estadoVelocidad=SENSOR; + } + //Si el modo es lazo abierto, la velocidad del motor es en base al preset. Vuelve al estado de PRESET + else if(modo==lazoAbierto) { - vem=algo; - estadoWorker=PRESET; + valorVelocidad=valorPreset; + estadoVelocidad=PRESET; } break;