Pio IX 6ºTecnica - Integrantes: Facundo Carmona, Facundo Sussini - Controlador de cooler mediante un DS1820 y un potenciometro

Dependencies:   mbed DS1820

Revision:
5:6515379eac2f
Parent:
3:f483abe4bc57
Child:
6:90322c14f783
--- a/main.cpp	Fri Jan 13 18:30:37 2017 +0000
+++ b/main.cpp	Tue Jun 04 12:07:04 2019 +0000
@@ -1,49 +1,232 @@
-#define MULTIPLE_PROBES
-#define DATA_PIN        A0
-
-
-#ifdef MULTIPLE_PROBES
 
 #include "mbed.h"
 #include "DS1820.h"
+#define DATA_PIN        A0
 
-#define MAX_PROBES      16
- 
-DS1820* probe[MAX_PROBES];
- 
-int main() {  
-    // 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)
+#define abierto 0
+#define minimo 1
+#define lineal 2
+#define maximo 3
+#define error 4
+
+//ejemplo
+PwmOut g(LED_GREEN);
+
+/* defino la funcion principal */
+void sensorsito();
+
+/* defino las funciones, ticker y las variables de las vueltas */
+
+void pulsos();
+
+
+char  hall=0, vueltas=0, arranque=0;
+void contador2();
+void pulsadorsito2();
+char  salida2=0,cuenta2=0, PIN2=0;
+Ticker ti2;
+DigitalIn pin2(A4,PullUp);
+
+/* defino lo relacionado al sensor de temperatura y el cooler */
+DS1820 probe(DATA_PIN);
+AnalogIn ADC(A1); // definimos la entrada de ADC
+PwmOut velocidad(A2);
+int temperatura=0,sensor=1;
+uint16_t adcValue; // nos da un rango entre 0-65535
+float voltage, porcentageADC,porcentajetemperatura; // definimos el voltaje y el porcentaje
+
+/* defino la fucion , ticker y las variables del pulsador1-- en este caso voy a hacer que la salida se invierta en vez de un pulso  */
+void pulsadorsito1();
+void contador1();
+DigitalIn pin1(A3,PullUp);
+char  salida1=0,cuenta1=0, PIN1=0;
+Ticker ti1;
+
+int main()
+{
+    //ejemplo
+    g.period(0.0025f);
+    
+    /* defino los tickers */
+    ti1.attach(&contador1, 0.001);
+    ti2.attach(&contador2, 0.001);
+    
+    /* frecuencia de PWM del cooler */
+    velocidad.period(0.0025f); // 400hz
+
+    while(1) {
+        adcValue=ADC.read_u16(); // ponemos el valor del ADC en la variable tipo uint16_t
+        voltage=adcValue*3.3 / 65535; // convertimos el valor de ADC a volts
+        porcentageADC = voltage*100 / 3.3; // con el valor en volts podemos saber el porcentaje del ADC
+    
+        probe.convertTemperature(true, DS1820::all_devices);         //Start temperature conversion, wait until ready
+        // probe.temperature() ---> temperatura en Cº
+        temperatura=probe.temperature();
+        porcentajetemperatura=(((float)temperatura-20)*2)/100;
+        //0.013*(float)temperatura+0.09
+        /* llamo a mis funciones */
+        pulsadorsito1();
+        pulsadorsito2();
+        sensorsito();
+        pulsos();
+    }
+}
+/* funcion principal------------------------------------------------------------ */
+void sensorsito()
+{
+    // arranco el cooler 
+    if(arranque==0)
+    {
+        g=0.33;
+        velocidad=0.33;
+        arranque=1;
+        printf("Arranque \r\n");
+    }    
+    
+    switch(sensor) {
+       case abierto:
+            if(salida1==0 ) {
+                /* en el caso que quiera controlar el cooler con el potenciometro */
+                velocidad=(100-porcentageADC)/100;// el PWM cambia proporcionalmente a la variacion del ADC
+                g=(100-porcentageADC)/100.0;
+                printf("PWM : %.2f \r\n",porcentageADC);
+                /* cada segundo leo la cantidad de vueltas */
+                vueltas=hall/4;
+                printf("La velocidad es de: %d rpm \r\n",vueltas*60);
+                vueltas=0;
+                hall=0;
+            } 
+            else
+               sensor=minimo; 
+            break;
+        /* lo siguiente se ejecutara si quiero que el cooler lo controle el sensor de temperatura */
+        
+        case minimo:
+            if(salida1==1) {
+                if(temperatura<0)
+                    sensor=error;
+                else if(temperatura<=20) {
+                    g=1.0;
+                    velocidad=1.0;// PWM ---> 0%
+                    printf("PWM : 0 \r\n");
+                    printf("temperatura = %d \r\n",temperatura);
+                } else if(temperatura>20)
+                    sensor=lineal;  
+            } else
+                sensor=abierto;
+            break;
+
+        case lineal:
+            if(salida1==1) {
+                if(temperatura>20 && temperatura<=70) {
+                    g=1-porcentajetemperatura;
+                    velocidad=1-porcentajetemperatura;// el PWM varia proporcionalmente a ala variacion de temperatura
+                    printf("PWM : %.3f  , temperatura = %d \r\n",porcentajetemperatura,temperatura);
+                } else if(temperatura>70)
+                    sensor=maximo;
+                else if(temperatura<20)
+                    sensor=minimo;      
+            } else
+                sensor=abierto;
+            break;
+
+        case maximo:
+            if(salida1==1) {
+                if(temperatura>70) {
+                    g=0.0;
+                    velocidad=0.0;// PWM ---> 100%
+                    printf("PWM : 100 \r\n");
+                } else if(temperatura<=70)
+                    sensor=lineal; 
+            } else
+                sensor=abierto;
+            break;
+            
+        case error:
+        if(salida1==1)
+        {
+        printf("Error \r\n");
+        if(temperatura>=0)
+            sensor=minimo;
+        }
+        else
+            sensor=abierto;
+        break;
+            
+
+    }
+}
+/* cada vez que el efecto hall se activa cuento  */
+
+void pulsos()
+{
+    if(salida2==1)
+        hall++;
+}
+
+//-----------funcion pulsador que invierte-------------------------------------------------------------------------
+void pulsadorsito1()
+{
+
+    switch(PIN1) {
+        default:
+        case 0:
+            if(pin1==1) {
+                cuenta1=0;
+            } else if(pin1==0) {
+                PIN1=1;
+                cuenta1=10;
+            }
+            break;
+
+        case 1:
+            if(cuenta1==0 && pin1==1) {
+                salida1=!salida1;
+                PIN1=0;
+                printf("Toque \r\n ");
+            } else if( pin1==1 && cuenta1>0) {
+                PIN1=0;
+            }
             break;
     }
-    
-    printf("Found %d device(s)\r\n\n", num_devices);
-    while(1) {
-        probe[0]->convertTemperature(true, DS1820::all_devices);         //Start temperature conversion, wait until ready
-        for (int i = 0; i<num_devices; i++)
-            printf("Device %d returns %3.1foC\r\n", i, probe[i]->temperature());
-        printf("\r\n");
-        wait(1);
-    }
-    
+
+}
+
+void contador1()
+{
+    if(cuenta1)
+        cuenta1--;
 }
 
-#else
-#include "mbed.h"
-#include "DS1820.h"
- 
-DS1820 probe(DATA_PIN);
- 
-int main() {
-    while(1) {
-        probe.convertTemperature(true, DS1820::all_devices);         //Start temperature conversion, wait until ready
-        printf("It is %3.1foC\r\n", probe.temperature());
-        wait(1);
+//--------------funcion de pulsador por pulsos-----------------------------------------------------------------
+
+void pulsadorsito2()
+{
+    switch(PIN2) {
+        default:
+        case 0:
+            if(pin2==1) {
+                salida2=0;
+                cuenta2=0;
+            } else if(pin2==0) {
+                PIN2=1;
+                cuenta2=10;
+            }
+            break;
+
+        case 1:
+            if(cuenta2==0 && pin2==0)
+                salida2=1;
+            else if(cuenta2==0 && pin2==1)
+                PIN2=0;
+            else if( pin2==1 && cuenta2>0)
+                PIN2=0;
+            break;
     }
 }
 
-#endif
\ No newline at end of file
+void contador2()
+{
+    if(cuenta2)
+        cuenta2--;
+}