Go Down

Topic: Arduino + Electrovalvula (conectada por relay 220v) + RTC + Caudalimetro (Read 103 times) previous topic - next topic

santilococo

Hola, alguno sabe como podría hacer que cuando se apriete un interruptor y pase un día se active la electrovalvula (el relay especificamente)? La idea de mi proyecto es hacer que por día se usen una cierta cantidad de litros (por ejemplo 1L) y cuando esta se sobrepasa se corta el relay y no saldra más agua hasta el otro día. Tiene que ser flexible porque yo tengo que poder usar esos litros cuando quiera durante el día pero una vez que se terminan tengo que esperar al dia siguiente (sabes como se programaría eso? yo lo hice con un evento de alarma pero no creo que sea lo mas conveniente porque si  se llega a desconectar el arduino la alarma ya no funciona, es decir tiene que esperarse un dia mas y yo no quiero esto). Y entonces las tres variables que se tendrian que cumplir para que se encienda la electrovalvula es si hay cantidad de litros para usar, si paso un dia y si se toco el interruptor.


DETALLES:
-Tengo Arduino UNO
-Componentes ultilizados: (Relay 5V, Electrovalvula de 220v, Reloj DS1307, Caudalimetro YF-S201)

Desde ya muchisimas gracias!! Si no me explique bien diganme que no entendieron! Cualquier ayuda me es muy útil!

Adjunto el código correspondiente:
Code: [Select]
//Librerias
#include <Time.h>
#include <TimeAlarms.h>
#include <DS1307RTC.h>
#include <Wire.h>
#include <EEPROM.h>

//Definimos variables
int electro_in1         = 12;
int electro_in2         = 11;

byte sensorInterrupt    = 0;  // 0 = digital pin 2
const byte sensorPin    = 2;
const byte pulsadorPin  = 3;    // conectar aqui el pulsador entre pin y GND
float calibrationFactor = 7.11;
volatile unsigned int pulseCount;  
float flowRate;
float totalLitres;
unsigned long oldTime;
bool estado, estadoAnt = false;

float volumen = 0;
float volumenMaximo = 1; //CAMBIAR ESTO DEPENDIENDO LOS LITROS MÁXIMOS
bool flag = false;

int state = HIGH;      // the current state of the output pin
int reading;           // the current reading from the input pin
int previous = LOW;    // the previous reading from the input pin



//del caudalimetro
void pulseCounter()
{
  pulseCount++;
}



void setup() {
  
  Serial.begin(9600);
  
  pinMode(electro_in1, OUTPUT);
  pinMode(electro_in2, OUTPUT);
  digitalWrite(electro_in1, HIGH);
  digitalWrite(electro_in2, HIGH);
  
  pinMode(sensorPin, INPUT);
  pinMode(pulsadorPin, INPUT);  // pulsador entre pin 3 y GND.

  pulseCount        = 0;
  flowRate          = 0.0;
  totalLitres       = 0.0;
  oldTime           = 0;
  

  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  
}

void loop() {


//para hacer que el boton actue como un switch:
   reading = digitalRead(pulsadorPin);

  if (reading == HIGH && previous == LOW) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;
  }
  
  previous = reading;

//caudalimetro
    if (volumen < volumenMaximo)
        if ((millis() - oldTime) > 1000)  {  // Only process counters once per second
            detachInterrupt(sensorInterrupt);
            flowRate = (((1000.0) / (millis() - oldTime)) * pulseCount) / calibrationFactor;
            
            
            // Add the millilitres passed in this second to the cumulative total
            totalLitres += flowRate / 60;
            volumen = totalLitres;
              
            // unsigned int frac;
           // Serial.print ("Caudal: ");
           // Serial.print (flowRate,3);
           // Serial.print ("L/min\tVolumen: ");
            Serial.print (volumen,3);
            Serial.println (" L");
            
            // Reset the pulse counter so we can start incrementing again
            pulseCount = 0;
            
            // Enable the interrupt again now that we've finished sending output
            attachInterrupt(sensorInterrupt, pulseCounter, FALLING);  
            oldTime = millis();

            
            flag = true; //esto me tengo que fijar
        }


     if (volumen >= volumenMaximo ){
       flag = false;
     }    


    
    if (flag == true && state == LOW){
      digitalWrite(electro_in1, LOW);
      digitalWrite(electro_in2, LOW);
    }
    
    else {
      digitalWrite(electro_in1, HIGH);
      digitalWrite(electro_in2, HIGH);
    }

    
}
"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad." Albert Einstein

krnlpanic

Buenas,

Para que se active justo 24h después del bloqueo puedes utilizar unixtime del rtc y sumarle los segundos de un día (86400) aunque también podrías poner el reset de contadores a las 0:00 por ejemplo

santilococo

Le agregaria una alarma a las 00.00? el problema es que si justo se apaga a esa hora no tomará la alarma.

"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad." Albert Einstein

victorjam

No sé si me he enterado bien: si pulsas el interruptor empezará a salir una cantidad de agua llamada X, y si la sobrepasamos ya no se volverla a gastar mas en ese día, pero si a partir del dia siguiente.

Usa una variable de volumen X, cuando el caudalimetro se ponga en marcha, vas restando de X hasta que llegas a cero. Si X es cero no se podra poner en marcha nada, hasta la medianoche (o la hora que le digas), donde tu X lo vuelves a poner al valor de "lleno".

santilococo

El problema es como haria eso de la medianoche? Porque lo más probable es que el dispositivo no esté encendido, por lo tanto una alarma no seria util ya que si la alarma pasa mientras que el dispositivo no estaba funcionando esta no "se activaria". Que propones? Saludos
"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad." Albert Einstein

victorjam

Y ¿por qué vas a apagar el arduino? Un sistema de control lo lógico es que esté siempre en marcha o, como mucho, el arduino pasé a dormir.

Aún así, se me ocurre que cada vez que se active vayas guardando en la eeprom, la hora/fecha y el volumen consumido. Así cuando vuelvas a encender, en el setup los datos estarán hay. Cuando verifiques el interruptor deberás ver esa hora/fecha y ese volumen, si el día es distinto el volumen hay que ponerlo a full.

El problema que le veo al método, es que al final la eeprom va a durar mucho menos...

Go Up