Go Down

Topic: Prevenir que un Switch case se interrumpa antes de completar su funcion?  (Read 3416 times) previous topic - next topic

AlexLPD

Bueno, en caso de que alguien mas se vuelva loco con esto, dejo mi corta exteriencia con snubbers.

Resulta que al incio estabamos usando;

Esta configuración... cada rele de 5V esta optoacoplado... tienen su propia fuente de poder y comparten el vcc con la fuente del arduino para balancear la referencia.

Cada relevador controla a su vez a un relevador de control de 11 pines 220VAC...

Al principio pusimos los snubbers como normalmente se utilizan...




Y resulta que aunque los ventiladores "paraban" cuando el rele digital... se desconectaba,  el contactor del compresor no, y eso que esta a unos metros del control... el rele del arduino apagado, el rele de control, apagado... incuso tiene una ventanita donde tiene un indicador físico de en que posicion se encuentran los contactos, estaba apagado... pero el contactor no...

Despues  de muchos problemas.. me dicen que;
"aunque la corriente de encendido de la bobina del contactor es alta, la corriente de mantemiento en la posicion de encendido no lo es, por lo que es perfectamente posible que el snubber deje pasar la corriente suficiente para mantenerlo encendido."

Bueno, como ustedes se pueden imaginar, el lio que tenia... sin snubber la chispa que genera el relay al abrirse o cerrarse borraba la pantalla. Con el snubber el compresor no paraba.

Busque y busque y econtre una nueva topología especifica para 220VAC.. la que dejo en este diagrama.



Ahora bien... ni idea de como funcione, de momento no tengo osciloscopio y no he hecho la suficiente experimentacion. Pero espero hacerla pronto.  
El día de mañana vamos a estar haciendo pruebas todo el día de esto. Esperemos a ver que resultados nos da.


Lo dejo aqui para ver si alguien mas le ayuda a dormir un poco jajaja.

Sigo intentando y seguire informando.

-Alex.

AlexLPD

Bueno.... hicimos algunas pruebas con los snubbers. Les dejo el video.

https://youtu.be/ozui2yiZ90Y

Solo para seguraríos que todo esta bien.

Alex.

AlexLPD

Bueno... uno de los problemas de este problema es la temperatura... estaba usando la temperatura raw del sensor y como pueden apreciar, varía mucho de uno a otro ..

foto del terminal serial

Voy por la pc y les dejo la solución que se me ocurrio.

-Alex.

AlexLPD

Bueno, bueno como les decia....

Aqui hay dos problemas que estaban Ocultos:

1.- El sensor ds1820 da un error a un tiempo random (generalmente cuando nadie lo ve)
2.- Esto hace que las maquinas de estado tengan un tercer estado, no se incializan el programa hace cosas    raras.


¿Que como lo se?
El cliente le tomo unas fotos a las 5am que es cuando abren la panaderia, y decia; "Temperatura -127.00 C"
El compressor arrancaba y paraba extrañamente.

Como es bien sabido por ustedes, este es el mensaje de error del DS1820, estuve investigando un poco y puede ser debido a que no tiene un capacitor decople, en el bus de datos. Lo cual tiene sentido, ya que no tiene el capacitor en el bus.

Pero eso no es todo... el software no tiene ninguna "proteccion contra tal evento".

Y se que el software hace cosas raras... por que estuve haciendo algunas pruebas, programe el serial para poder subir o bajar la temperatura raw... y agregue tambien un boton para poder mandar un error de temperatura


Al principio todo es felicidad, lee la temperatura, apaga y prende la refrigeracion... pero una vez que se va a error de temperatura... y regresa a leer las maquinas hacen o no hacen cosas raras.

Pero bueno vamos por partes... primero la lectura de la temperatura.

Anteriormente utilizaba la temperatura tal como venia del sensor. Ahora hacemos un pequeño tratamiento:

Code: [Select]
void readTemp()
{
/*
    float ratTemp = 0.00;
float pasrawTemp  = 0.00;
       float temC = 0.00;

unsigned long temTime = 0;
unsigned long temDelay = 500;

unsigned long temErrorTime = 0;
           int secondError = 0;
boolean errorScreen = false;

*/

//rawTemp = get.temC(INSIDE);

//------------chek if the temperature sensor has a good reading
  if(rawTemp < -30.00) // if the sensor dont read
     {
      temperature = error ;
      temC = 4.00;
      
    
      
      if ( takeErrorTime == true )
         {
           temErrorTime = millis();    
           lcdTem = 4;
           takeErrorTime = false;  
         }
      
      secondError = (( millis() - temErrorTime  ) / 1000);
      
      Serial.println("Error en el sensor");

      if( secondError - pasSecondError != 0 )
        {
            if(secondError < 1)lcdTem = 4; //clean the screen
            else{ lcdTem = 6; }            //keep printing the second on screen as long failure present
            pasSecondError = secondError;
         }
     }


  
  else
     {
      if(pasrawTemp != rawTemp ) //if the temperature has changued
        {  
          
            //Always print raw values on lcd
            dtostrf(rawTemp, 5, 2, lcdTemperature);
            Serial.print("Raw tem  "); Serial.println(lcdTemperature);
          
        
          //Serial.println("Entrando a subrutina temperatura");

          //And use the damping temperature for termostat
          if( millis() - tempTime > tempDelay )
              {
              //Serial.println("Ha pasado el tiempo entre lecturas");
              
              temC = pasrawTemp;      //we use the pas value to keep system stable
              lcdTem = 1;            //start to re-print the temperature
            
              Serial.print("La temC  "); Serial.println(temC);
              
              pasrawTemp = rawTemp;
              tempTime = millis();
              }
        }
      
      //temErrorTime = 0; //clear the second error timmer
      temErrorTime = 0;
      secondError = 0;
      pasSecondError = 0;
      takeErrorTime = true;
      }
    
    


switch(lcdTem)
   {
    case(1):
      lcd.setCursor(0,3);lcd.print(F("                    "));
      Serial.println("Limpiando linea LCD  ");
      lcdTem++;
      break;

    case(2):
      lcd.setCursor(0,3);lcd.print(F("Temperatura"));
      Serial.println("Imprimiendo palabra: temperatura  ");
      lcdTem++;
      break;

    case(3):
      lcd.setCursor(13,3);lcd.print(temC);
      lcd.setCursor(19,3);lcd.print(F("C"));
      Serial.println("Imprimiendo tem C");
      lcdTem = 0;
      break;
  
    case(4):
      lcd.setCursor(0,0);lcd.print(F("                    "));
      lcd.setCursor(0,1);lcd.print(F("                    "));
      lcd.setCursor(0,2);lcd.print(F("                    "));
      lcd.setCursor(0,3);lcd.print(F("                    "));
      lcdTem = 5;
      break;
  
   case(5):
      lcd.setCursor(0,0);lcd.print(F(" ERROR EN EL SENSOR "));
      lcd.setCursor(0,1);lcd.print(F("   LA FALLA TIENE   "));  
      Serial.println("Imprimiendo: error en el sensor   ");
      break;
      
   case(6):
      lcd.setCursor(2,2);lcd.print(secondError);
      lcd.setCursor(10,2);lcd.print(" SEGUNDOS");
      Serial.print("Error en el sensor por  "); Serial.println(secondError);
      break;
   }




}//end void temp



De esta manera me aseguro de que;

a) en caso de un error en el sensor, se apague la refrigeracion hasta que haya un valor real

b) se use un pequeño "tiempo" para refelejar el cambio en la variable del sistema, es decir si la temperatura cambia, siempre se "vera" en tiempo real. Pero  tiene un espacio de 250ms (que puede modificarse despues) para que en caso de una lectura: 7.50, 7.25, 7.50, el sistema solo acepta la lectura estable mas anterior. De esta manera nos seguramos que las maquinas no se "llamen" y se cancelen por efecto de una leve modificación en la lectura.

Ahora, vamos al termostato.
-Alex.



AlexLPD

Ahora veamos el termostato nuevo que tiene esta maquina.

Anterioremente haciamos una burda comparacion:

Code: [Select]
if(temC < 7.00) refrigerattionON();

Ahora, tengo que diferenciar, tres estados: necesitamos refrigerar, necesitamos detener la refrigeracion y necesitamos ventilar.

Necesitamos ventilar, solo debe entrar una vez que las temperaturas esten en rango, por lo que escribi un nuevo y segun yo ... mejor termostato, eso ya me los diran ustedes.

//enum {error, highTemp, lowTemp, inRange } temperature;
//enum { wasHot, wasCold, unknow }, pasTemperature

Code: [Select]
void thermostat()
{

  if(temperature == error)      Serial.println("error en el sensor de temperatura");
  if(temperature == highTemp)   Serial.println("temperatura caliente");
  if( temperature == lowTemp)   Serial.println("temperatura baja");
  if( temperature == inRange)   Serial.println("en el rango");
  
  
    if( temC >= 7.00 )              
      {
          temperature = highTemp ;  
          pasTemperature = wasHot;
      }

    if( temC <= 3.00 )  
      {
         temperature = lowTemp ;  
         pasTemperature = wasCold;
      }

    if( temC > 3.01 && temC < 6.99 )
      {
        temperature = inRange ;    
      }


    if(temperature == error )
        {
          refrigerationOFF();
          pasTemperature = no;
          ventilation = fanError;
          
          Serial.println("Error en el sensor");
        }
    
    else{
         if( temperature == highTemp)
        {
        refrigerationON();
        Serial.println("refrigeracion ON");
        }


    if( temperature == lowTemp )
        {
        refrigerationOFF();
        Serial.println("refrigeracion OFF");
        }

    /*
    if( temperature == inRange && pasTemperature == wasCold )
        {
        cycleFans();
        Serial.println("TEMP EN RANGO ");
        }
        */

    if( temperature == inRange && pasTemperature == unknow)
        {
        cycleFans();
        Serial.println("TEMP EN RANGO  no se sabe la anterior.");
        }

    }

}


Como les comente antes, parece funcionar a la perfeccion, salvo un detalle;
Si hay un error de temperatura mientras se esta enmedio de la ejecucion de una maquina, digamos refrigeracion, al regresar la temperatura, la maquina no hace lo suyo, por lo que solo me queda resolver ese aspecto, aparentemente.

Bueno, en un rato mas les digo que sucedio.
Muchas gracias a Noter, por el uso del Enum, me ha sido de Gran ayuda.

-Alex.

surbyte

Porque no agregas un promedio movil a tu temperatua.
La temperatura no va moverse mucho, y estas supeditado a las variaciones del sensor.
Si promedias con movilildad verás que los cambios son paulatinos (no te vas a perder nada que no ocurra en la cámara) pero será paulatino y no como ahora con cambios de 0.25 y 0.5 como he visto.
Esto no tiene nada que ver con este problema que manifiestas pero realmente me preocupa los vaivenes que muestra el sensor. 
Puedes llevar un promedio de los ultimos 200 valores de temperatura al ritmo que sea... digamos 200 mseg atrás por ejemplo que es nada para una cámara. Tendrás entonces un valor de 7.012 y luego 7.011 y asi paulatinamente. Verás que el peso de una lectura fuera de lugar no influye como antes.
En el entorno de tus cambios de accionamiento el termostato tendrá un comportamiento mas lógico.

Te interesa?

AlexLPD

Porque no agregas un promedio movil a tu temperatua.
La temperatura no va moverse mucho, y estas supeditado a las variaciones del sensor.
Si promedias con movilildad verás que los cambios son paulatinos (no te vas a perder nada que no ocurra en la cámara) pero será paulatino y no como ahora con cambios de 0.25 y 0.5 como he visto.
Esto no tiene nada que ver con este problema que manifiestas pero realmente me preocupa los vaivenes que muestra el sensor.
Puedes llevar un promedio de los ultimos 200 valores de temperatura al ritmo que sea... digamos 200 mseg atrás por ejemplo que es nada para una cámara. Tendrás entonces un valor de 7.012 y luego 7.011 y asi paulatinamente. Verás que el peso de una lectura fuera de lugar no influye como antes.
En el entorno de tus cambios de accionamiento el termostato tendrá un comportamiento mas lógico.

Te interesa?
Si desde luego, no yo hice una manera pero no significa que sea la mejor. Cuéntame más Surbyte

Go Up