Problema para salir del bucle while

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!

Un bucle while ejecuta el bloque de codigo entre llaves mientras se cumpla la condicion que se evalua ,en este caso humedad>500 ,pero dentro de ese bloque
de instrucciones nunca modificas el valor de la humedad,no hay nuevas lecturas del sensor,por lo tanto la condicion siempre se cumple.