Arduino: Apertura de válvula programada

Enunciado:

Hay que realizar un ciclo de purga cada x tiempo, y cada purga durará 200 ms. El tiempo entre purga y purga viene determinado por la operación 2300/intensidad=seg. Siendo la Intensidad la que voy a leer del sensor de intensidad. Es decir, si estando en varios estado de funcionamiento del sistema, ejecuto la operación (2300/i) y ese valor que me da, es el tiempo que tengo que esperar para purgar, en el momento que pase, pongo en alto la válvula de purga y purgo durante 200 ms (los 200 ms siempre es igual) cuando termino de purgar (200ms) vuelvo a realizar la operación y vuelvo a esperar el tiempo que salga del resultado de la operación y así sucesivamente. También tengo que tener en cuenta que la operación se realice una sola vez tras realizar la purga para evitar perdidas de datos, o que se pase todo el tiempo realizando operaciones y finalmente no purgue. Fuente: fc

Código:

#define tPURGADO 2000
#define pVALVULA 13

unsigned long tEsperaPurga   = 10000;
unsigned long tUltPurgado    = 0;
unsigned long tAhora;

boolean purgando = false;
unsigned long tInicioPurgado = 0;

// Permite simular el sensor introduciendo a mano
// los numeros desde la consola Serial del IDE
void leerValorSensorPurgado()
{
   if( Serial.available() )
   {
      tEsperaPurga = Serial.parseInt();
      while( Serial.available() && Serial.read() != -1 );
   }
}

void funcionPurgando()
{
   tAhora = millis();

   if( purgando )
   {
      if( tAhora-tInicioPurgado > tPURGADO )
      {
         digitalWrite( pVALVULA, LOW );
         tUltPurgado = tAhora;
         purgando = false;
         Serial.print("FIN ("); Serial.print(tAhora/1000); Serial.println(")");
      }
      else
      {
         digitalWrite( pVALVULA, HIGH );
      }
   }
   else if( tAhora-tUltPurgado > tEsperaPurga )
   {
     tInicioPurgado = tAhora;
     purgando = true;

     leerValorSensorPurgado();
     Serial.print("INICIO ("); Serial.print(tAhora/1000); Serial.println(")");
   }

}

void setup()
{
   pinMode(pVALVULA, OUTPUT); // Led del arduino que se encendera durante el purgado.
   Serial.begin(9600);
   while(!Serial);

   delay(2000);
   Serial.println("INICIO PROGRAMA\r\n");
}

void loop()
{
   funcionPurgando();

   // El resto de tareas del programa.
}

Resultado:

INICIO PROGRAMA
INICIO (10)
FIN (12)
INICIO (22)
FIN (24)
INICIO (34)
FIN (36)
INICIO (46)
FIN (48)
INICIO (58)
FIN (60)
INICIO (70)
FIN (72)

Anuncios

Acerca de giltesa

Desarrollador de software, y hardware a pequeña escala. Aficionado al ciclismo, series y películas.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: