Buenas... tengo un sistema de riego automatizado, con un sensor que detecta la humedad del suelo, y si es la hora de regar, mide la humedad y riega o no riega dependiendo de cómo esté de mojado el suelo...el problema que tengo es que cuando llega la hora de regar "definida por una función llamada Alarm.alarmRepeat" hago una llamada a una función que yo he creado, que mientras que el suelo esté seco, riege... pero se queda en esa parte del bucle while y no sale de él cuando el suelo ya está suficientemente húmedo...
el código es este:
#include <Time.h>
#include <TimeAlarms.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>
// Creamos un objeto lcd con los pines a los que está conectado
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);
// Declaramos la entrada del pin del sensor de humdad de tierra
const int sensorPin = A0;
// Declaramos la salida del pin del Relé, LOW para abrir electroválvula y HIGH para cerrar.
const int relePin = 2;
void setup() {
// Iniciamos el pin del sensor de humedad del suelo como input
pinMode(sensorPin, INPUT);
//definir el pin del relé como salida
pinMode(relePin, OUTPUT);
// Preparar la interfaz serial
Serial.begin(9600);
//cargamos un objeto lcd e iniciamos la pantalla con 20 caracteres por línea y 4 líneas
lcd.begin(20, 4);
// Configurar los pines de salida de relevadores desactivados al inicio
// recordamos que los modulos de reles se activan con un estado bajo
digitalWrite(relePin, HIGH);
// Ponemos la palabra no en el LCD en la parte donde pone Regando:, para así que siempre empiece en no y se modique cuando se está regando o cuando ha parado de regar.
lcd.setCursor(9,1);
lcd.write("NO");
// Cargar la hora actual desde el RTC e indicar que esto suceda de forma automática durante loop()
// Utilizamos el método RTC.get() de la libreria DS1307RTC. El RTC debe estar conectado como se
// indica en el texto y debe tener la fecha y hora correctas
setSyncProvider(RTC.get);
if (timeStatus() != timeSet)
Serial.println("Fallo de RTC");
else
Serial.println("Sincronizado con RTC");
// Crear las alarmas y configurar las funciones correspondientes a cada una
Alarm.alarmRepeat(23, 12, 0, aperturaelectrovalvula);
Alarm.alarmRepeat(21, 59, 0, aperturaelectrovalvula);
}
void loop() {
// Mostrar el reloj en el monitor serial
digitalClockDisplay();
// Mostrar el reloj en el LCD2004
LCD1602ClockDisplay();
// función map para ver porcentajes de humedad suelo en vez de un valor
int valorHumedad = map(analogRead(sensorPin), 0, 1023, 100, 0);
int humedad = analogRead(sensorPin);
// Imprimimos por pantalla los valores de humedad y su porcentaje
Serial.print("Humedad en porcentaje: ");
Serial.print(valorHumedad);
Serial.println("%");
Serial.print("Humedad en valor: ");
Serial.println(humedad);
// llamamos a la función humedadporcentaje, pasándole el valorHumedad en porcentaje, para que valore si está por debajo del 10, que mueva los caracteres en el LCD para una correcta visualización
humedadPorcentaje(valorHumedad);
// llamamos a la función humedadValor, pasándole la humedad, para que valore si está por debajo del 10, que mueva los caracteres en el LCD para una correcta visualización
humedadValor(humedad);
// Esperar 1 segundo y procesar las Alarmas mientras tanto...
// El metodo Alarm.delay() procesa en el fondo las alarmas y llamara a las funciones indicadas
Alarm.delay(1000);
lcd.setCursor(0,0);
lcd.write("Hora:");
lcd.setCursor(0,1);
lcd.write("Regando: ");
lcd.setCursor(0,2);
lcd.write("Humedad: ");
lcd.setCursor(9,2);
lcd.print(humedad);
}
void aperturaelectrovalvula(){
int humedad = analogRead(sensorPin);
while(humedad > 500)
{
Serial.print(" ");
Serial.print(humedad);
Serial.print(" ");
Serial.println("Electroválvula abierta, ahora se está regando.");
digitalWrite(relePin, LOW);
lcd.setCursor(9,1);
lcd.write("SI");
}
}
/**
Funciones para la impresion del reloj al monitor serial de arduino
*/
void digitalClockDisplay() {
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.println();
}
void LCD1602ClockDisplay(){
lcd.setCursor(6,0);
lcd.print(hour() );
lcd.setCursor(8,0);
lcd.print(':');
lcd.setCursor(9,0);
printDigitsLCD(minute());;
lcd.setCursor(11,0);
lcd.print(':');
lcd.setCursor(12,0);
printDigitsLCD(second());
}
// Si los minutos o segndos son inferiores a 10, pone un cero a la izquierda en la pantalla LCD
void printDigits(int digits) {
Serial.print(":");
if (digits < 10)
Serial.print('0');
Serial.print(digits);
}
// Si los minutos o segndos son inferiores a 10, pone un cero a la izquierda en la pantalla LCD
void printDigitsLCD(int digits) {
if (digits < 10)
lcd.print('0');
lcd.print(digits);
}
// Si el porcentaje de humedad es inferior a 10, movemos los caracteres para que no se quede el último visualizado en pantalla y parezca un dato incorrecto.
void humedadPorcentaje(int valorHumedad){
if (valorHumedad < 10){
lcd.setCursor(15,2);
lcd.print(' ');
lcd.setCursor(16,2);
lcd.print(valorHumedad);
lcd.setCursor(17,2);
lcd.print('%');
}else{
lcd.setCursor(15,2);
lcd.print(valorHumedad);
lcd.setCursor(17,2);
lcd.print('%');
}
}
// Si el valor numérico del sensor de humedad es inferior a 1000, ajusta los caractéres para una correcta visualización en el display LCD
void humedadValor(int humedad){
if(humedad < 1000){
lcd.setCursor(12,2);
lcd.print(' ');
}
}
Observo que cuando llega la hora acordada, se llama a la función aperturaelectrovalvula() y empieza a regar... pero meto el sensor de humedad en un vaso de agua para que suba el valor del sensor y pare, y no para... sigue saliendo todo el rato el mensaje que arroja cuando está regando:
Serial.println("Electroválvula abierta, ahora se está regando.");
A parte en la pantalla LCD aparecen unos datos que se van actualizando... como la hora, y si se está regando o no... y eso tampoco actualiza mientras está el bucle while...
Alguna ayuda??
Gracias!