Activar salida digital con millis() por unica vez dada una condicion

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!

1 Like