problema de reset en la inbterrupcion

hola soy Jim soy nuevo en Arduino hace unas semanas comencé a programar en este lenguaje C.
tengo un pequeño problema. resulta que en multiples oportunidades cuando se ejecuta la interrupcion se resetea mi arduini estoy usando un NANO. abjunto mi progra, ojala y me ayuden…
muchas gracias.

#include <EEPROM.h>
#include "HX711.h"
#define DOUT  A1
#define CLK  A0
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
//Crear el objeto lcd  dirección  0x3f y 16 columnas x 2 filas    lcd(0x3f,16,2);
LiquidCrystal_I2C lcd(0x3f,16,2);  //lcd(0x3f,16,2);

HX711 balanza(DOUT, CLK);   

int puls[] = {2,3,4,5,6,7};  int rele[] = {8,9,10,11,12,13};  
int cont_a;   int cont_b;   int cont_c;   int tiempo;
//int cont_a = 50;   int cont_b = 50;   int cont_c = 50;   int tiempo = 50;      //habilitar solo en la primera subida del programa.
int i = 0;     int peso = 0; 
long T0 = 0 ;  // Variable global para tiempo.
volatile int contador = 0; 

void setup() 
{ attachInterrupt( 0, ServicioBoton1, LOW);  //attachInterrupt( 1, ServicioBoton2, LOW);
 lcd.init(); // Inicializar el LCD
 lcd.backlight(); //Encender la luz de fondo.
 balanza.set_scale(422.55); // Establecemos la escala
 balanza.tare(5);  //El peso actual es considerado Tara.
 for (int n=0; n<6; n++)   {pinMode(puls[n], INPUT);   pinMode(rele[n], OUTPUT);}  //configura entradas y salidas.
 cont_a = EEPROM.read(1);   cont_b = EEPROM.read(2);   cont_c = EEPROM.read(3);   tiempo = EEPROM.read(4);      

 lcd.setCursor(5, 0);
 lcd.print("Peso :");
 lcd.setCursor(9, 1);
 lcd.print("Kg");  
}

void loop() 
{ if (digitalRead(puls[4]) == 0)   //Boton de tare
 {  lcd.clear();  balanza.tare(20);
    lcd.setCursor(5, 0);   lcd.print("Peso :");
    lcd.setCursor(9, 1);   lcd.print("Kg"); 
 } 
 if (digitalRead(puls[1]) == 0)  {lcd.clear();  i++; } //Ingreso al Set_Point

 lcd.setCursor(2, 1);
 peso = (balanza.get_units(5));
 lcd.print(peso);
 
//////////////////// C O N T R O L /////////////////////
 if (peso <= cont_a)   {  digitalWrite(rele[0],HIGH);  }   //1º peso 70%
   else { digitalWrite(rele[0],LOW); }
 if (peso <= cont_b)   {  digitalWrite(rele[1],HIGH);  }   //2º peso 25%
   else { digitalWrite(rele[1],LOW); }
 if (peso <= cont_c)   {  digitalWrite(rele[2],HIGH);  }   //3º peso 05%  
   else { digitalWrite(rele[2],LOW); i = 7;}


//////////////////S E T _ P O I N T /////////////////////
 while(i == 1)      //Pone en pause el programa
 {  lcd.setCursor(0, 0);      lcd.print("S E T  P O I N T"); 
    lcd.setCursor(1, 1);      lcd.print("C O S T E N O");
    digitalWrite(rele[0],LOW);   digitalWrite(rele[1],LOW);   digitalWrite(rele[2],LOW);
    delay (250);
    if (digitalRead(puls[1])== 0) {lcd.clear();  i++; }   
 }

 while(i == 2)      //Setea 1º Peso 70%
 {  lcd.setCursor(3, 0);      lcd.print("SETEO  70%"); 
    lcd.setCursor(7, 1);      lcd.print(cont_a);
    if (digitalRead(puls[2]) == 0) {cont_a--; }
    if (digitalRead(puls[3]) == 0) {cont_a++; }
    delay (250);
    if (digitalRead(puls[1])== 0) {i++; }
 }

 while(i == 3)      //Setea 2º Peso 25%
 {  lcd.setCursor(3, 0);      lcd.print("SETEO  25%"); 
    lcd.setCursor(7, 1);      lcd.print(cont_b);   
    if (digitalRead(puls[2]) == 0) {cont_b--; }
    if (digitalRead(puls[3]) == 0) {cont_b++; }
    delay (250);
    if (digitalRead(puls[1])== 0) {i++; }
 }

 while(i == 4)      //Setea 3º Peso 05%
 {  lcd.setCursor(3, 0);      lcd.print("SETEO  05%"); 
    lcd.setCursor(7, 1);      lcd.print(cont_c);    
    if (digitalRead(puls[2]) == 0) {cont_c--; }
    if (digitalRead(puls[3]) == 0) {cont_c++; }
    delay (250);
    if (digitalRead(puls[1])== 0) {lcd.clear();  i++; }
 }

 while(i == 5)      //Setea tiempo de descarga
 {  lcd.setCursor(0, 0);      lcd.print("SETEO  T.DESCARG"); 
    lcd.setCursor(7, 1);      lcd.print(tiempo); 
    if (digitalRead(puls[2]) == 0) {tiempo--; }
    if (digitalRead(puls[3]) == 0) {tiempo++; }
    delay (250);
    if (digitalRead(puls[1])== 0) {lcd.clear();  i++; }  
 }
 
/////////////////////  E X T R A   /////////////////////
 while(i == 6)      //Guarda Parametros y prepara el Screent de la LCD
 {  EEPROM.write(1, cont_a);   EEPROM.write(2, cont_b);   EEPROM.write(3, cont_c);    EEPROM.write(4, tiempo);     
    lcd.setCursor(4, 0);      lcd.print("S A V E"); 
    lcd.setCursor(3, 1);      lcd.print("D A T O S");   //"P R O G R A M A"
    delay (1000);
    i = 0;
    lcd.clear();
    lcd.setCursor(5, 0);   lcd.print("Peso :");
    lcd.setCursor(9, 1);   lcd.print("Kg");
 }

//////////////////  D E S C A R G A   //////////////////
 while(i == 7)      //Rutina de Descarga
 {  if (digitalRead(rele[4]) == 1)  
    {  digitalWrite(rele[3],HIGH);
       delay (tiempo*100);
       digitalWrite(rele[3],LOW);
       i = 0;
       delay (tiempo*10);
       digitalWrite(rele[4],LOW);
    }
   
 }

 
}

//////////////////I N T E R R U P C I O N  0 1  /////////////////////
void ServicioBoton1()
  {   if ( millis() > T0  + 250)
         {   digitalWrite(rele[4],!digitalRead(rele[4]));
             peso = (balanza.get_units(5));
             T0 = millis();
         }
   }

BALANZA.ino (4.77 KB)

Note
Inside the attached function, delay() won't work and the value returned by millis() will not increment. Serial data received while in the function may be lost. You should declare as volatile any variables that you modify within the attached function. See the section on ISRs below for more information.

Dentro de la función "attach" El delay no funciona y el valor que entregue millis() no incrementara.
Los datos serial recibidos mientras se llama a la función, pueden llegar a perderse. Deberás declarar como volátil cada variable que modifiques dentro de la función attach.

attachInterrupt()

Podrá ser por eso?

He modificado tu código pero, hay incompatiblidades en cada delay.
Los delay detienen el flujo del programa.

#include <EEPROM.h>
#include "HX711.h"

#define DOUT        A1
#define CLK         A0
#define pinBoton1   2

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
//Crear el objeto lcd  dirección  0x3f y 16 columnas x 2 filas    lcd(0x3f,16,2);
LiquidCrystal_I2C lcd(0x3f,16,2);  //lcd(0x3f,16,2);

HX711 balanza(DOUT, CLK);   

int puls[] = {2,3,4,5,6,7};  
int rele[] = {8,9,10,11,12,13};  
int cont_a;   
int cont_b;   
int cont_c;   
int tiempo;
//int cont_a = 50;   int cont_b = 50;   int cont_c = 50;   int tiempo = 50;      //habilitar solo en la primera subida del programa.
int i = 0;     int peso = 0; 
unsigned long T0 = 0 ;  // Variable global para tiempo.
bool estado, estadoAnt = true;

void setup() { 
  lcd.init(); // Inicializar el LCD
  lcd.backlight(); //Encender la luz de fondo.
  balanza.set_scale(422.55); // Establecemos la escala
  balanza.tare(5);  //El peso actual es considerado Tara.
  for (int n=0; n<6; n++)   {
      pinMode(puls[n], INPUT);   
      pinMode(rele[n], OUTPUT);
  }  //configura entradas y salidas.
  cont_a = EEPROM.read(1);   
  cont_b = EEPROM.read(2);   
  cont_c = EEPROM.read(3);   
  tiempo = EEPROM.read(4);      

  lcd.setCursor(5, 0);
  lcd.print("Peso :");
  lcd.setCursor(9, 1);
  lcd.print("Kg");  
}

void loop() {   
  estado = digitalRead(pinBoton1);
  if (!estado && estadoAnt) {
      if (millis() > T0  + 250) {   
          digitalWrite(rele[4],!digitalRead(rele[4]));
          peso = (balanza.get_units(5));      // <=== ESTA FUNCION ES LENTA TMB
          T0 = millis();
      }
  }
  estadoAnt = estado;
  
  if (digitalRead(puls[4]) == 0) {  //Boton de tare
     lcd.clear();  balanza.tare(20);
     lcd.setCursor(5, 0);   
     lcd.print("Peso :");
     lcd.setCursor(9, 1);   
     lcd.print("Kg"); 
  } 
  if (digitalRead(puls[1]) == 0)  {
      lcd.clear();  
      i++; 
  } //Ingreso al Set_Point

  lcd.setCursor(2, 1);
  peso = (balanza.get_units(5));
  lcd.print(peso);
 
  //////////////////// C O N T R O L /////////////////////
  if (peso <= cont_a)   {  
      digitalWrite(rele[0],HIGH);  
  }   //1º peso 70%
  else { 
      digitalWrite(rele[0],LOW); 
  }
  if (peso <= cont_b)   {  
      digitalWrite(rele[1],HIGH);  
  }   //2º peso 25%
  else { 
      digitalWrite(rele[1],LOW); 
  }
  if (peso <= cont_c)   {  
      digitalWrite(rele[2],HIGH);  
  }   //3º peso 05%  
  else { 
      digitalWrite(rele[2],LOW); 
      i = 7;
  }

  //////////////////S E T _ P O I N T /////////////////////
  switch(i) {
    case 1: //Pone en pause el programa
            lcd.setCursor(0, 0);      
            lcd.print("S E T  P O I N T"); 
            lcd.setCursor(1, 1);      
            lcd.print("C O S T E N O");
            digitalWrite(rele[0],LOW);   
            digitalWrite(rele[1],LOW);   
            digitalWrite(rele[2],LOW);

            delay (250);  // <===== OBSERVAR
            if (digitalRead(puls[1])== 0) {
                lcd.clear();  
                i++; 
            }   
            break;

    case 2: //Setea 1º Peso 70%
            lcd.setCursor(3, 0);      
            lcd.print("SETEO  70%"); 
            lcd.setCursor(7, 1);      
            lcd.print(cont_a);
            if (digitalRead(puls[2]) == 0) {
                cont_a--; 
            }
            if (digitalRead(puls[3]) == 0) {
                cont_a++; 
            }
            delay (250);  // <===== OBSERVAR
            if (digitalRead(puls[1])== 0) {
                i++; 
            }
            break;
    case 3: //Setea 2º Peso 25%
            lcd.setCursor(3, 0);      
            lcd.print("SETEO  25%"); 
            lcd.setCursor(7, 1);      
            lcd.print(cont_b);   
            if (digitalRead(puls[2]) == 0) {
                cont_b--; }
            if (digitalRead(puls[3]) == 0) {
                cont_b++; }
            delay (250);    // <===== OBSERVAR
            if (digitalRead(puls[1])== 0) {
                i++; 
            }
            break;
    case 4: //Setea 3º Peso 05%
            lcd.setCursor(3, 0);      
            lcd.print("SETEO  05%"); 
            lcd.setCursor(7, 1);      
            lcd.print(cont_c);    
            if (digitalRead(puls[2]) == 0) {
                cont_c--; 
            }
            if (digitalRead(puls[3]) == 0) {
                cont_c++; 
            }
            delay (250);    // <===== OBSERVAR
            if (digitalRead(puls[1])== 0) {
                lcd.clear();  
                i++; 
            }
            break;
    case 5: //Setea tiempo de descarga
            lcd.setCursor(0, 0);      
            lcd.print("SETEO  T.DESCARG"); 
            lcd.setCursor(7, 1);      
            lcd.print(tiempo); 
            if (digitalRead(puls[2]) == 0) {
                tiempo--; 
            }
            if (digitalRead(puls[3]) == 0) {
                tiempo++; 
            }
            delay (250); // <===== OBSERVAR
            if (digitalRead(puls[1])== 0) {
                lcd.clear();  
                i++; 
            }  
            break;

  /////////////////////  E X T R A   /////////////////////
    case 6: //Guarda Parametros y prepara el Screent de la LCD
            EEPROM.write(1, cont_a);   // Cuidado con esto. 100mil escrituras
            EEPROM.write(2, cont_b);   // dañan la EEPROM
            EEPROM.write(3, cont_c);    
            EEPROM.write(4, tiempo);     
            lcd.setCursor(4, 0);      
            lcd.print("S A V E"); 
            lcd.setCursor(3, 1);      
            lcd.print("D A T O S");   //"P R O G R A M A"
            delay (1000);   // <===== OBSERVAR EL PEOR de todos
            i = 0;
            lcd.clear();
            lcd.setCursor(5, 0);   
            lcd.print("Peso :");
            lcd.setCursor(9, 1);   
            lcd.print("Kg");
            break;
    //////////////////  D E S C A R G A   //////////////////
    case 7: //Rutina de Descarga
            if (digitalRead(rele[4]) == 1) {  
               digitalWrite(rele[3],HIGH);
               delay (tiempo*100);
               digitalWrite(rele[3],LOW);
               i = 0;
               delay (tiempo*10);   // <===== OBSERVAR OJO!!!
               digitalWrite(rele[4],LOW);
            }
            break;
    }
}

Repito cada OBSERVAR implica un momento donde una pulsación no va a reaccionar hasta terminado dicho delay.
Debe reemplazarse por un retardo usando millis().

También existe una solución para tu código tal como esta pero no podrias consultar el peso

peso = (balanza.get_units(5));

podrias usar un flag, que actives para que dentro de cada while si esta en true dicho flag lea el valor de peso.
Igualmente no entiendo para que lo lees y refiero al peso dentro de la interrupción, si tu código no lo consulta hasta estar fuera de los while.

deberías replantear el código.

gracias amigos por la ayuda con respecto a los delay las pausas , básicamente es para el efecto rebote del pulsador, eso no me da el problema. y lo de la interrupción tienen razón al no haber definido las variables como volátiles me devolvía cualquier cosa. mi programa ya esta corriendo a dios gracias esta haciendo su proceso.
el problema radicaba en el porque se reseteaba mi arduinio nano y era basicamente al leer una entrada digital, exactamente del pin 2 . cambie de pines y listo ya no tengo ningun problema.

me gustaria saber el porque de ello.