Problemas control servo - rearme automatico ICP

Hola a todos, estoy intentando hacer un rearmador del interruptor de control de potencia de mi contador inteligente, es decir, que cuando la luz salta por consumo no tenga yo que ir al cuadro de luces a bajar y volver a subir el interruptor geneneral.
Hasta ahora lo había conseguido utilizando un power bank, una placa de dos relés, un contactor y un arduino nano.

/*
  Para rearmar el ICP de un contador inteligente es necesario abrir y cerrar
  el circuito de carga del ICP durante un tiempo mayor a 2 segundos y que no
  debe ser siempre el mismo ya que el contador detectaría que se trata de un
  automatismo.
  Para esto utilizaremos un Contactor 1NO 1NC el contacto normalmente abierto 
  servirá para abrir el circuito y el  normalmente cerrado para alimentar el
  arduino.
  Utilizaremos un relé para cerrar el circuito del ICP sobre la bobina del 
  contactor y de esta forma una vez se restablezca la corriente el contactor
  vuelva a cerrar, y otro relé para mantener el arduino alimentado durante 
  los tiempos de conmutación.

  
*/
int Tiempo;
int Contador;
int const Relecontactor=12;
int const Relevin=11;
int const VContactor=10;
int Alimentacion;
// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(Relecontactor, OUTPUT);
  pinMode(Relevin, OUTPUT);
  pinMode(VContactor, INPUT);
  
  Tiempo=3000;
  Contador=0;
  digitalWrite(Relevin, LOW);   //turn on the rele wich keeps the arduino on we main VIN is off
  digitalWrite(LED_BUILTIN, HIGH);    // turn the LED off
  digitalWrite(Relecontactor, HIGH);          // turn off the rele
  Tiempo=random(2500,9000);
  delay(Tiempo);                              //Es posible que sea mejor empezar el proceso con el relé
                                              // cerrado, en ese caso sería mejor eliminar estas 5 lineas
}

// the loop function runs over and over again forever
void loop() {
  
  if (Contador<3){
    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
    digitalWrite(Relecontactor, LOW);           // turn on the rele (it needs a 0 voltage for activation)
    Tiempo=random(2500,9000);
    delay(Tiempo);                       // wait for random time
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off
    digitalWrite(Relecontactor, HIGH);          // turn off the rele
    Tiempo=random(2500,9000);
    delay(Tiempo);                       // wait for random time
    
    }
  else {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(200);
    digitalWrite(LED_BUILTIN, LOW);
    delay(200); 
      }
  Alimentacion=digitalRead(VContactor);
  if (Alimentacion == 1){
  digitalWrite(Relevin, LOW);
  }
  else{
  digitalWrite(Relevin, HIGH);
  }
        
  Contador++;
  delay(15);
  }

Ese es el código con el que lo tenia funcionando, pero he descubierto que si salta varias veces en un período corto de tiempo es necesarío rearmar directamente en el boton del contador inteligente.

Es por esto que quiero añadir un servo a todo el conjunto para que tras tres intentos fallidos de rearme, sea el servo el que pulse el boton del contador.

El problema es que en el momento que añado el comando attach para controlar el servo el resto del código deja de funcionar correctamente.

¿alguien tiene alguna idea o le ha pasado algo similar?

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Y porque no cambias el enfoque, en lugar de agregar un elemento que te genera problemas como es el servo, intentas cambiar el programa.
Veamos. Tienes un delay o sea, entiendo que si hay cortes en esos 3 segundos simplemente te los pierdes.

-----
Tiempo=random(2500,9000);
 delay(Tiempo);

o sea que tienes un delay variable entre 2.5 y 9 segundos. Cual es la razón?
Cual es el mínimo tiempo que tolera el interruptor de control de potencia ?

Para rearmar el ICP del contador inteligente por lo general hay que bajar y volver a subir el magnetotermico principal, lo hago con un corte variable porque si el contador ve que siempre es el mismo tiempo interpreta que es un automatismo el que está rearmando el sistema y no se rearma.

Ok y es en ese tiempo variable que pones que te pierdes justamente otros cortes que requieren rearmado?

No no, cuando el arduino entra en funcionamiento es porque ha habido un corte y en el momento que se subsana el arduino se apaga. Los tres intentos de apertura y cierre son para rearmar el ICP y acabar con el corte de luz

Probablemente la librería servo se llevará mal con la función delay. Prueba a cambiar la programación quitando los delay del loop() sustituyéndolos con los métodos con millis()

No obstante si te salta tantas veces imagino que estás superando "habitualmente" la potencia contratada. Te sugiero que amplíes un poco la potencia contratada :slight_smile:

he intentado eliminar completamente la funcion delay sustituyendola por millis, pero sigo sin conseguir nada.
Efectivamente el problema es que supero la potencia contratada, pero me pasa unicamene en las noches muy frias de invierno, por eso estoy intentando evitar cambiar la potencia para evitar el sobrecoste durante todo el año.

Pon tu código modificado por si alguno podemos ver algo o si podemos reproducir el problema.
También te sugeriría otra posible solución. Por lo que dices, ¿me imagino que tienes calefacción eléctrica? Si es así y más o menos controlas de Arduino - electricidad - electrónica podrías hacerte un medidor de consumo general de la casa y cuando calcules que estás próximo a llegar al máximo pues das la orden para desconectar algún radiador. No lo veo complicado.
Mi sugerencia de solución es porque no creo que pase nada pero vamos, tampoco creo que sea bueno que de forma recurrente en algunas noches te salte la luz de toda la casa hasta más de tres veces.

El problema es que se trata de calefacción por aerotermia, aunque el control si funciona por habitaciones los cortes no son inmediatos, aunque es un buen punto de vista puedo intentar probar algo parecido a lo que tu me dices, muchas gracias.