Contador de tiempo se vuelve negativo

buenas a todos! siguiendo con las mejoras del código que llevo entre manos, testeando me doy cuenta que de forma aleatoria me arroja el tiempo acumulado en negativo...., volviendo negativo el tiempo acumulado total.

es un datalogger que lo que hace es enviar los datos a thingspeak cada 15 segundos. cada vez que cambia de estado un relé, volviendo a 0 concretamente, se lanza un guardado en eeprom y se lanzan los datos a thingspeak sin tener que esperar a esos 15 segundos. (sé lo de los ciclos de lectura de eeprom pero se estiman unos 2 o 3 cambios de estado al dia, estoy valorando lo de la opción de condensador y guardar datos en caso de corte de suministro, pero para pruebas de momento lo tengo así). esta montado sobre una mega mini pro y no sé porqué se me vuelve negativo, es aleatorio, y arrojando resultados distintos... os agradecería vuestra ayuda a ver si véis dónde me estoy equivocando...

éste es el resultado:

temps actual: 4261
temps acumulada: 32142
temps total en min.: 5.000000
num de pulsos: 50
¡Datos enviados a ThingSpeak!********
Temperatura1= 24.56 C
Temperatura2= 31.69 C
Pressio1= 0.66Bar
Pressio2= 2.39Bar
1.00
temps actual: 2156
temps acumulada: -31238 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NEGATIVO
temps total en min.: -5.000000
num de pulsos: 51
Temperatura1= 24.56 C
Temperatura2= 31.69 C
Pressio1= 0.66Bar
Pressio2= 1.80Bar

el código es éste:

#include <OneWire.h>              
#include <DallasTemperature.h>
#include <JC_Button.h> 
#include <EEPROM.h> //Librería para controlar la EEPROM de la Arduino
#include "ThingSpeak.h" // Include ThingSpeak Library
unsigned long myChannelNumber = xxxx6; // Thingspeak número de canal
const char * myWriteAPIKey = "xxxx"; // ThingSpeak write API Key
#include <Ethernet.h>
#include <SPI.h>
OneWire ourWire1(30);                //Se establece el pin 30  como bus OneWire
OneWire ourWire2(31);                //Se establece el pin 31 como bus OneWire
DallasTemperature sensors1(&ourWire1); //Se declara una variable u objeto para nuestro sensor1
DallasTemperature sensors2(&ourWire2); //Se declara una variable u objeto para nuestro sensor2

const unsigned long intervaloLecturaTemp = 15000; // leeremos cada 15 segundos
unsigned long tiempoAnterior = 0; // almacena la ultima vez que se lanzo nuestro evento

float temp1, temp2;
float pressure_bar, pressure_bar2;

float estatrele =0;

/* Set the static IP address to use if the DHCP fails to assign */
IPAddress ip(192,168,0,222);
IPAddress Dns (192,168,0,1);
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
long ID = xxxx;
char* Key = "xxxxx";
EthernetClient cliente;
int comptador = 0;

//definició pins digitals per comptar pulsacions
Button boton0(34);

int tiempo1, tiempo2, duracion_actual0, duracion_total0, duracion_acumulada0, numpulsos0;

float duracion_acumulada0h;

//definim eeprom
int eeAddress1 = 1;
int eeAddress5 = 100;
int option;


//************************************************************************************************************************************************************************************************************************
void setup() {

Ethernet.init();
Serial.begin(115200);
Ethernet.begin(mac,ip,Dns);

sensors1.begin();   //Se inicia el sensor 1
sensors2.begin();   //Se inicia el sensor 2

EEPROM.get( eeAddress1, duracion_acumulada0 );
EEPROM.get( eeAddress5, numpulsos0 );
     
    delay(1000);
    ThingSpeak.begin(cliente); // Inicia ThingSpeak
}

//************************************************************************************************************************************************************************************************************************
void envia_thingspoeak_ARA()
{
  
  // Carga los valores a enviar
ThingSpeak.setField(1, temp1);
ThingSpeak.setField(2, temp2);
ThingSpeak.setField(3, pressure_bar);
ThingSpeak.setField(4, pressure_bar2);
ThingSpeak.setField(5, estatrele);
ThingSpeak.setField(6, duracion_acumulada0h);
ThingSpeak.setField(7, numpulsos0);
// Escribe todos los campos a la vez.
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
Serial.println("¡Datos enviados a ThingSpeak!*************************************************************************");

}

//************************************************************************************************************************************************************************************************************************
void guardaEEPROM()
{
  //Serial.println("¡Datos enviados a ThingSpeak!");
      Serial.println("Sense energia");
      EEPROM.update( eeAddress1, duracion_acumulada0 );
      EEPROM.update( eeAddress5, numpulsos0 );
      Serial.println("dades guardades a ******************EEPROM*******************");
        }



void envia_thingspoeak_LAG()//*****************************************************************************************************************************************************************************************
{
  
  // Carga los valores a enviar
ThingSpeak.setField(1, temp1);
ThingSpeak.setField(2, temp2);
ThingSpeak.setField(3, pressure_bar);
ThingSpeak.setField(4, pressure_bar2);
ThingSpeak.setField(5, estatrele);
ThingSpeak.setField(6, duracion_acumulada0h);
ThingSpeak.setField(7, numpulsos0);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
Serial.println("¡Datos enviados a ThingSpeak! programats cada 15 segons********************************************");

}
//************************************************************************************************************************************************************************************************************************



void loop() {

  //fmap de presostats
     pressure_bar = (125.0 * (5.0 * analogRead(14) / 1023.0 - 0.495)) / 14.504;
   // float pressure_bar = (125.0 * (5.0 * analogRead(14) / 1023.0 - 0.531)) / 14.504;
    if (pressure_bar > 38) {
      (pressure_bar = 0);
    }
     pressure_bar2 = (125.0 * (5.0 * analogRead(15) / 1023.0 - 0.495)) / 14.504;
   // float pressure_bar = (125.0 * (5.0 * analogRead(14) / 1023.0 - 0.531)) / 14.504;
    if (pressure_bar2 > 38) {
      (pressure_bar2 = 0);
    }


//*************************************************agafar valors temperatura

 sensors1.requestTemperatures();   //Se envía el comando para leer la temperatura
temp1= sensors1.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 1

 
sensors2.requestTemperatures();   //Se envía el comando para leer la temperatura
temp2= sensors2.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 2



//********************************************COMPTADOR DE CLICS I TEMPS

  //codi per saber numero de pulsacions i temps transcorregut "pulsat"
  boton0.read(); // Actualizo el botón.
  if ( boton0.wasPressed() ) { // Si ha sido pulsado.
   tiempo1 = millis(); //Guardo el tiempo.
 estatrele = 1; //informo estat del rele

      ThingSpeak.setField(5, estatrele); //actualitzo variable per a thingspeak
    envia_thingspoeak_ARA(); //crido funció enviar a thinkspeak rapidament
  }
  if ( boton0.wasReleased() ) { // Si ha sido soltado.
    numpulsos0++;
estatrele = 0; //actualitzo variable a 0 del estat del rele
  
        tiempo2 = millis(); // cojo el tiempo
        duracion_actual0 = tiempo2-tiempo1; // y calculo la duración.
         tiempo1=0;
      ThingSpeak.setField(5, estatrele);
      envia_thingspoeak_ARA();
         
duracion_acumulada0 = duracion_actual0 + duracion_acumulada0;
 guardaEEPROM();//****************************quan es deixa el contactor, es graba memoria ****************************************************************
         }

//**********************************************************imprimir i enviar dades

Serial.print("Temperatura1= ");
Serial.print(temp1);
Serial.println(" C");
Serial.print("Temperatura2= ");
Serial.print(temp2);
Serial.println(" C");
Serial.print("Pressio1= ");
     Serial.print(pressure_bar); Serial.println("Bar");
     Serial.print("Pressio2= ");
     Serial.print(pressure_bar2); Serial.println("Bar");
     Serial.println(estatrele);
      Serial.print("temps actual: ");
       Serial.println(duracion_actual0);
       Serial.print("temps acumulada: ");
       Serial.println(duracion_acumulada0);
       Serial.print("temps total en min.: ");
       float duracion_acumulada0h = (duracion_acumulada0/6000);
       Serial.println(duracion_acumulada0h,6);
       Serial.print("num de pulsos: ");
       Serial.println(numpulsos0);



     


            //preparació sistema per guardar dades a la eeprom abans que marxi la llum i pulsador per fer reset a la eeprom
  if (Serial.available()>0){
    //leemos la opcion enviada
    option=Serial.read();
    if(option=='s') {
   
   //res
     
    

      
    }
    if(option=='r') {
     
      Serial.println("resetejar memoria");
        for (int i = 0 ; i < EEPROM.length() ; i++) {
    EEPROM.write(i, 0);

    
  }
    delay(5000);
    Serial.println("memoria borrada");
    }
  }



/* En cada iteracion de loop, guardamos en que momento de la linea temporal estamos con millis */
  unsigned long tiempoActual = millis();
 
  /* Comprobamos si debemos lanzar el evento */
  if (tiempoActual - tiempoAnterior >= intervaloLecturaTemp) {
 
    //Han pasado los 10 segundos => 

  
    envia_thingspoeak_ARA();
    
    /* Se actualiza el temporizador para los siguientes 10 segundos */
    tiempoAnterior = tiempoActual;
  }


}

Si estas trabajando con millis deberias usar variables del tipo unsigned long en tu código, que en tu código estan definidas como int y hacen cosas raras cuando restas.

int tiempo1, tiempo2, duracion_actual0, duracion_total0, duracion_acumulada0, numpulsos0;