El mayor problema que le veo es que se te solapa la duración con la hora. Es decir te encuentras que para tiempos de riego de 1 segundo, se te puede ejecutar 60 veces a la misma hora.
Por lo tanto se necesita una variable para controlar eso, tal y como has hecho muy acertadamente, aunque con el código un poco enmarañado.
Quizás, te aconsejaria cambiar el nombre de la variable a algo que sea más acorde a lo que pretendes hacer. Por ejemplo, una variable bool llamada regar. Cuando esta variable es falsa debes comprobar la hora/minuto y si es el momento de regar enciendes la bomba, guardas millis y la pones a cierto.
Mientras esta variable sea cierta debes mirar el tiempo, asi que cuando transcurra este basta con apagar la bomba. La variable regar solo se vuelve a poner en falso cuando no sea la hora/minuto de riego. Así evitas el que en el mismo minuto te esté regando todo el rato.
En código, quedaría aproximadamente asi:
// Si 'regar' es falsa, comprobamos que es hora de regar, si lo es, iniciamos
// el temporizador, encendemos la bomba e indicamos que vamos a regar.
if ( regar == false ) {
if ( horaActual == horaRiego && minutoActual == minutosRiego ) {
regar == true;
t = millis();
digitalWrite(bomba, HIGH);
}
}
else {
// Estamos regando, por lo tanto hemos de comprobar si el tiempo de riego ha
// transcurrido en cuyo caso, solo apagamos la bomba.
if ( millis()-t > tiempoRiego ) {
digitalWrite(bomba, LOW);
}
// Para evitar que se vuelva a repetir en el mismo minuto, solo cambiamos
// la variable cuando la hora no sea la correcta.
if ( horaActual != horaRiego || minutoActual == minutoRiego ) {
regar = false;
}
}
Como ves, el código es muy parecido al tuyo, solo que parece un poco más legible.
Enhorabuena! Has conseguido superar el tutorial con exito!