Ajuda com timer

Bom dia pessoal, estou trabalhando neste código aqui, que foi o luisilva , aqui do site arduino.cc que me ajudou em grande parte, do código em questão, mais estou precisando de mais uma ajuda.
O problema aqui, e que eu, fiz duas parte deste código, uma para acionar um relé, chamado RELE_TAMPA, que só vai poder ser acionado quando a contagem, já estiver encerrada, e a outra parte que apresenta problema, que e a do botão de emergência que seria um botão normalmente fechado que se fosse diferente de zero, zerava o código, e se coso, fosse acionando o botão de acionamento do relé o código ,voltaria a contar tudo novamente do zero.

Esse código, funciona da seguinte maneira se o BOTAO for acionado, liga o rele, e inicia a contagem, já determinada MY_SETPOINT_IN_MINUTES, se caso for interronpido a energia do arduino e depois ele voltar a ser ligado, o código grava na eeprom o momento da interrupção, e quando o arduino e religado a energia ele recomeça a contagem do momento, em que havia parado.

A emergência , seria para se caso fosse necessário interromper a contagem era só aperta o botão de emergência, ele passaria a ser diferente de zero e a contagem iria para zero outra vez.

A outra parte, BOTAO_TAMPA e só para ligar um outro relé, que só pode ser acionando quando a contagem, já estiver acabado.

O meu problema, nesse código e que depois que adicionei essa emergência a contagem não e feita completamente, hora o tempo e contado corretamente, hora não, e o tempo e interrompido.

Se alguém puder me ajudar com esse problema agradeço desde já.

Att.

Átila Fonseca Silva

segue o código.

#include <EEPROM.h>                                                            
                                                       
#define DEBUG1
#define  MILISECONDS_IN_MINUTE  60000UL                                  
#define MY_SETPOINT_IN_MINUTES 1                                         
#define CLOCK_TIMER (MILISECONDS_IN_MINUTE * MY_SETPOINT_IN_MINUTES)       . 
#define EEPROM_LENGTH 1024                                                
#define EEPROM_ADDR 0x00                                                
byte RELE_TAMPA =12;                                                      
byte PORTA_TAMPA = 9;                                                    
byte BOTAO_TAMPA = 0;                                                     
byte emergencia = 11;                                                    
byte EMERGENCIA = 0;                                                     
byte rele = 8;                                                            
byte BOTAO = 0;                                                           
byte MOTOR = 0;                                                           
byte PORTA_B = 10;                                                        

unsigned long motorStartedAt = 0;                                         

boolean motorON = false;                                                  

byte lastState;                                                         

unsigned long motorTime;                                                  

int motorTimeWrite;                                                    
int eepromAddr;                                                           
 
void setup()
{
  Serial.begin(9600);                                                                  
  pinMode(PORTA_TAMPA,INPUT);                                             
  digitalWrite(PORTA_TAMPA,HIGH);                                         
  pinMode(RELE_TAMPA,OUTPUT);                                             
  digitalWrite(RELE_TAMPA,LOW);                                          
  pinMode(emergencia,INPUT);                                              
  digitalWrite(emergencia,HIGH);                                          
  pinMode(PORTA_B, INPUT);                                                
  digitalWrite(PORTA_B,HIGH);                                             
  pinMode(rele, OUTPUT);                                                  
  digitalWrite(rele,LOW);                                                 
 
 
  eepromAddr = EEPROM.read(EEPROM_ADDR) << 8;                            
  eepromAddr =  EEPROM.read(EEPROM_ADDR+1);                              
  lastState = EEPROM.read(EEPROM_ADDR);                                   
  #ifdef DEBUG1                
  Serial.print("Last state: ");
  Serial.println(lastState);
  #endif                         
 
  if (lastState == 1)                                                     
  {                                                                       
     motorTime = EEPROM.read(EEPROM_ADDR+1) << 8;                         
     motorTime = EEPROM.read(EEPROM_ADDR+2);                             
     motorTime *= 1000UL;                                                
     #ifdef DEBUG1                              
     Serial.print("Motor Time: ");
     Serial.println(motorTime);
     #endif                                     
  }
 
}
 
void loop()
{
  BOTAO_TAMPA = digitalRead(PORTA_TAMPA);                              
  EMERGENCIA = digitalRead(emergencia);                                 
  BOTAO = digitalRead(PORTA_B);                                         

  if ((BOTAO == LOW || lastState == 1) && !motorON && EMERGENCIA == LOW)
  {                                                                    
    digitalWrite(rele,HIGH);                                          
    motorStartedAt = millis();                                          
    motorON = true;                                                     
   
    if (lastState != 1)                                                 
    {                                                                   
       motorTime = CLOCK_TIMER;                                         
       lastState = 1;                                                  
       EEPROM.write(EEPROM_ADDR, lastState);                            
       #ifdef DEBUG                                                     
       Serial.print("Last state: ");
       Serial.println(lastState);       
       #endif                                                          
    }
    else                                                                
    {
       motorTime = EEPROM.read(EEPROM_ADDR+1) << 8;                     
       motorTime = EEPROM.read(EEPROM_ADDR+2);                           
       motorTime *= 1000UL;                                           
    }
  }

  if(motorON == true && (millis() - motorStartedAt )>= motorTime)       
  {                                                                    
    digitalWrite(rele,LOW);                                             
    motorON = false;                                                   
   
    lastState = 0;                                                      
    EEPROM.write(EEPROM_ADDR, lastState);                               
                                                                          
    #ifdef DEBUG1
    Serial.print("Last state: ");
    Serial.println(lastState);       
    #endif                                                              
  }
 
  if(motorON == true && (millis() - motorStartedAt) % 1000 == 0)        
  {                                                                    
     motorTimeWrite = (motorTime - (millis() - motorStartedAt)) / 1000; 
                                       
     #ifdef DEBUG
     Serial.print("Motor Time Write: ");
     Serial.println(motorTimeWrite);
     
     Serial.println(motorTimeWrite>>8 & 0x00FF);
     Serial.println(motorTimeWrite & 0x00FF);
     #endif                                 
     
     EEPROM.write(EEPROM_ADDR+1, motorTimeWrite>>8 & 0x00FF);        
     EEPROM.write(EEPROM_ADDR+2, motorTimeWrite & 0x00FF);           

  }
     if(EMERGENCIA != 0)                                             
     {                                                                
     digitalWrite(rele,LOW);                                          
     motorON = false;                                                
    lastState = false;                                                
}

if(BOTAO_TAMPA == 0 && lastState == 0 )                               
{                                                                     
 digitalWrite(RELE_TAMPA,HIGH); 
} 
if( BOTAO_TAMPA != 0 )                                                
{                                                                     
  digitalWrite(RELE_TAMPA,LOW);                                       
}
}

no void loop() cria uma variável para guardar o valor do tempo em vez de usares a função millis directamente no if.

void loop(){
unsigned long currentMillis = millis();

//(...)

if(motorON == true && (currentMillis - motorStartedAt )>= motorTime)       
{ 
//(...)
}

//(...)

}//fim de loop()

Assim o programa vai comparar sempre o mesmo valor de tempo em vez de comparar 2 valores diferentes nos dois if que tens.

Pode ser que resolva o problema.

if(motorON == true && (millis() - motorStartedAt) % 1000 == 0)
{
motorTimeWrite = (motorTime - (millis() - motorStartedAt)) / 1000;

#ifdef DEBUG
Serial.print("Motor Time Write: ");
Serial.println(motorTimeWrite);

Serial.println(motorTimeWrite>>8 & 0x00FF);
Serial.println(motorTimeWrite & 0x00FF);
#endif

EEPROM.write(EEPROM_ADDR+1, motorTimeWrite>>8 & 0x00FF);
EEPROM.write(EEPROM_ADDR+2, motorTimeWrite & 0x00FF);

}

O que pretendes que aconteça aqui em especial atenção á parte (millis() - motorStartedAt) % 1000 == 0 ?
Este acontecimento será algo difícil de apanhares ...