Buenos días, soy Pau. He buscado y buscado y no soluciono mi problema. Lo que intento hacer es la automatización de un huerto para regar si la tierra está seca. Para ello dispongo de:
- un depósito con tres boyas y tres LED que me indican el nivel en el cuadro eléctrico
- un pozo con una bomba
- una electroválvula
- sensor de humedad FC-28
- placa arduino uno r3
- transformadores externos para activar la bomba y la electroválvula
- módulo de 8 relés
- típico programador de ciclos a 230V para, por ejemplo, encender/apagar un radiador eléctrico en casa. Esté me da corriente al cuadro eléctrico donde está la placa y los trafos
Programo el "reloj" para que se encienda dos veces al día y me alimente la placa. El código (que es muy largo y, estoy casi seguro que se puede optimizar) hace el siguiente proceso:
- Comprueba el valor que lee del FC-28.
- Si está húmedo, con un delay espero el tiempo suficiente para no volver a activar el ciclo
- Si está seco, compruebo el nivel del depósito usando las tres boyas y enciendo la bomba si es necesario.
- Cuando el depósito está lleno, abro la electroválvula el tiempo programado.
- Cuando el programador de ciclos deja de alimentar la caja eléctrica, todo queda parado: placa, bomba y electroválvula cerrada.
Todo el sistema funciona a la perfección excepto porqué quiero doble control del encendido de la bomba. Ahora mismo, cuando enciendo la bomba, lo hago hasta que la boya de nivel máximo está activa. En este momento paro la bomba y abro la electroválvula. También me funciona utilizar un delay() y después parar la bomba pero no me gusta. Lo que quiero conseguir es lo siguiente:
Encender la bomba mientras la boya de nivel máximo no esté activa O durante X minutos
El código simplificado (compruebo todas las combinaciones posibles de las 3 boyas) es el siguiente:
const int hu_min = 550; //Valor mÃnim de lectura del sensor per considerar moll
#define sensor_humitat_01 A0 //Inicialitzar el pin analògic -> Sensor d'humitat
#define boia_03 11 //Inicialitzar el pin digital -> Boia de dalt
#define LED_03 10 //Inicialitzar el pin digital -> Led nivell dalt ok
#define Bomba 3 //Inicialitzar el pin digital -> Relé bomba
#define Electroval_01 2 //Inicialitzar pin digital -> Relé electrovà lvola
unsigned long temps;
long temps_electroval = 1; //Temps (hora) d'obertura de l'electrovà lvola
long temps_espera = 1; //Temps (hora) que sobrepassi el temps programat per regar per no sortir del bucle
long temps_bomba = 1; //Temps (min) d'emplenar el dipòsit
#define SEC_PER_MIN (60UL)
#define SEC_PER_HOR (3600UL)
int moll = 0; //Constant per saber si ja s'ha comprovat la humitat
int ple = 0; //Constant per saber si ja ha funcionat la bomba
int regat = 0; //Constant per saber si ja s'ha regat
int funcionant = 0;
int cas01 = 0;
void setup() {
pinMode(sensor_humitat_01, INPUT);
pinMode(boia_03, INPUT);
pinMode(LED_03, OUTPUT);
pinMode(Bomba, OUTPUT);
pinMode(Electroval_01, OUTPUT);
digitalWrite(Bomba, HIGH);
digitalWrite(Electroval_01, HIGH);
Serial.begin(9600);
}
void loop() {
temps = (millis() / 1000);
delay(1000);
Serial.print(temps);
//Comprovar humitat del terra
int humitat_01 = analogRead(sensor_humitat_01);
Serial.print(humitat_01);
//Comprovar nivell dipòsit
int nivell_boia03 = digitalRead(boia_03);
Serial.print(boia_03);
if (moll == 0 && (regat == 0))
{
if (humitat_01 < hu_min)
{
Serial.println("Moll");
digitalWrite(Electroval_01, HIGH);
digitalWrite(Bomba, HIGH);
delay(temps_espera * SEC_PER_HOR);
}
else
{
Serial.println("Sec");
if (funcionant == 0)
{
if (nivell_boia03 == LOW)
{
Serial.println("Dipòsit buit");
REGAR();
int cas01 = 1;
}
else
{
Serial.println("Dipòsit ple");
digitalWrite(LED_01, HIGH);
digitalWrite(LED_02, HIGH);
digitalWrite(LED_03, HIGH);
int ple = 1;
REGAR();
}
}
}
int funcionant = 1;
}
}
void REGAR()
{
if (ple == 0)
{
do
{
delay(50);
digitalWrite(Bomba, LOW);
} while (digitalRead(boia_03) == LOW || (temps < temps_bomba * SEC_PER_MIN));
}
digitalWrite(Bomba, HIGH);
int ple = 1;
if (cas01 == 1)
{
CAS01();
}
delay(1000);
if (regat == 0)
{
do
{
digitalWrite(Electroval_01, LOW); //Obrir electrovà lvola
} while (digitalRead(boia_01) == HIGH || (temps < temps_electroval * SEC_PER_HOR));
}
digitalWrite(Electroval_01, HIGH);
int regat = 1;
}
void CAS01()
{
digitalWrite(LED_01, HIGH);
digitalWrite(LED_02, HIGH);
digitalWrite(LED_03, HIGH);
}
Entiendo que el problema lo tengo en el siguiente trozo:
do
{
delay(50);
digitalWrite(Bomba, LOW);
} while (digitalRead(boia_03) == LOW || (temps < temps_bomba * SEC_PER_MIN));
La parada por boya me funciona bien. Lo que intento es tener una seguridad extra controlando el tiempo para no tener la bomba funcionando todo el tiempo que el programador alimente el cuadro eléctrico.
Muchas gracias por la ayuda
Hort_v4.ino (5.76 KB)