reatrdo con millis no actua como necesito

Buenas de nuevo. Hace tiempo que tengo puesto el control de un pequeño grupo de presión, va bien todo, excepto lo que describiré a continuacion. El control de presión es por sondas 4-20mA que convierten a 0-5v, hay tres sondas, la que controla el motor y un par antes y despues de filtros. Ttengo programado que a 5 bar se ponga en marcha y a 6 se pare, pero que tenga que transcurrir 8 segundos seguidos por debajo de 5bar para que arranque, y luego la parada lo mismo, que la presion sea durante 8 segundos mayor de 6 antes de pararse. Para que se entienda bien: quiero que si está 6 segundos por debajo de 5 BAR y la presión se recupera a 5,1, cuando vuelva a bajar por debajo de 5 otra vez cuente hasta 8 segundos seguidos, cosa que no ocurre. Lo que hace es que si está 6 segundos por debajo de 5BAR y sube a 5,1 (o más) cuando vuelve a estar por debajo de 5 solo tarda 2 segundos en ponerse en marcha en vez de 8. Adjunto parte del codigo afectado, ya que he probado de poner el if (millis() - contadorMillis >= 8000 y contadorMillis=millis(); en varios sitios sin resultado. He quitado lineas para que se vea mejor la parte del código. Muchas gracias a cualquier ayuda.

void activacion_bomba()
{

  }
  int ultimoestado = presion_actual_sistema; // carga el valor del ultimo estado

  
  if (millis() - contadorMillis >= 8000)//retrasar puesta en marcha o paro de la bomba
  
  {
    int presion_actualA = analogRead(presion_actual_sonda); // carga presion actual real
    if (ultimoestado != presion_actualA) // Solo si el estado de la presion a cambiado realiza funcion de envio datos
    { 
      if (digitalRead(ausencia_tension)==HIGH)//tension presente ok
      {
        if(presion_actual_sistema <0)//si presion que controla funcionamiento bomba es negativa se para la bomba y sale aviso en display
        {
          digitalWrite(bomba,LOW);
          {
            
	   --->alerta en display<-----
            
        }
        else
        {
          if (presion_actual_sistema < ajuste_minima_presion)
          {
            
            digitalWrite(bomba,HIGH);
            
          }
          if (presion_actual_sistema > ajuste_maxima_presion)
          {
            digitalWrite(bomba,LOW);
            
          }
        }
      }
      else
      {
        digitalWrite(bomba,LOW);
        
      }
    }
    contadorMillis=millis(); // reinicia contador
  }
}

Como no pones el código completo voy a suponer que declaraste la variable contadorMillis como unsigned long, si no es así cambiala, y agrega otra variable donde guardes el valor de millis, asi:

 void activacion_bomba(){
unsigned long millisActual=millis();

if(millisActual - contadorMillis >= 8000)}

con eso corriges solo la parte de tu pregunta, pero en el código que subiste tienes muchos errores en las llaves de los if, incluso abres y cierras llaves inmediatamente después del void activacion_bomba(), necesitaras revisar bien todos esos if anidados, te marcaré los errores mas notorios…

void activacion_bomba()
{

  }    <<<<<<<<<<<<<<<<<AQUI
  int ultimoestado = presion_actual_sistema; // carga el valor del ultimo estado

  
  if (millis() - contadorMillis >= 8000)//retrasar puesta en marcha o paro de la bomba
  
  {
    int presion_actualA = analogRead(presion_actual_sonda); // carga presion actual real
    if (ultimoestado != presion_actualA) // Solo si el estado de la presion a cambiado realiza funcion de envio datos
    { 
      if (digitalRead(ausencia_tension)==HIGH)//tension presente ok
      {
        if(presion_actual_sistema <0)//si presion que controla funcionamiento bomba es negativa se para la bomba y sale aviso en display
        {
          digitalWrite(bomba,LOW);
          {    <<<<<<<AQUI
            
	   --->alerta en display<-----     <<<<<AQUI
            
        } <<<<<<AQUI
        else
        {
          if (presion_actual_sistema < ajuste_minima_presion)
          {
            
            digitalWrite(bomba,HIGH);
            
          }
          if (presion_actual_sistema > ajuste_maxima_presion)
          {
            digitalWrite(bomba,LOW);
            
          }
        }
      }
      else
      {
        digitalWrite(bomba,LOW);
        
      }
    }
    contadorMillis=millis(); // reinicia contador
  }
}    
<<<<<faltaria una llave aqui

gracias por responder. Sí, lo defino como unsigned long, y lo de las llaves es que he quitado lineas que nada tienen que ver con lo del millis, para que sea más claro, luego pruebo esto que indicas y pego este void completo sin recortes, el codigo entero tiene como 800 lineas.
muchas gracias

Pongo esta parte completa, con la modificación. Sigue pasando lo mismo, cronometro en mano, por debajo de 5 activo cronometro y a los 4 segundos paro cronometro y subo presión, lo hago con un potenciometro con lo cual es instantáneo, bajo otra vez la presion y al cabo de 1 segundo ya se activa la bomba. El unsigned long millisActual=millis(); está antes del setup.
EL codigo entero tiene más de 1000 lineas sin la parte de los graficos, por eso no lo pongo entero, y que además, ahora la persona que me ayudó (hizo muchísima parte del codigo) no está disponible para pedirle permiso para ponerlo.
De nuevo, gracias por la ayuda.

void activacion_bomba()//-------------------------------------------------ACTIVACION BOMBA--------------------------------------------------------
{
  //-----------------------------lectura de sonda ANTES de filtro uno, tabien es la que controla la bomba---------------

  if (millis() - contadorMillis_retardo_refresco >= 10)//evita que las lecturas parpadeen más de la cuenta
  {
    presion_actual=analogRead(presion_actual_sonda); //--------------*********************sonda 4-20 0-10bar****************
    presion_actual_lectura_real_map = map(presion_actual,0, 1023, 0, 5000);//rango de 0 a 5000mV(=5V)
    presion_actual_sistema = map(presion_actual_lectura_real_map,0, 5000, 0, 1600);//0 mV entrada= 0 PSI, 5000mV entrada=1000PSI (10BAR), si se pone una sonda de 16 bar, en vez de 1000 será 1600

      //-----------------------------lectura de sonda despues de filtro UNO------------------
    lectura_presion_salida_filtro_primero=analogRead(presion_salida_filtro_uno); //presion actual en tuberia salida filtro
    lectura_presion_salida_filtro_uno_map = map(lectura_presion_salida_filtro_primero,0, 1023, 0, 5000);//rango de 0 a 5000mV(=5V)
    lectura_presion_salida_filtro_uno = map(lectura_presion_salida_filtro_uno_map,0, 5000, 0, 1350); //550mv en entrada marca 0, 4500mv marca 12*100 BAR
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++se pone 550 para evitar que marque presion negativa en salida filtros 1 y 2

    //-----------------------------lectura de sonda despues de filtro DOS------*************sonda 4-20 0-10bar*************
    lectura_presion_salida_filtro_segundo=analogRead(presion_salida_filtro_dos); //presion actual en tuberia salida filtro
    lectura_presion_salida_filtro_dos_map = map(lectura_presion_salida_filtro_segundo,0, 1023, 0, 5000);//rango de 0 a 5000mV(=5V)
    lectura_presion_salida_filtro_dos = map(lectura_presion_salida_filtro_dos_map,0, 5000, 0, 950); //0mv en entrada marca 0, 5000mv marca 16*100 BAR
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++se pone 550 para evitar que marque presion negativa en salida filtro 2
    contadorMillis_retardo_refresco=millis(); // reinicia contador retardo refresco
  }
  int ultimoestado = presion_actual_sistema; // carga el valor del ultimo estado

 
  if(millisActual - contadorMillis >= 8000)
  
  //if (millis() - contadorMillis >= 8000)//retrasar puesta en marcha o paro de la bomba
  
  {
    int presion_actualA = analogRead(presion_actual_sonda); // carga presion actual real
    if (ultimoestado != presion_actualA) // Solo si el estado de la presion a cambiado realiza funcion de envio datos
    { 
      if (digitalRead(ausencia_tension)==HIGH)//tension presente ok
      {
        if(presion_actual_sistema <0)//si presion que controla funcionamiento bomba es negativa se para la bomba y sale aviso en display
        {
          digitalWrite(bomba,LOW);
          {
            u8g.firstPage();
            do
            {
              u8g.setFont(u8g_font_7x14);//define tipo/tamaño letra
              u8g.setPrintPos(4,15);
              u8g.print("ERROR PRESSIO NEG.");
              u8g.setPrintPos(30,30);
              u8g.print("BOMBA OFF");
              u8g.setFont(u8g_font_6x10);//define tipo/tamaño letra
              u8g.setPrintPos(3,50);
              u8g.print("Pressio control");
              u8g.setPrintPos(96,50);
              u8g.print(presion_actual_sistema/100);
            }
            while(u8g.nextPage()); 

            //  delay(5000);*************************************************************
          }
          u8g.setFont(u8g_font_5x8);//define tipo/tamaño letra
        }
        else
        {
          if (presion_actual_sistema < ajuste_minima_presion)
          {
            
            digitalWrite(bomba,HIGH);
            control_arrancadas();
            sumador_contador_arrancadas=2;//para que deje de sumar y se quede en 2 o 3, si se quita se va incrementando y genera falsas arrancadas  
          }
          if (presion_actual_sistema > ajuste_maxima_presion)
          {
            digitalWrite(bomba,LOW);
            sumador_contador_arrancadas=0;//para que deje de sumar y se quede en 0 si se quita se va incrementando y genera falsas arrancadas
          }
        }
      }
      else
      {
        digitalWrite(bomba,LOW);
        sumador_contador_arrancadas=0;//para que deje de sumar y se quede en 0, si se quita se va incrementando y genera falsas arrancadas
      }
    }
    contadorMillis=millis(); // reinicia contador
  }
}

este no es el que está puesto, solo es para pruebas encima de la mesa.

El unsigned long millisActual=millis(); está antes del setup.

Si miras bien, yo escribí la variable millisActual cómo local dentro de la funcion activacion_bomba(), tu la pusiste como global, ademas no actualizas el valor de la misma.

con esta clase puedes definir interrupciones con respecto a millis() o micros cuando una instancia de este en su metodo event() regrese verdadero, te dejo el ejemplo de un blinker:

class Interruption{
public:
int reference;
unsigned long int pwmTime=0;

Interruption(int _reference){
reference=_reference;
}

boolean event(unsigned long int myMicros){
boolean interrupted=myMicros-pwmTime >= reference;
if(interrupted){
pwmTime=myMicros;
}
return interrupted;
}

};

Interruption interruption(1000);
boolean toggle=true;

void setup() {
pinMode(13,OUTPUT);
}

void loop() {
if(interruption.event(millis())){
digitalWrite(13,toggle);
toggle=!toggle;
}
}

muchas gracias a ambos:
RIG: ya probé tambien tal y como indicas, he vuelto a probarlo y si bien he notado diferencia respecto a ponerlo global, an alguna ocasión solo transcurre un par de segundos despues de presion baja-alta-baja, y en el momento de parar tambien, si bien parece que de esta manera lo hace menos veces, son más las que hay más segundos de espera para el cambio, pero en ningun caso espera los "8" segundos despues de paso por presion minima o maxima.

AdrianDroid: gracias también por el interés, pero no sé como aplicarlo a este void, mis conocimientos son muy limitados, como indico antes, la mayor parte del codigo lo ha hecho un colega.

si no se puede conseguir lo que quiero lo dejaría así, ya que parece que va mejor que el original. gracias

muchas gracias por responder. Intentaré lo que comentas pero mucho no sé. Una aclaración: el problrma no es que programe 8 segundos y tarde 6 o 9, sino que a veces tarda 2, o incluso se activa en seguida, como si pasara de largo del reset, pero a pesar de haber puesto el serial.print en las lineas que debe resetear, va tan rapido el cambio que no tengo tiempo de hacer los numeros ni visionarlos de forma correcta.
ya comentaré lo del timer o como avanza (si avanza)
de nuevo, gracias por la atención prestada