Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 |
--- 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;