Millis() se que les aburre pero no entiendo

Saludos a todos los del foro, me llamo Manuel y vivo en Cuba, mi proyecto esta trillado en la web pero por mas que intento no me sale es un sistema de llenado de tanque elevado desde un deposito bajo con una bomba de superficie, y esta es la particularidad, las bombas como esta pierden la ceba o columna de agua y se pueden quemar. Por lo tanto yo necesito que al activarse el pin del relay que enciende la bomba, espere 10 segundos y compruebo si hay flujo o no, con un flujometro yf-s201 que tengo instalado. Con delay no puedo y millis() realmente por mucho que he leido no me sale. Les posteo un pedazo del codigo que tengo en el loop y agradesco de antemano su contribucion. Sdos y si vienen a Cuba los invito a mi casa.

unsigned long horaactual = millis();          //Y aqui empieza el dolor de cabeza.
 
  if(resultadoT<=60&&resultadoC>=80){           //Si tanque menor que 60% y Cinterna mayor que 80%  
     digitalWrite(pintransistor, HIGH);         //arranca la bomba
     bomba=bomba2;                              //en pantalla se ve BOMBA ON.
       
  if(horaactual- horaprevia >= intervalo) {     //En un intervalo de 10 segundos,
       if (frequency==0){                       //si la frequencia del flujometro es igual a cero
       digitalWrite(pintransistor, LOW);        //apaga la bomba
       bomba=bomba3;                            //en pantalla se ve BOMBA ERROR.
       }else{                                   //Si la frequencia es diferente de cero
       digitalWrite(pintransistor, HIGH);       //mantener la bomba encendida
       bomba=bomba2;                            //en pantalla se ve BOMBA ON.
       }
  }
  }else{                                        //si el % del tanque no es menor que 60 o el % de cinsterna no es mayor que 80
    digitalWrite(pintransistor, LOW);           //mantener apagada la bomba  
    bomba=bomba1;                               //en pantalla se ve BOMBA OFF.
  }

Sdos y gracias. Manuel

Así, a primera vista, creo que

//unsigned long horaactual = millis();          //Y aqui empieza el dolor de cabeza.
unsigned long horaprevia;
 
	if(resultadoT<=60&&resultadoC>=80){           //Si tanque menor que 60% y Cinterna mayor que 80% 
		digitalWrite(pintransistor, HIGH);         //arranca la bomba
		bomba=bomba2;                              //en pantalla se ve BOMBA ON.
	
		horaprevia = millis(); //<----- mejor tomar hora cuando empieze la bomba
		}
	else{             //si el % del tanque no es menor que 60 o el % de cinsterna no es mayor que 80
		digitalWrite(pintransistor, LOW);           //mantener apagada la bomba 
		bomba=bomba1;                               //en pantalla se ve BOMBA OFF.
		}
		
		
	if(horaprevia){ // comprobar?
		if(millis()- horaprevia >= intervalo) {     //En un intervalo de 10 segundos,
			if (frequency==0){                       //si la frequencia del flujometro es igual a cero
				digitalWrite(pintransistor, LOW);        //apaga la bomba
				bomba=bomba3;                            //en pantalla se ve BOMBA ERROR.
				}
	   
		else{                                   //Si la frequencia es diferente de cero
			digitalWrite(pintransistor, HIGH);       //mantener la bomba encendida
			bomba=bomba2;                            //en pantalla se ve BOMBA ON.
			}
		horaprevia=0; //	borrar temporizador
		}
	}

Saludos

Saludos, ante todo gracias por tomarse su tiempo y responder, le comento que hice las variaciones en el codigo segun me sugirio y sucede que ahora desde que arranco el sistema me da error de bomba, por lo tanto esta nunca echa a andar, probe a hacerle algunas variaciones pero nada.

El caso me tiene preocupado porque a pesar de que entiendo lo que quiero que haga y aparentemente la secuencia esta bien pues no va y es verdaderamente frustrante, mas que es lo unico que me falta para completar el proyecto y no puedo obviar este paso pues de el depende el monitoreo de que la bomba este trabajando correctamente y no se vaya a quemar.

No puedo subir el codigo completo porque es muy largo tal ves el problema este en otra parte aunque lo dudo porque todo lo demas funciona perfecto. Si tiene alguna otra idea me la deja saber yo por mi parte sigo enfrascado,Saludos y una ves mas Gracias

haz una prueba con ese trozo (sin bomba y engañando a frequency) para ver si el sistema funciona Ya te he dicho, que a primera vista, parece que funcione bien. Tendrás que ir depurando poco a poco vía serial que es lo que no acaba de funcionar

Por cierto, igual es que es un error verdadero, porque en ese código solo aparece el error cuando frequency==0. Dale un vistazo

Saludos

Saludos otra ves, voy a intentar subir el codigo por partes a ver si puedo

 #include <LiquidCrystal.h>
  // this constant won't change.  It's the pin number
  // of the sensor's output:
  LiquidCrystal lcd(12,11,5,4,3,10);  //Definimos la pantalla LCD
  const int pingTrigerT = 7;          //definimos pin envio onda tanque
  const int pingEchoT = 6;            //definimos pin de recepcion de onda tanque
  const int pintransistor=15;         //Pin para activar Relay de la bomba de agua
  const int pinbocina=14;             //Pin para activar Buzzer para alarma de fallos
  const int pingTrigerC = 9;          //definimos pin envio onda cinsterna
  const int pingEchoC = 8;            //definimos pin de recepcion de onda cinsterna
  const int sensorPin = 2;            //Pin con interrupcion para Flujometro YF-S201
  const int measureInterval = 2500;   //Intervalo de interrupcion
  volatile int pulseConter;           //Variable contador de pulsos flujometro 
  const float factorK = 7.5;          //FactorK segun datasheet del flujometro
  long horaprevia = 0;                //Variable para MILLIS()
  long intervalo = 10000;             //Intervalo de Millis()
  long capT=50;                       //Variable capacidad de tanque
  long capC=50;                       //Variable capacidad de cinsterna

  void ISRCountPulse()                //Interrupcion
  {
  pulseConter++;                      //Contador de pulsos
  }
 
  float GetFrequency()               //Funcion para medir Frequencia
  {
  pulseConter = 0;
 
  interrupts();
  delay(measureInterval);
  noInterrupts();
 
  return (float)pulseConter * 1000 / measureInterval;
  }

Hola sin implementar la funcion millis o sea que arranque y pare la bomba segun los porcientos de llenado todo marcha a pedir de boca, el problema esta a partir de que quiero que haga esta comprobacion. El flujometro y su codigo bien visualizo los l/min en LCD y todo. otro pedazo de codigo a ver si veo la luz en algun momento y por supuesto con su ayuda.

void setup() {

  Serial.begin(9600);              //inicializo comunicacion serial:
  lcd.begin(20,4);                 //inicializo pantalla LCD:
  attachInterrupt(digitalPinToInterrupt(sensorPin), ISRCountPulse, RISING);
  pinMode(13,OUTPUT);              //defino ping 13 como salida
  digitalWrite(13, HIGH);          //Activamos la retroiluminacion

  pinMode(pintransistor,OUTPUT);
  digitalWrite(pintransistor, LOW);

  pinMode(pinbocina,OUTPUT);
  digitalWrite(pinbocina, LOW);
  
  lcd.clear();                    //Actualizo la Pantalla       
  lcd.setCursor(0,0);             //Con este comando decimos en que linea queremos escribir
  lcd.print("A0 SOLUCIONES");
  lcd.setCursor(0,2);
  lcd.print("TEL:77962354");
  delay(3000);
  lcd.clear();   
  }

Sdos, ahi va el ultimo trozo de codigo, que me disculpe el moderador si esto no se puede hacer.
Sin llorar mucho pero vivo en cuba y la unica conexion que tengo es atraves de un telefono movil y es caroooooo.

 void loop() {
  long durationT,cmT,porcientoT,resultadoT ;   //establecemos variables para trabajo con la duracion del pin del tanque
  long durationC,cmC,porcientoC,resultadoC ;   //establecemos variables para trabajo con la duracion del pin del cinsterna
  String bomba1="OFF";                         //variables de caracteres a usra en LCD
  String bomba2="ON";
  String bomba3="ERROR";
  String bomba;
  float frequency = GetFrequency();            //Variable para almacenar la frequencia del pulso
  float flow_Lmin = frequency * factorK;       //Convercion de la frequencia en Litros/Min
 
  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  
  pinMode(pingTrigerT, OUTPUT);
  digitalWrite(pingTrigerT, LOW);
  delayMicroseconds(2);
  digitalWrite(pingTrigerT, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingTrigerT, LOW);

  pinMode(pingEchoT, INPUT);             // The same pin is used to read the signal from the PING))): a HIGH
  durationT = pulseIn(pingEchoT, HIGH); // pulse whose duration is the time (in microseconds) from the sending of the ping to the reception of its echo off of an object

  cmT = microsecondsToCentimeters(durationT);    //Convierte tiempo en distancia
  porcientoT=(cmT*100/capT)-20;                  //calcula porciento de llenado
  resultadoT=(100-porcientoT);                   //devuelve el llenado total del tanque
            
  // The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  
  pinMode(pingTrigerC, OUTPUT);
  digitalWrite(pingTrigerC, LOW);
  delayMicroseconds(2);
  digitalWrite(pingTrigerC, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingTrigerC, LOW);

  pinMode(pingEchoC, INPUT);                     //The same pin is used to read the signal from the PING))): a HIGH
  durationC = pulseIn(pingEchoC, HIGH);          //pulse whose duration is the time (in microseconds) from the sending of the ping to the reception of its echo off of an object

  cmC = microsecondsToCentimeters(durationC);    //convert the time into a distance
  porcientoC=(cmC*100/capC)-20;                  //calcula porciento de llenado
  resultadoC=(100-porcientoC);                   //devuelve el llenado total de cinsterna
  
 
  
  unsigned long horaactual = millis();          //Y aqui empieza el dolor de cabeza.
 
  if(resultadoT<=60&&resultadoC>=80){           //Si tanque menor que 60% y Cinterna mayor que 80%  
     digitalWrite(pintransistor, HIGH);         //arranca la bomba
     bomba=bomba2;                              //en pantalla se ve BOMBA ON.
       
  if(horaactual- horaprevia >= intervalo) {     //En un intervalo de 10 segundos,
       if (frequency==0){                       //si la frequencia del flujometro es igual a cero
       digitalWrite(pintransistor, LOW);        //apaga la bomba
       bomba=bomba3;                            //en pantalla se ve BOMBA ERROR.
       }else{                                   //Si la frequencia es diferente de cero
       digitalWrite(pintransistor, HIGH);       //mantener la bomba encendida
       bomba=bomba2;                            //en pantalla se ve BOMBA ON.
       }
  }
  }else{                                        //si el % del tanque no es menor que 60 o el % de cinsterna no es mayor que 80
    digitalWrite(pintransistor, LOW);           //mantener apagada la bomba  
    bomba=bomba1;                               //en pantalla se ve BOMBA OFF.
  }
      
                   
  lcd.clear();                  
  lcd.setCursor(2,0);                          //Con este comando decimos en que linea queremos escribir
  lcd.print("TANQUE");    
  lcd.setCursor(0,2);                          //Con este comando decimos en que linea queremos escribir
  lcd.print("CINTERNA");  
  lcd.setCursor(4,1);
  lcd.print(resultadoT);                       //Porciento de llenado del tanque elevado
  lcd.setCursor(4,3);
  lcd.print(resultadoC);                       //Porciento de llenado de la cinsterna
  lcd.setCursor(7,1); 
  lcd.print("%");       
  lcd.setCursor(7,3); 
  lcd.print("%");      
  lcd.setCursor(9,0); 
  lcd.print("BOMBA");     
  lcd.setCursor(15,0); 
  lcd.print(bomba);                            //Estado de la bonba de agua
  lcd.setCursor(11,2); 
  lcd.print("Lit/Min");     
  lcd.setCursor(14,3); 
  lcd.print(flow_Lmin);                        //Caudal de agua

  if(resultadoC>100){                          //Si el % de llenado de la cinsterna es mayor que 100 
  digitalWrite(pinbocina, HIGH);               //alarma sonora.
  lcd.clear();                  
  lcd.setCursor(0,0);                         //Con este comando decimos en que linea queremos escribir
  lcd.print("VALVULA");   
  lcd.setCursor(0,1);                         //Con este comando decimos en que linea queremos escribir
  lcd.print("BLOQUEADA");
  }
  if(cmC==0||cmT==0){                         //Si falla sensor del tanque o de la cinsterna 
  digitalWrite(pinbocina, HIGH);              //alarma sonora.
  if(cmT==0){                                 //Si falla sensor del tanque lo muestro en pantalla
  lcd.clear();                  
  lcd.setCursor(0,0);                         //Con este comando decimos en que linea queremos escribir
  lcd.print("FALLA SENSOR");   
  lcd.setCursor(0,1);                         //Con este comando decimos en que linea queremos escribir
  lcd.print("TANQUE");
  }
  if(cmC==0){                                 //Si falla sensor de la cinsterna lo muestro en pantalla
  lcd.clear();                  
  lcd.setCursor(0,0);                         //Con este comando decimos en que linea queremos escribir
  lcd.print("FALLA SENSOR");  
  lcd.setCursor(0,1);                         //Con este comando decimos en que linea queremos escribir
  lcd.print("CINSTERNA");  
  }
  }else{
  digitalWrite(pinbocina, LOW);
  }       
  delay(1000);
  }
  long microsecondsToCentimeters(long microseconds) {
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
  }

Para la próxima lo subes como adjunto en 1 sola vez y el interesado lo tiene que descargar. Eso se usa para códigos que superen 9k (en realidad sumado código mas tu mensaje) pero dejémoslo así.

Tu único error usando milllis() es que jamás le dices a horaprevia el valor que debe tomar, asi que la acción se repite siempre.

Inicializas horaprevia = 0 al comienzo como global y debes decirle que tome el valor de horaactual cuando se cumpla el intervalo.

     if (horaactual- horaprevia >= intervalo) {  // En un intervalo de 10 segundos,
         if (frequency == 0){                     // si la frequencia del flujometro es igual a cero
              digitalWrite(pintransistor, LOW);   // apaga la bomba
              bomba = bomba3;                     // en pantalla se ve BOMBA ERROR.
         } else{                                  // Si la frequencia es diferente de cero
             digitalWrite(pintransistor, HIGH);   // mantener la bomba encendida
             bomba = bomba2;                      //en pantalla se ve BOMBA ON.
         }
         horaprevia = horaactual;
      }

Eso nada mas.

Saludos, y GRACIASSSSSSSSS, a los del foro, a los que aportaron y a los que leyeron, SurByte te agradesco en especial, lo implemente tal cual dijiste y en dos, tres pruebas parece que funciona bien, ahora a seguir haciendo pruebas, me disculpo otra ves por lo del codigo, a veces en el apuro de maximizar tiempo de conexion me salto algunos pasos.
Saludos todavia no pongo el solucionado hasta estar bien seguro el codigo quedo asi

unsigned long horaactual = millis();          //Y aqui empieza el dolor de cabeza.
 
  if(resultadoT<=60&&resultadoC>=80){           //Si tanque menor que 60% y Cinterna mayor que 80%  
     digitalWrite(pintransistor, HIGH);         //arranca la bomba
     bomba=bomba2;                              //en pantalla se ve BOMBA ON.
       
  if(horaactual- horaprevia >= intervalo) {     //En un intervalo de 10 segundos,
       if (frequency==0){                       //si la frequencia del flujometro es igual a cero
       digitalWrite(pintransistor, LOW);        //apaga la bomba
       bomba=bomba3;                                                //en pantalla se ve BOMBA ERROR.
       }else{                                   //Si la frequencia es diferente de cero
       digitalWrite(pintransistor, HIGH);       //mantener la bomba encendida
       bomba=bomba2;                            //en pantalla se ve BOMBA ON.
       }
       }
  }else{                                        //si el % del tanque no es menor que 60 o el % de cinsterna no es mayor que 80
    digitalWrite(pintransistor, LOW);           //mantener apagada la bomba  
    bomba=bomba1;                               //en pantalla se ve BOMBA OFF.
    horaprevia = horaactual;
  }

Gracias de nuevo, Saludos, Manuel