poner un retardo despues de finalizar interrupción

Buenas, depsues de un lapso de "vacaciones" por mala pata (me dí un golpe en un pie), retomo el tema que dejé, de control de un grupo de presion de agua que modifiqué para poder poner una sonda 4-20* en vez de una de salida 0-5.
He introducido una interrupción, más que nada para aprender más cosas, de que si falla la alimentacion actue parando la bomba. Ya funciona y el sistema escogido es el siguiente:
tengo una fuente comutadasalida 5v (alimento por 5V al mega, no Vin) a la que he aumentado el valor del condensador del primario, y por otro lado un relé con bobina 24v que se alimenta de un transformador aparte. Los contactos de este rele está el comun a la entrada 2 del mega, interrupcion 0, y al NO y NC +5 y gnd, con una resistencia de 10k a masa en pin2.

Comprobado que en medio de delays (para pruebas), actua de forma correcta

void fallotension()
{
   digitalWrite(bomba,LOW);//apaga bomba si se detecta fallo alimentacion
     
}

el problema es que si hay un cero de tensión y la bomba está en marcha, la orden de volver a poner en marcha se retrasara x segundos, pero no lo hace, ya que según he visto con google, que al "desaparecer" la interrupción vuelve donde estaba antes, es decir, con el cero la bomba pegará un "golpe" de parada-puesta en marcha, y es lo que quisiera evitar. Ya sé que poniendo algo así

 if (digitalRead(ausencia_tension)==LOW)
{
 digitalWrite(bomba,LOW);
delay(5000);
}

en vez de la interrupcion lo evitaría, pero como indico, es para ir aprendiendo
¿es posible?
gracias y saludos

*@Surbyte: en cuanto esté montado y funcionando encima de la mesa, ya probaré y comentaré en el post que ya tengo abierto, como van los modulitos que compré en aliexpres para convertir 4-20 a 0-5

Algo que no explicaste es como si la alimentación se va, el sistema (bomba) tiene energía para funcionar? Acaso lo estas alimentando con baterías. No entiendo la idea, de un retardo de 5 seg si no hay energía para accionar la bomba a menos que la alimentes con baterías y no quieras hacerlo.

gracias, acabaré de puntualizar. La bomba va con 380, así si la tensión se va, ésta se para. Pero lo que no quiero es que si hay un cero (no sé como se llama por sudamerica, me refiero a que la tensión de va una fracción de segundo y vuelve, tiempo para parar y arrancar bruscamente en muy poco tiempo, pudiendo producir un golpe de ariete).
Lo que tampoco he comentado es que el motivo para retardar el apagado del arduino (aumentando el valor del C principal) es que grabe datos de minutos y número de arrancadas a la eprom antes de apagarse (lo que antes hacía con un condensador de 1F/5,5v)
gracias

Ahora si.. pero eso no es un 0, eso es un corte abrupto de tensión. Y no hay formas de decir las cosas diferentes en sudamérica de como se dicen en España desde mi punto de vista.
Solo quieres implementar un retardo al arranque, cuando se de esa condición de microcorte de tensión.
Ahora veamos lo que has hecho.

Bueno, yo debo suponer que el microcorte afecta a la bomba pero no al Arduino. Esa es tu responsabilidad asi que suponiendo que no pasé y de hecho eso debe ocurrir porque sino para que toda la consulta, no?
Entonces.. tienes un corte de energía. La tensión va a 0, la bomba se detiene, la ISR lo detecta.
Entonces... levanta un flag en el código de la ISR y cuando vuelva la energía confirma que se cumplan 5 seg para que la bomba se active.

en tu isr tendrás y no se porque preguntas por LOW cuando puedes simplemente decirle que será una interrupción por nivel bajo o por FALLING
pero sigamos

Para mi en la ISR ya sabemos que estamos en LOW sino no se activa asi que no pondré el if y [/color]
tampoco la consulta digitalRead(bla bla bla)[/color]

solo (recuerda definir a flagAusenciaTension como volatile bool

// en definiciones globales
volatile bool flagAusenciaTension = false;

void setup() {

   attachinterrupt(INT0, AusenciaTension, LOW); // o FALLING 1 a 0
}
// resto de código

void AusenciaTension() {
        flagAusenciaTension = true;
}

Acá los modos posibles

interrupt: the number of the interrupt (int)
pin: the pin number
ISR: the ISR to call when the interrupt occurs; this function must take no parameters and return nothing. This function is sometimes referred to as aninterrupt service routine.
mode: defines when the interrupt should be triggered. Four constants are predefined as valid values:

- LOW to trigger the interrupt whenever the pin is low,
- CHANGE to trigger the interrupt whenever the pin changes value
- RISING to trigger when the pin goes from low to high,
- FALLING for when the pin goes from high to low.

The Due board allows also:

- HIGH to trigger the interrupt whenever the pin is high.

Gracias, mañana lo probaré. Lo que es la interrupcion funciona, ya lo tengo implementado (no lo de flag).
Sobre lo del cero, quizas no es técnicamemente aprobado por la RAE, pero en España, e incluso por técnicos de las compañias electricas, llamamos "cero" al microcorte.
saludos

Bueno.. evidentemente es una nomenclatura que en Argentina no conocemos.

Bueno, despues de buscar en google e intentar usar el flag, si bien lo encontré no supe usarlo, y como durante las funciones que hará durante el 99,9999% del año el sistema de relé 220 de bobina a red(que de hecho es el mismo "sensor" que se usaria para la interrupcion) ya sirve en este % indicado, así lo he dejado. Hay un puslador para verificar el reloj y presets de la presión minima y maxima, y en estos 10 segundos de visualizacion es donde he dejado la interrupcion, más que nada para "hacer bonito", ya que en estos 10 segundos ya sería mala pata (o murphy en plena acción xD) que la luz fluctuara varias veces y se estropeara algo :slight_smile:
dejo esta parte por si sirve de algo, seguro que se puede mejorar y mucho, pero así funciona y además, lo hace bien. Gracias y saludos

void visualiza_reloj_y_presets()
{
if(digitalRead(ajuste) == HIGH)
  {
    for( int a=50; a>=1; a-- )//hace visible estos datos durante x segundos
    {
      attachInterrupt(0, fallotension, FALLING);//habilita interrupcion
     
      -------------muestra en display preset----------------

    }
    while (digitalRead(ajuste) == HIGH)
    {
      presets();//al pulsar boton ajuste ejecuta lo superior, si pasado el tiempo "for" y el pulsador sigue puslado, ejecura preset
    }
    carga_minutos_arranque();//si ya no está pulsado se pone en pantalla principal
  }
  detachInterrupt(0);//deshabilita interrupciones por fallo de red- ahora actua el ausencia_tension ->pin6 

}

No entiendo que no funcionó.
Yo uso el flag para disparar un evento siguiendo el ringing del teléfono y salvando la distancia con tu caso, es lo mismo.
Quería copiar la misma cadencia pero no podía. Asi que decidí hacer lo que si puedo. Usar la ISR para que me diga cuando comienzo una secuencia que hago en el loop y mientras apago interrupcciones. El sistema en el loop hace la misma secuencia que el Ring del teléfono y nadie se da cuenta comó lo hace o que solo un disparo inicia todo.

El ejercicio que planteas es interesante y deberías intentar resolverlo a menos que tengas cosas mas importantes.
Solo que me resulta dificil seguirte porque lo comentas de un modo que es claro para ti pero no para nosotros que no estamos en tu proyecto. No se si soy claro.
En tu último comentario vienes con esta rutina

void visualiza_reloj_y_presets()

que sinceramente no se de donde salió. Llama a preset() y no explicas que hace. así que solo esta claro para ti.

El montaje se trata de un "presostato de presión" para un grupo de agua a presion en un lugar en que el agua viene de pozo, y no sé porqué los alemanes, durante su construccion pusieron un grupo unicamente para una torre de refrigeracion que casi cabe en una nevera, así que el recorrido de agua es muy pequeño, unos 15 metros de tuberia y en el momento de pararse el grupo por llegar a la presion de consigna del presostato mecanico, la presion fluctua y efectua un ciclo de paro-marcha-paro del motor varias veces hasta que la presion se estabiliza. Con el arduino hago lo mismo, si la presion llega al máximo, por ejemplo 8 bar, hasta que estos 8 bar no se han superado durante 5 segundos seguidos no se para la bomba, la presión tambien ha de disminuir por debajo de (por ejemplo) 6 bar durante 5 segundos para ponerse en marcha, ahora ya está así y funciona, solo que lo he hecho nuevo para poner una sonda 4-20 (y preparado para poner las dos que hay despues de los filtros tambien 4-20) por avería de una de las 3 chinas 0-5v, ya que de las 3, una duró 1 semana. hay una sonda que contola la bomba y una despues de cada uno de los filtros.

En funcionamiento normal el 99,999% del año, este void que mencionas no está actuando, al estar if(digitalRead(ajuste) == HIGH) en LOW, por lo tanto, por ahí no pasa. Al poner en HIGH esta entrada "ajuste" con una pulsación, está unos 10 segundos mostrando los datos pre-ajustados en el display y vuelve al modo normal de control de presión de sistema, poniendo en marcha o parando la bomba según esté la presión, 6 y 8 bar arranca/para bomba respectivamente, dentro de void carga_minutos_arranque()

Al pulsar el pulsador, "ajuste" es HIGH y entra en modo de visualizar datos en pantalla, si el pulsador se mantiene pulsado, entonces la bomba se para y se entra en "modo ajustes" entonces se puede variar los 6 y/u 8 bares de control de la bomba, para que ésta se ponga en marcha o se pare (void presets

hay contador de minutos diarios y totales, contador de arrancadas diarias y totales, estos datos se guardan en la eprom cada dia a las 10:00:00 y/o si mediante la desconexion de un relé con bobina 220 detecta ausencia de energia, pone dos entradas del arduino a LOW, aisladas entre sí por un diodo cada una, una el pin2 que es la interrupcion y otra en la 6, que al pasar a LOW activa la rutina de grabacion de datos y desactiva la bomba en funcionamiento normal, no durante la visualizacion de datos en pantalla.

no sé si ahora queda algo mmás entendible, ya que una cosa que debia ser con 2 delays de 5 segundos, ha acabado con más de 1000 lineas de codigo xD, ya que he ido añadiendo cosas. Lo del flag no me ha funcionado a mí, seguro que por hacer algo o mucho mal, y/o no haber encontrado el ejemplo adecuado.
saludos y gracias