Go Down

Topic: Sistema de enfriamiento para Leds con Termistor y pwm (Read 610 times) previous topic - next topic

steel_series

Sep 26, 2017, 05:05 am Last Edit: Sep 26, 2017, 05:27 am by steel_series
Tengo 2 leds de 50w c/u montados en disipadores separados, cada uno con su cooler pero conectados a la misma señal PWM ya que los LEDS y los disipadores son iguales, así que se calientan parejo.

A uno de los disipadores le puse un termistor con otra resistencia para hacer un divisor resistivo y detectar cuando la temperatura comienza a subir, en ese momento le digo que se enciendan los coolers.

Mi problema es el siguiente, si el led, el cual tiene el termistor se llegase a quemar, los coolers no encenderían y como consecuencia se quemaría el led de al lado porque no se estaría enfriando.

Mi idea es detectar el fallo del Led esperando 1,5 minutos desde que los Leds se encendieron y hacer las comparaciones.

Code: [Select]
if ( (digitalRead(relay) == LOW) && (analogRead(termistor) < 630) && (flag_millis == false) ) //Si los led están encendidos y el termistor esta por debajo de 630
            {
              cap_millis = millis();  // Capturo el tiempo en el que se encendieron los leds
              flag_millis = true;             
            }
             
              if ( (digitalRead(relay) == LOW) && (millis() > (cap_millis + 90000)) && (analogRead(termistor) < 630) )  //  Acá hago lo mismo pero le sumo 1.5 minutos al tiempo que capture antes y lo comparo con millis()
                  {
                    pwmWrite(PWM_fan_leds, 255);  //Si pasados 1.5 minutos el termistor sigue estando por debajo de 630 enciendo los coolers                                                                   
                  }

              if (digitalRead(relay) == HIGH) // Si los Leds estan apagados
                  {
                    flag_millis=false;
                  }
             

         if ( (analogRead(termistor) >= 620) && (digitalRead(relay) == LOW) ) // Si los Leds están encendidos
            {
              if (analogRead(termistor)>=730) // Condiciono la lectura maxima del termistor
                  {
                    termistor_val=730;
                  }
              if (analogRead(termistor)<=350) // Condiciono la lectura minima del termistor
                  {
                    termistor_val=350;
                  }

              termistor_val= map(analogRead(termistor),350,730, 180, 255);
              pwmWrite(PWM_fan_leds, termistor_val);
              porcentaje_fan_leds= map(termistor_val,180,255,0,100);
            }

                       
          if( (analogRead(termistor) <= 610) && (digitalRead(relay) == HIGH) ) // Si los Leds están apagados
            {
             pwmWrite(PWM_fan_leds, 0);
             porcentaje_fan_leds=0;
            } 



Todavía no probé el código y no se si esta bien (no tengo mucha experiencia programando), pero mi pregunta es si en algún momento la función millis() va a ocasionarme algún tipo de problema, porque estuve leyendo y después de unos 50 días se desbordaba lo que no me queda claro.

 

steel_series

Me disculpo de antemano por ser tan burro! al final lo solucione con una simple linea de código.

Code: [Select]

if ( (analogRead(termistor) > 625) && (digitalRead(relay) == LOW) )
            {
              if (analogRead(termistor)>=730)
                  {
                    termistor_val=730;
                  }
              if (analogRead(termistor)<=350)
                  {
                    termistor_val=350;
                  }

              termistor_val= map(analogRead(termistor),350,730, 180, 255);
              pwmWrite(PWM_fan_leds, termistor_val);
              porcentaje_fan_leds= map(termistor_val,180,255,0,100);
            }

   else if ( (analogRead(termistor) < 625) && (digitalRead(relay) == LOW) ) // Esto es lo que agregue
              {            
               pwmWrite(PWM_fan_leds, 255);
               porcentaje_fan_leds= 100;

              }
        
                      
          if((analogRead(termistor) <= 615) && (digitalRead(relay) == HIGH) )
            {
             pwmWrite(PWM_fan_leds, 0);
             porcentaje_fan_leds=0;
            }  


Voy a dejar el thread abierto porque aunque lo haya solucionado de esta manera, me gustaría saber si en el código anterior la función millis() me habría dado problemas en la forma en que la use.


 

surbyte

Mas alla de tu resolución, qué prohibe poner dos termistores y dos controles?
Proteger los LEDs es mas importante que esperar a que se queme el que no esperas que lo haga!!

Yo no dudaría. Te sobran pines, te sobra capacidad de cálculo del arduino.
Porque no gastar algo mas y usar otro termistor?

En 6 if que no estan anidados (dentro de un while) siempre vuelves a hacer la conversión analogRead(termistor) para qué? lo mismo con digitalRead(relay)!
 
En su lugar, lo haces al comienzo, cargas su valor en una variable y es lo mismo.
Nada va a cambiar tan rápido a nivel termino en esos microsegundos de código y en algo que vigilas a lo largo de 1.5 minutos!!

No se si funcionará pero debería

Code: [Select]
bool brelay = digitalRead(relay);
unsigned int itermistor = analogRead(termistor);;

//Si los led están encendidos y el termistor esta por debajo de 630
if (!brelay) {
    if (itermistor < 630) {
        if (flag_millis == false) {
            cap_millis = millis();  // Capturo el tiempo en el que se encendieron los leds
            flag_millis = true;             
        }
        //  Acá hago lo mismo pero le sumo 1.5 minutos al tiempo que capture antes y lo comparo con millis()
        if (millis() > (cap_millis + 90000)) { 
            pwmWrite(PWM_fan_leds, 255);  //Si pasados 1.5 minutos el termistor sigue estando por debajo de 630 enciendo los coolers                                                                   
        }
    }
    if (itermistor >= 620) {
        if (itermistor>= 730) { // Condiciono la lectura maxima del termistor
            termistor_val= 730;
        }
        if (itermistor <= 350) { // Condiciono la lectura minima del termistor
            termistor_val = 350;
        }
        termistor_val       = map(itermistor, 350, 730, 180, 255);
        pwmWrite(PWM_fan_leds, termistor_val);
        porcentaje_fan_leds = map(termistor_val, 180, 255, 0, 100);
    }
}
else  { // Si los Leds estan apagados
    flag_millis = false;
    if ((itermistor <= 610)) { // Si los Leds están apagados
        pwmWrite(PWM_fan_leds, 0);
        porcentaje_fan_leds = 0;
    }
}



steel_series

Mas alla de tu resolución, qué prohibe poner dos termistores y dos controles?
Proteger los LEDs es mas importante que esperar a que se queme el que no esperas que lo haga!!

Yo no dudaría. Te sobran pines, te sobra capacidad de cálculo del arduino.
Porque no gastar algo mas y usar otro termistor?

En 6 if que no estan anidados (dentro de un while) siempre vuelves a hacer la conversión analogRead(termistor) para qué? lo mismo con digitalRead(relay)!
 
En su lugar, lo haces al comienzo, cargas su valor en una variable y es lo mismo.
Nada va a cambiar tan rápido a nivel termino en esos microsegundos de código y en algo que vigilas a lo largo de 1.5 minutos!!
Muchas gracias por el tiempo dedicado, la verdad es que soy un bruto programando, hago las cosas a prueba y error y si anda queda así, ademas de que soy nuevo en esto.

El problema de agregar otro termistor es que ya esta todo montado y no es de fácil acceso(no son solo Leds, hay temporizador, sensores,etc), por eso pensé hacerlo por código. El primer código funcionaba "bien", así que el tuyo (que esta mil veces mejor optimizado) también debería funcionar.

El problema con el primer código es que esperaba 1.5 minutos desde que el Led se encendía y comprobaba. Pero si el Led dejaba de funcionar mas adelante (habiendo pasado la comprobación) el flag queda en "true" hasta hasta que el relay cambie de estado y obviamente esta mal.

Por eso en el segundo código, los coolers se encienden siempre al 100% hasta que el termistor pase los 630 y ahí empieza a regular, de esta forma siempre van a estar encendidos y en caso de que deje funcionar el que posee el termistor, ambos coolers quedaran al 100%.


Gracias nuevamente, el código que modificaste me sirve mucho para aprender como hacer las cosas bien!





 

surbyte

El código modificado es tu mismo código pero solo que no repito cosas.
Y como te dije, no consulto 6 veces algo que no va a cambiar el valor del termistor o el valor del pin digital.

Eso se aprender programando. No te sientas mal, porque no hay razón.

Peor es no intentarlo, o vivir copiando códigos y preguntar porque no funciona sin atreverse a modificarlo.


steel_series

#5
Sep 27, 2017, 01:59 am Last Edit: Sep 27, 2017, 02:13 am by steel_series
No me siento mal, al contrario, si alguien resalta tus errores es mas fácil aprender. Mejor que código son las ideas.

Edito: porque te había hecho una pregunta pero ya entendí a que te referías con consultar lo mismo varias veces, soy muy lento.  :smiley-sleep:

Saludos!







Go Up