Sirena de Bomberos Problema Debounce o Ruido?

Estimados, buenas tardes, hace un tiempo me ayudaron con un problema en el foro "AUTOMATIZACIÓN DE SIRENA DE BOMBEROS" el sistema y código funciona pero sucede lo que algunos de los expertos mencionaban sobre el uso de pulsadores, el rebote o ruido del sistema hace fallar a veces al programa.
Lei sobre el concepto de "Debounce" pero no logro comprender como encuadrarlo en el código mio.
Les comparto el foro anterior para ponerlos en tema:

https://forum.arduino.cc/index.php?topic=624089.0

y el código con las modificaciones que estoy intentando formular y donde me estoy quedando haciendo aguas,

const int BOTON1TOQUE = A0 ;// el número del pin del botón
const int BOTON2TOQUES = A1 ; // el número del pin del botón
const int BOTON3TOQUES = A2 ;// el número del pin del botón
const int LED1TOQUE = 11 ; // el número del pin del LED
const int LED2TOQUES = 10 ; // el número del pin del LED
const int LED3TOQUES = 9 ; // el número del pin del LED
const int ARRANQUECONTACTOR1 = 13 ; // el número del pin del contactor
const int ARRANQUECONTACTOR2 = 12 ; // el número del pin del contactor

// Las variables cambiarán: 
int ledState = HIGH ;         // el estado actual del pin de salida 
int buttonState;             // la lectura actual del pin de entrada 
int lastButtonState = LOW ;   // la lectura anterior del pin de entrada      

// las siguientes variables son longitudes sin signo porque el tiempo, medido en 
// milisegundos, se convertirá rápidamente en un número mayor que el que se puede almacenar en un int. 
unsigned long lastDebounceTime = 0 ;  // la última vez que se activó el pin de salida 
unsigned long debounceDelay = 50 ;    // el tiempo de rebote; aumentar si la salida parpadea 

int SubidaPunto1 = 25000;       //tiempo en levantar la sirena en punto 1 
int BajadaPunto1 = 5000;        //tiempo en bajar la sirena en punto 1
int DelayEntrePunto1y2 = 1500;  //tiempo de conmutacion entre punto 1 y 2
int SubidaPunto2 = 18000;       //tiempo en levantar la sirena en punto 2
int BajadaPunto2 = 10000;       //tiempo en bajar la sirena en punto 2

void setup(){
   pinMode(BOTON1TOQUE, INPUT);
   pinMode(BOTON2TOQUES, INPUT);
   pinMode(BOTON3TOQUES, INPUT); //INPUT_PULLUP comando anterior
   pinMode(LED1TOQUE, OUTPUT);
   pinMode(LED2TOQUES, OUTPUT);
   pinMode(LED3TOQUES, OUTPUT);  
   pinMode(ARRANQUECONTACTOR1, OUTPUT);
   pinMode(ARRANQUECONTACTOR2, OUTPUT);
   digitalWrite ( LED1TOQUE , ledState ) ;
   digitalWrite ( LED2TOQUES , ledState ) ;
   digitalWrite ( LED3TOQUES , ledState ) ;
   digitalWrite ( ARRANQUECONTACTOR1 , ledState ) ;
   digitalWrite ( ARRANQUECONTACTOR2 , ledState ) ;
}

void loop()
{ 
  // lee el estado del switch en una variable local: 
  int reading = digitalRead ( BOTON1TOQUE ) ; 
  int reading = digitalRead ( BOTON2TOQUES ) ;
  int reading = digitalRead ( BOTON3TOQUES ) ;
  
  // verifique si acaba de presionar el botón 
  // (es decir, la entrada pasó de BAJA a ALTA), y ha esperado lo suficiente 
  // desde la última vez que presionó para ignorar cualquier ruido:

  // Si el interruptor cambió, debido al ruido o al presionar: 
  if ( lectura ! = LastButtonState ) { 
    // restablecer el temporizador
    antirrebote lastDebounceTime = millis ( ) ; 
  }
  if ( ( millis ( ) - lastDebounceTime ) > debounceDelay ) { 
    // sea cual sea la lectura, ha estado allí por más tiempo que el debounce 
    // delay, así que tómalo como el estado actual real: 

    // si el estado del botón tiene cambiado: 
    if ( lectura ! = buttonState) {
      buttonState = lectura ; 

//HASTA ACA VOY BIEN... LO COMPRENDO,.. NO SE COMO INTRODUCIR EL CODIGO MIO 
//DE LOS IF DE MAS ABAJO PARA REALIZAR LA LECTURA DE LOS BOTONES DE LOS 3 TOQUES 
// Y COMO FUNCIONA EL RESETEO DE CADA UNA DE LAS BVARIABLES DE CADA PULSADOR


      // solo alterna el LED si el nuevo estado del botón es ALTO 
      si ( buttonState == HIGH ) {
        ledState = ! ledState ;  
        }
        }
        }
        // establece el LED: 
  digitalWrite ( ledPin , ledState ) ; 

  // guarda la lectura. La próxima vez a través del ciclo, será lastButtonState:
  lastButtonState = reading ;
  
   if (digitalRead(BOTON1TOQUE) == LOW) 
   {
      //1 toque
      digitalWrite(LED1TOQUE, HIGH);
      //Principal
      digitalWrite(ARRANQUECONTACTOR1, HIGH);
      delay(SubidaPunto1);          //Wait for 25 second(s)
      digitalWrite(ARRANQUECONTACTOR1, LOW);
      delay(DelayEntrePunto1y2);    //Wait for 1.5 second(s)
      //Toque 1
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);          //Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);          //Wait for 10 second(s)
      digitalWrite(LED1TOQUE, LOW);
   }
   if (digitalRead(BOTON2TOQUES) == LOW) {
      //2 toques
      digitalWrite(LED2TOQUES, HIGH);
      digitalWrite(LED1TOQUE, HIGH);
      //Principal
      digitalWrite(ARRANQUECONTACTOR1, HIGH);
      delay(SubidaPunto1);          // Wait for 25 second(s)
      digitalWrite(ARRANQUECONTACTOR1, LOW);
      delay(DelayEntrePunto1y2);    //Wait for 1.5 second(s)
      //Toque 1
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);          //Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);          //Wait for 10 second(s)
      //Toque 2
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);          //Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);          //Wait for 10 second(s)
      digitalWrite(LED1TOQUE, LOW);
      digitalWrite(LED2TOQUES, LOW);
   }
   if (digitalRead(BOTON2TOQUES) == LOW) {
      //3 toques
      digitalWrite(LED3TOQUES, HIGH);
      digitalWrite(LED2TOQUES, HIGH);
      digitalWrite(LED1TOQUE, HIGH);
      //Principal
      digitalWrite(ARRANQUECONTACTOR1, HIGH);
      delay(SubidaPunto1);         //Wait for 25 second(s)
      digitalWrite(ARRANQUECONTACTOR1, LOW);
      delay(DelayEntrePunto1y2);   // Wait for 1.5 second(s)
      //Toque 1
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);         // Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);         // Wait for 10 second(s)
      //Toque 2
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);         // Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);         // Wait for 10 second(s)
      //Toque 3
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);         // Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);         // Wait for 10 second(s)
      digitalWrite(LED3TOQUES, LOW);
      digitalWrite(LED2TOQUES, LOW);
      digitalWrite(LED1TOQUE, LOW);
   }
}

Rebote es una cosa, ruido otra.
Estoy seguro que es mas ruido que rebote.

Cuando accionas la sirena es que ocurre el problema (eso sería por ruido) o cuando pulsas (eso sería por rebote)?

@surbyte
Estimado, gracias por tu respuesta, el problema radica cuando se presiona el pulsador, cualquiera de los tres. Al presionar alguno de estos la lógica seria que comience el ciclo (uno, dos o tres toques), pero a veces cuando se presiona el botón se escucha aperturas y cierres intermitentes del contactor 1 (ARRANQUECONTACTOR1) y en algunas ocaciones el programa concluye correctamente y en otras inicial con el arranque del contacto nuemero 1 y cuando realiza la conmutacion para el segundo contactor (ARRANQUECONTACTOR2) el programa se detiene.

espero ser claro y que con esta info adicional puedas determinar a cual corresponde el problema. Quedo atento igual ante cualquier consulta, y agradezco tu ayuda.

Gracias!

Bueno, tienes problemas de ruido con las bobinas de lso contactores.
Algo que inicialmente creo que te dijimos.

Lee el hilo de la sección Hardware [OFFTOPIC] o casi, hablemos de snubbers.

Ahi se presentan opciones para contrarrestar tu problema.

Estimados, buen dia, estuve analizando el tema snubbers para mitigar el problema, compre un rele de estado solido de arduino, lo que a su vez me permite eliminar varias etapas para ir elevando la tensión para el control de los contactores (mucho mas simple y compacto, obvio) pero se me presento otro problema, el rele de estado solido en su salida de control lo tengo asignado a dos variables pin 12 y 13 que su estado inicial ocasiona que el rele en su salida se encuentre cerrado, por lo que el programa inicia cerrando los dos contactores, lo que debería suceder totalmente al reves, intente modificar el código, estoy implementando un ciclo while, logre eliminar el problema inicial pero ahora no puedo ejecutar el programa con los pulsadores, A0,A1 y A2... les paso el codigo para escuchar sugerencias

#define BOTON1TOQUE A0
#define BOTON2TOQUES A1
#define BOTON3TOQUES A2
#define LED1TOQUE 11
#define LED2TOQUES 10
#define LED3TOQUES 9
#define ARRANQUECONTACTOR1 13
#define ARRANQUECONTACTOR2 12

int SubidaPunto1 = 25000;       //tiempo en levantar la sirena en punto 1
int BajadaPunto1 = 5000;        //tiempo en bajar la sirena en punto 1
int DelayEntrePunto1y2 = 1500;  //tiempo de conmutacion entre punto 1 y 2
int SubidaPunto2 = 18000;       //tiempo en levantar la sirena en punto 2
int BajadaPunto2 = 10000;       //tiempo en bajar la sirena en punto 2

void setup(){
   pinMode(BOTON1TOQUE, INPUT_PULLUP);
   pinMode(BOTON2TOQUES, INPUT_PULLUP);
   pinMode(BOTON3TOQUES, INPUT_PULLUP);
   pinMode(LED1TOQUE, OUTPUT);
   pinMode(LED2TOQUES, OUTPUT);
   pinMode(LED3TOQUES, OUTPUT); 
   pinMode(ARRANQUECONTACTOR1, OUTPUT);
   pinMode(ARRANQUECONTACTOR2, OUTPUT);
   }

void loop(){

while(digitalRead(A4)==1 )
{  digitalWrite(ARRANQUECONTACTOR1, HIGH);
   digitalWrite(ARRANQUECONTACTOR2, HIGH);
}
while (digitalRead(BOTON1TOQUE) == 1) {
      //1 toque
      digitalWrite(LED1TOQUE, HIGH);
      //Principal
      digitalWrite(ARRANQUECONTACTOR1, HIGH);
      delay(SubidaPunto1);          //Wait for 25 second(s)
      digitalWrite(ARRANQUECONTACTOR1, LOW);
      delay(DelayEntrePunto1y2);    //Wait for 1.5 second(s)
      //Toque 1
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);          //Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);          //Wait for 10 second(s)
      digitalWrite(LED1TOQUE, LOW);
   }
while (digitalRead(BOTON2TOQUES) == 1) {
      //2 toques
      digitalWrite(LED2TOQUES, HIGH);
      digitalWrite(LED1TOQUE, HIGH);
      //Principal
      digitalWrite(ARRANQUECONTACTOR1, HIGH);
      delay(SubidaPunto1);          // Wait for 25 second(s)
      digitalWrite(ARRANQUECONTACTOR1, LOW);
      delay(DelayEntrePunto1y2);    //Wait for 1.5 second(s)
      //Toque 1
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);          //Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);          //Wait for 10 second(s)
      //Toque 2
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);          //Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);          //Wait for 10 second(s)
      digitalWrite(LED1TOQUE, LOW);
      digitalWrite(LED2TOQUES, LOW);
   }
while (digitalRead(BOTON2TOQUES) == 1) {
      //3 toques
      digitalWrite(LED3TOQUES, HIGH);
      digitalWrite(LED2TOQUES, HIGH);
      digitalWrite(LED1TOQUE, HIGH);
      //Principal
      digitalWrite(ARRANQUECONTACTOR1, HIGH);
      delay(SubidaPunto1);         //Wait for 25 second(s)
      digitalWrite(ARRANQUECONTACTOR1, LOW);
      delay(DelayEntrePunto1y2);   // Wait for 1.5 second(s)
      //Toque 1
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);         // Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);         // Wait for 10 second(s)
      //Toque 2
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);         // Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);         // Wait for 10 second(s)
      //Toque 3
      digitalWrite(ARRANQUECONTACTOR2, HIGH);
      delay(SubidaPunto2);         // Wait for 18 second(s)
      digitalWrite(ARRANQUECONTACTOR2, LOW);
      delay(BajadaPunto2);         // Wait for 10 second(s)
      digitalWrite(LED3TOQUES, LOW);
      digitalWrite(LED2TOQUES, LOW);
      digitalWrite(LED1TOQUE, LOW);
   }
}

Estimados, buen dia, estuve analizando el tema snubbers para mitigar el problema, compre un rele de estado solido de arduino, lo que a su vez me permite eliminar varias etapas para ir elevando la tensión para el control de los contactores (mucho mas simple y compacto, obvio) pero se me presento otro problema, el rele de estado solido en su salida de control lo tengo asignado a dos variables pin 12 y 13 que su estado inicial ocasiona que el rele en su salida se encuentre cerrado, por lo que el programa inicia cerrando los dos contactores, lo que debería suceder totalmente al reves, intente modificar el código, estoy implementando un ciclo while, logre eliminar el problema inicial pero ahora no puedo ejecutar el programa con los pulsadores, A0,A1 y A2... les paso el codigo para escuchar sugerencias

Moderador:
- No repitas toda la respuesta que se te da.
Si quieres usar para resaltar un párrafo no hay problema porque esa es la razón de citar algo, pero si dejas todo, no hace falta porque ya se lee en la respuesta que te han hecho y se considera una falta a las normas.
Editaré esta ultima respuesta donde cometes la falta pero tenlo presente porque ya te lo he dicho antes!!

Porque usas dos pines para controlar 1 contactor sea de estado solido o no? Como es que lo controlas? No entiendo este comentario.

el rele de estado solido en su salida de control lo tengo asignado a dos variables pin 12 y 13

surbyte:
Moderador:
- No repitas toda la respuesta que se te da.
Si quieres usar para resaltar un párrafo no hay problema porque esa es la razón de citar algo, pero si dejas todo, no hace falta porque ya se lee en la respuesta que te han hecho y se considera una falta a las normas.
Editaré esta ultima respuesta donde cometes la falta pero tenlo presente porque ya te lo he dicho antes!!

Porque usas dos pines para controlar 1 contactor sea de estado solido o no? Como es que lo controlas? No entiendo este comentario.

Disculpas, comprendo la observación compre un modulo de 2 rele de estado solido. el pin 12 a la entrada de control CH1 y el pin 13 a la entrada CH2 del rele, sus salidas,, bornes NO los utilizo para alimentar la bobina 220vca de los 2 contactores que necesito conmuten. todo eso esta bien en sus conexiones y funcionamiento anterior andaba correctamente solo tenia el problema incial que comente, al suplantar la logica de transistores y reles de 12 vcc por el modulo de estado solido se me presento el problema que las salidas de este inicializan en NC por lo que empece a experimentar con el ciclo While pero no se que problema estoy teniendo ahora.

Buenas Santiago, he estado mirando los dos hilos e intentando comprender por donde van los tiros pero...
Lo único que veo es que tu primer código estaba bien mas o menos, aunque se podía haber optimizado como dijo @surbyte, podrías declarar las entradas al principio y no "in loop", ademas de utilizar "millis" en vez de "delay", ya que si quieres activar el segundo tono de sirena no podrás hasta que termine el anterior.

Respecto al ruido de los interruptores esta bien deshacerse de ellos, pero no tiene porque ser obligatorio ni debería de influir mucho en el comportamiento de tu sistema.

He estado probando tu código "in vitro" y cumple su función a medias (con el delay de la muerte pero cumple).

Te recomiendo cambiar las entradas Analógicas por Digitales (¿porque utilizas analógicas si son pulsadores?)
Ademas declaras:

pinMode(A0, INPUT);

Y luegos le dices que lea el Pin como digital in loop (comprendo que es un pulsador):

if (digitalRead(A0) == LOW) {

No es muy recomendable hacerlo asi...

Y para rematar fíjate bien en las dos lineas anteriores... Quieres leer un valor "LOW" (negativo) para activar, pero no declaras un "INPUT_PULLUP", así que supongo que estarás suministrándole 5V a la entrada A0 a través de una resistencia haciendo un "PULLUP" externo. Te lo puedes ahorrar, aunque en sistemas de control de alta tensión, bueno mejor que sea todo a lo bruto y robusto.

Y como dije antes hice una prueba in vitro, y con pulsadores conectados a las entradas Analógicas, los configure en modo "PULLUP externo y funcionaba bien; pero tenia que esperar a que termine la secuencia de "Un toque" para empezar el segundo

Y respecto a tu ultima pregunta, que ahora la lógica que necesitan tus Reles de Estado Solido es la contraria, tendrás un problema y es que al encender Arduino siempre tendrá un valor de salida inicial y puede ser que active tus reles por un segundo hasta que lo invierta por código, ¿solución? Utilizar un transistor a cada salida de control hacia los Reles.

Y ya si que por ultimo, he estado pensando tu gran problema de reinicio de Arduino, y posiblemente sea una tontería y algo obvio esto pero...
1-. ¿Alimentas los Reles con el Propio Arduino?
2-. ¿Alimentas los Reles y el Arduino por separado pero con una misma fuente? Si es así, ¿tiene fuerza suficiente?
3-. ¿Aislas la alimentación de Arduino? Si no es así ¿Que reles usas?

Ese tipo de reseteo de Arduino es por un Ruido transitorio de vuelta, cosa que hará que te dure poco el Arduino o por Alimentacion (Intensidad o Voltage) baja.

@agelxudo
Cual es el problema con esto?

pinMode(A0, INPUT);

Un pin que habitulamente se usa como entrada analógica puede usarse como entrada o salida digital, tal vez no lo sepas, pero es asi.
El hace uso de esa funcionalidad y acostúmbrate porque los microcontroladores cada vez mas son multifuncion en sus pines.

Los pines A0...A5 en un UNO puede ser cualquier cosa, entrada Analógica, entrada digital o salida digital.

@surbyte

Como he resaltado en mi comentario, es solo una opinión personal...
¿Para que hacer que un Pin destinado a ser Analógico se use como digital?
Es manía mía poner cada cosa en su sitio, por si acaso tengo que añadir luego algún sensor que si necesite una entrada Analógica. Y si, se perfectamente que una Entrada Analógica se puede usar para leer y escribir en sus 2 modalidades. De hecho la gran mayoría de chips Atmel lo empiezan a implementar en mas numero de pines. Y otros tipos como AVR tienen también muchos pines multiproposito.

Así que como dije solo es una observación y opinión, no digo que "deba" cambiar alguno de esos pines, solo lo recomiendo.

Porcierto algo que no he entendido muy bien es el tema de: "Elevar la tension gradualmente gracias a haber puesto reles solidos"

Hola ! gracias por su interes y ayuda, no pude probar lo que mes estan sugiriendo porque estoy en mi casa y el equipo esta en el cuartel.

voy a tratar de explicar el funcionamiento de lo que se interesa automatizar, tal vez no comprender esto desde el principio haga qeu no nos entendamos en lo que estoy tratando hacer y pensamos que el codigo va bien y no funciona.

la Sirena con la que contamos es un motor trifasico que tiene un arranque en 2 puntos, a traves de unos transforamdores, es por esto que necesitamos conmutar 2 contactores ...

por una cuestion organizativa, la sirena se toca 1 2 o 3 veces, caada toque tiene su significado simbolico para la llegada de los bomberos.

La sirena inicia en el primer punto (ARRANQUE CONTACTOR 1) un periodo de tiempo hasta levantar revoluciones.

una vez que levanto las revoluciones suficientes (el tiempo seteado es correcto) se debe accionar el segundo contactor, en donde la sirena suena por el tiempo determinado seteado. si el boton que se pulso es el de 1 TOQUE, el esquema fianliza ahi.

Si se desea tocar 2 o 3 toques, fianlizado el parrafo anterior, el contactor 2 se debe desenergizar y esperar un tiempo para que el motor por inercia pierda revoluciones. Luego de este tiempo (ya probado y establecido) se debe volver a accionar el contactor 2 para que nuevamente tome revoluciones. para el sistema de 3 toques se repite una vez mas la ultima secuencia.

Espero ser claro en la explicación.. de aquí viene lo de "Elevar la tensión gradualmente gracias a haber puesto reles sólidos". al principio con la salida de 5V del Arduino con transistores comandaba reles de 12 Vcc y con estos maneja en sus contactos la alimentación 220vca de las bobinas de los contactares, presumí que esto generaba inconvenientes en el sistema, por lo que coloque un modulo de 2 rele de estado solido con lo que con 5v del arduino manejo las salidas directamente de 220 para las bobinas..

ahí inicio el problema de los reles que se inicializaban como NC y me generaron tener que modificar el codigo y los problemas actuales.

@angelxulo

Como he resaltado en mi comentario, es solo una opinión personal...
¿Para que hacer que un Pin destinado a ser Analógico se use como digital?

Simple, porque los tienes todos en uso y solo les queda los analógicos o porque se le da la gana y espero no tomes a mal este ultimo comentrio porque no es personal.
Yo tmb tenía la misma observación que tu, pero con el tiempo fui viendo que los pines ya no son exclusivos para algo, ya son multifuncionales, entonces uso el que me queda cómodo.
Mira un ESP32 por ejemplo, y dime.. porque usas un pin como GPIO I/O cuando puede ser una salida Analogica, o una entrada Analogica o parte de un bus I2C?

Espero haberte respondido o justificado mis razones por las que hice el comentario.
Me pasa tmb a mi que tengo en la cabeza algo como que se usa para determinado fin pero ahora todo esta cambiando.

@santiagopolvara
A ver porque me he perdido. Dejemos el código o bien hagamos algo con el para que estemos todos de acuerdo.
Primero ese código no es el que dejamos en el otro hilo, lo has modificado agregando delay y while que lo han cambiado para mal. Alla tu con eso, porque si le ponemos tiempo a algo y luego desistes y vas por la tuya que te dijimos que estabas errado.. que nos queda entonces, insistir 1,2, 3, n veces con lo mismo. Perdona que soy muy tajante. No uses delay()

Veo que en el código anterior Yo escribí tu código mejorado con millis() pero por alguna razón no lo postee y quedaste con el código de Kike que te modificó cosas al que ya tenias usando delay.
Ahora entiendo porque estas aún con delay en este código.

Asi que a ver si lo encuentro o bien modifico esto, si no me ganan porque veo que hay competencia y eso es bueno.

recuerdo tu comentario sobre la funcion millis, de lo que fui leyendo entiendo sirve para que el micro pueda ejecutar otra orden mientras se ejecuta esta funcion que a diferencia de delay el micro queda clavado en esta hasta se finalice, no le di mucha importancia a esto poque una vez seleccionada el opción (1 TOQUE 2 o 3..) no hay necesidad de interrumpir el proceso. debe finalizar si o si, si ya existe una cuestión de funcionalidad del codigo si, le meto mano a eso, pero lo que mas me tiene preocupado es primeramente la funcinalidad de esto.

De todos farmas millis() o delay() eso no quita tu problema de ruido.

Este es uno de esos problemas que a la distancia es dificil aconsejar.

pero a veces cuando se presiona el botón se escucha aperturas y cierres intermitentes del contactor 1

Este será nuestro objetivo.
Ver que provoca esto, si es un mal código o es una falla por ruido electrico.

Y si, es un mal código! Repites este criterio (whie) siempre pero podría ser de otro modo aunque analicemos uno y veamos que ocurre

Este parte de código es rara!! A4 no esta definido y si no esta definido su comportamiento es errático

while(digitalRead(A4)==1 )

Si no tiene importancia comentalo pero si lo usas define adecuadamente A4 como entrada.

while (digitalRead(BOTON1TOQUE) == 1) {
        //1 toque
        digitalWrite(LED1TOQUE, HIGH);
        //Principal
        digitalWrite(ARRANQUECONTACTOR1, HIGH);
        delay(SubidaPunto1);          //Wait for 25 second(s)
        digitalWrite(ARRANQUECONTACTOR1, LOW);
        delay(DelayEntrePunto1y2);    //Wait for 1.5 second(s)
        //Toque 1
        digitalWrite(ARRANQUECONTACTOR2, HIGH);
        delay(SubidaPunto2);          //Wait for 18 second(s)
        digitalWrite(ARRANQUECONTACTOR2, LOW);
        delay(BajadaPunto2);          //Wait for 10 second(s)
        digitalWrite(LED1TOQUE, LOW);
   }

Ahi le dices que lo haga mientras mantienes presionado.
Crea otro sketch y quedate con esta porción de código y veamos que ocurre.

Esta es mi modificación y si se comporta mal me dirás y tomaremos otra acción.
Solo es una parte y apunta a ver como se comportan los contactores.
Es lo mismo que hiciste tu pero con máquina de estados, y millis(). O esea, es de esperar problemas.
Tu dirás cuales y cuando.

Si necesitas establecer CUANDO, usa Serial.print para que te imprima situaciones, alguna de las 5 situaciones de este ciclo y saber qué contactor y en qué momento, tenemos ruido o problemas.

Este es el código

#define BOTON1TOQUE         A0
#define BOTON2TOQUES        A1
#define BOTON3TOQUES        A2
#define LED1TOQUE           11
#define LED2TOQUES          10
#define LED3TOQUES          9
#define ARRANQUECONTACTOR1  13
#define ARRANQUECONTACTOR2  12

const unsigned long SubidaPunto1        = 25000UL;       // tiempo en levantar la sirena en punto 1
const unsigned long BajadaPunto1        = 5000UL;        // tiempo en bajar la sirena en punto 1
const unsigned long DelayEntrePunto1y2  = 1500UL;        // tiempo de conmutacion entre punto 1 y 2
const unsigned long SubidaPunto2        = 18000UL;       // tiempo en levantar la sirena en punto 2
const unsigned long BajadaPunto2        = 10000UL;       // tiempo en bajar la sirena en punto 2
bool untoque, untoqueAnt = false;
bool funtoque = false;
byte estado1toque = 0;

void setup(){
   pinMode(BOTON1TOQUE, INPUT_PULLUP);
   pinMode(BOTON2TOQUES, INPUT_PULLUP);
   pinMode(BOTON3TOQUES, INPUT_PULLUP);
   pinMode(LED1TOQUE, OUTPUT);
   pinMode(LED2TOQUES, OUTPUT);
   pinMode(LED3TOQUES, OUTPUT);
   pinMode(ARRANQUECONTACTOR1, OUTPUT);
   pinMode(ARRANQUECONTACTOR2, OUTPUT);
}

void loop(){
  
  untoque = digitalRead(BOTON1TOQUE);
  if (untoque && !untoqueAnt) {
      funtoque = !funtoque;       // este es el flag que controla 1toque

  }
  untoqueAnt = untoque;

  if (funtoque) {
      switch (estado1toque) {
          case 0: //1 toque
                  digitalWrite(LED1TOQUE, HIGH);
                  //Principal
                  digitalWrite(ARRANQUECONTACTOR1, HIGH);
                  estado1toque = 1;
                  start = millis();
                  break;
          case 1: // reemplaza       
                  // delay(SubidaPunto1);   
                  if (millis() - start > SubidaPunto1) { //Wait for 25 second(s)
                      digitalWrite(ARRANQUECONTACTOR1, LOW);
                      estado1toque = 2;
                      start = millis();
                  }
                  break;
          case 2: // reemplaza       
                  // delay(DelayEntrePunto1y2);    //Wait for 1.5 second(s)
                  if (millis() - start > DelayEntrePunto1y2) { //Wait for 25 second(s)
                      // Toque 1
                      digitalWrite(ARRANQUECONTACTOR2, HIGH);
                      estado1toque = 3;
                      start = millis();
                  }
                  break;
          case 3: // reemplaza       
                  // delay(SubidaPunto2);    //Wait for 18 second(s)
                  if (millis() - start > SubidaPunto2) { //Wait for 25 second(s)
                      digitalWrite(ARRANQUECONTACTOR2, LOW);
                      estado1toque = 4;
                      start = millis();
                  }
                  break;
          case 4: // reemplaza       
                  // delay(SubidaPunto2);    //Wait for 18 second(s)
                  if (millis() - start > BajadaPunto2) { //Wait for 25 second(s)
                      digitalWrite(LED1TOQUE, LOW);
                      estado1toque = 0;
                  }
                  break;

      }
  }
}

surbyte:
@angelxuloSimple, porque los tienes todos en uso y solo les queda los analógicos o porque se le da la gana y espero no tomes a mal este ultimo comentrio porque no es personal.
Yo tmb tenía la misma observación que tu, pero con el tiempo fui viendo que los pines ya no son exclusivos para algo, ya son multifuncionales, entonces uso el que me queda cómodo.
Mira un ESP32 por ejemplo, y dime.. porque usas un pin como GPIO I/O cuando puede ser una salida Analogica, o una entrada Analogica o parte de un bus I2C?

Disculpas que me meta en la discusión, solo quería comentar que mas de una vez yo usé los pines analógicos para entradas de interruptores, y fue a causa de que necesitaba conectar los interruptores con muchos metros de cable (creo que en uno de los casos fue mas de 50 metros). Para no complicarme con hardware, los puse en la entrada analógica, y desde el código comprobaba si el valor de la entrada analógica es mayor o menor a un cierto valor. La verdad no sé si lo que hice fue lo mas correcto, o lo mas óptimo, pero fue fácil y funcionó (el mismo cable e interruptor conectado a la entrada digital no funcionaba).