Problema Em Acionar Saidas Temporizadas

Estou tentando fazer um projeto com Arduino mega e dois sensores reflexivo infravermelho E18-d80nk para Acionar, 8 Saídas Digitais que estão ligadas a um modulo relé com 8 reles, o seguinte projeto gostaria que as saídas fossem acionadas temporizadas uma seguida da outra e depois fossem desligadas da mesma maneira temporizadas, tentei usar a função delay mais não está funcionando direito,quando passo perto de um dos sensores ele demora para começar a acionar as saídas.Depois tentei procurar na internet outras alternativas encontrei um biblioteca que segundo o autor era parecida com um temporizador TON muito utilizado na logica ladder que é um temporizador de retardo na energização não deu certo também se alguém puder me ajudar agradeço.

Essa código foi feito com a função delay.

int rele_1=30;
int rele_2=23;
int rele_3=24;
int rele_4=25;
int rele_5=26;
int rele_6=27;
int rele_7=28;
int rele_8=31;
int pino_sensor=2;
int pino_sensor2=3;
unsigned long time;
void setup() {

pinMode (rele_1,OUTPUT);
pinMode (rele_2,OUTPUT);
pinMode (rele_3,OUTPUT);
pinMode (rele_4,OUTPUT);
pinMode (rele_5,OUTPUT);
pinMode (rele_6,OUTPUT);
pinMode (rele_7,OUTPUT);
pinMode (rele_8,OUTPUT);
pinMode(pino_sensor,INPUT);
pinMode(pino_sensor2,INPUT);
  

}

void loop() {
   
if (digitalRead(pino_sensor) == HIGH )
{
  digitalWrite(rele_8,HIGH);
  delay(280); 
  digitalWrite(rele_7,HIGH);
  delay(280);
  digitalWrite(rele_6,HIGH);
  delay(280);
  digitalWrite(rele_5,HIGH);
  delay(280);
  digitalWrite(rele_4,HIGH);
  delay(280);
  digitalWrite(rele_3,HIGH);
  delay(280);
  digitalWrite(rele_2,HIGH);
  delay(280); 
  digitalWrite(rele_1,HIGH);
  delay(280);  
   
if(digitalRead(pino_sensor) == LOW)
{
  
  digitalWrite(rele_1,LOW);
  digitalWrite(rele_2,LOW); 
  digitalWrite(rele_3,LOW);
  digitalWrite(rele_4,LOW); 
  digitalWrite(rele_5,LOW);
  digitalWrite(rele_6,LOW); 
  digitalWrite(rele_7,LOW);
  digitalWrite(rele_8,LOW); 
       }
 }

  if (digitalRead(pino_sensor2) == HIGH )
{
  digitalWrite(rele_1,HIGH);
  delay(280); 
  digitalWrite(rele_2,HIGH);
  delay(280);
  digitalWrite(rele_3,HIGH);
  delay(280);
  digitalWrite(rele_4,HIGH);
  delay(280);
  digitalWrite(rele_5,HIGH);
  delay(280);
  digitalWrite(rele_6,HIGH);
  delay(280);
  digitalWrite(rele_7,HIGH);
  delay(280); 
  digitalWrite(rele_8,HIGH);
  delay(280);  
   
if(digitalRead(pino_sensor2) == LOW)
{
  
  digitalWrite(rele_1,LOW);
  digitalWrite(rele_2,LOW); 
  digitalWrite(rele_3,LOW);
  digitalWrite(rele_4,LOW); 
  digitalWrite(rele_5,LOW);
  digitalWrite(rele_6,LOW); 
  digitalWrite(rele_7,LOW);
  digitalWrite(rele_8,LOW); 
       }
 }
}

Esse é o outro codigo utilizando a biblioteca que encontrei na internet. Link da Biblioteca Temporizador

int sensorPin = 31;   
int rele1 =  30;
int rele2 =  23;
int rele3 =  24;
int rele4 =  25;
int rele5 =  26;    
unsigned long tempo = 0; // variável para receber valores do millis()
unsigned long temp1 = 0;
unsigned long temp2 = 0;
unsigned long temp3 = 0;
unsigned long temp4 = 0;
int temporizador = 0;// variável para indicar quando o temporizador está operando
int tempor1 = 0;
int tempor2 = 0;
int tempor3 = 0;
int tempor4 = 0;
int sensorState = 0;

void setup() {
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);    
  pinMode(rele3, OUTPUT);
  pinMode(rele4, OUTPUT);
  pinMode(rele5, OUTPUT);
  pinMode(sensorPin, INPUT);   
}

void loop(){

sensorState = digitalRead(sensorPin); // lê o estado do botão

if (sensorState == HIGH && temporizador == 0) {  // se botão acionado
           temporizador = 1; // inicia o temporizador
           tempo = millis(); // passa à variável o valor de millis()
}  

if (sensorState == HIGH && tempor1 == 0) {  // se botão acionado
           tempor1 = 1; // inicia o temporizador
           temp1 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor2 == 0) {  // se botão acionado
           tempor2 = 1; // inicia o temporizador
           temp2 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor3 == 0) {  // se botão acionado
           tempor3 = 1; // inicia o temporizador
           temp3 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor4 == 0) {  // se botão acionado
           tempor4 = 1; // inicia o temporizador
           temp4 = millis(); // passa à variável o valor de millis()
}

if (millis() - tempo >= 1000 && temporizador == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele1, HIGH); // aciona o LED
}

 if (millis() - temp1 >= 1200 && tempor1 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele2, HIGH); // aciona o LED
}

if (millis() - temp2 >= 1400 && tempor2 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele3, HIGH); // aciona o LED
}

if (millis() - temp3 >= 1600 && tempor3 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele4, HIGH); // aciona o LED
}

if (millis() - temp4 >= 1800 && tempor4 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele5, HIGH); // aciona o LED
}

if (millis() - tempo >= 2000 && temporizador == 1){ // após 2 seg. e temporizador 
                                                                                 //desligado

     digitalWrite(rele1, LOW); // apaga o LED 
     temporizador = 0; // desliga o temporizador
}

 if (millis() - temp1 >= 2200 && tempor1 == 1){ // após 2 seg. e temporizador 
                                                                                 //desligado

     digitalWrite(rele2, LOW); // apaga o LED 
     tempor1 = 0; // desliga o temporizador
}
if (millis() - temp2 >= 2400 && tempor2 == 1){ // após 2 seg. e temporizador 
                                                                                 //desligado

     digitalWrite(rele3, LOW); // apaga o LED 
     tempor2 = 0; // desliga o temporizador
}
if (millis() - temp3 >= 2600 && tempor3 == 1){ // após 2 seg. e temporizador 
                                                                                 //desligado

     digitalWrite(rele4, LOW); // apaga o LED 
     tempor3 = 0; // desliga o temporizador
}

if (millis() - temp4 >= 2800 && tempor4 == 1){ // após 2 seg. e temporizador 
                                                                                 //desligado

     digitalWrite(rele5, LOW); // apaga o LED 
     tempor4 = 0; // desliga o temporizador
}

}

O segundo código parece fazer o que pretendes... porque é que não está a funcionar?

Quando eu ligo o Arduino, na USB, ele fica acionando sozinho sem eu ao menos encostar no sensor.

Como ligaste o sensor? Que sensor é?

Esse é o esquemático da ligação dos dois sensores Reflexivo Infravermelho E18-d80nk.

Interessante... o teu código apenas usa um sensor.

Experimenta isto no teu código:

pinMode(sensorPin, INPUT_PULLUP);

Adicionar o Pull Up pode resolver o que estás a ver... é estranho porque o sensor deveria manter o estado da saída sem pull up, mas experimenta.

Outra possibilidade se tiveres um multimetro será ver como é que o sensor reage com o ambiente à volta dele. Pode ser que o sensor realmente esteja a activar devido à luminosidade ou movimento. Sensores industriais deste tipo tem um ajuste para ser possível ajustar a sensibilidade, mas este suponho que não tenha isso. Dá uma vista de olhos.

Eu Inclui o pinMode (sensorPin,INPUT_PULLUP) , e mudei a entrada digital do sensor , uma coisa que reparei foi que quando aproximo a mão ou algum objeto do sensor as saídas, digitais ficam acionando e desacionando até eu colocar a mão ou outro objeto próximo do sensor, ai essas saídas ficam acionadas e não desacionam,será que tem algum erro no código.?

#include <Crescer.h>
int sensorPin = 3;   
int rele1 =  30;
int rele2 =  23;
int rele3 =  24;
int rele4 =  25;
int rele5 =  26;    
unsigned long tempo = 0; // variável para receber valores do millis()
unsigned long temp1 = 0;
unsigned long temp2 = 0;
unsigned long temp3 = 0;
unsigned long temp4 = 0;
int temporizador = 0;// variável para indicar quando o temporizador está operando
int tempor1 = 0;
int tempor2 = 0;
int tempor3 = 0;
int tempor4 = 0;
int sensorState = 0;

void setup() {
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);    
  pinMode(rele3, OUTPUT);
  pinMode(rele4, OUTPUT);
  pinMode(rele5, OUTPUT);
  pinMode(sensorPin,INPUT_PULLUP);   
}

void loop(){

sensorState = digitalRead(sensorPin); // lê o estado do botão

if (sensorState == HIGH && temporizador == 0) {  // se botão acionado
           temporizador = 1; // inicia o temporizador
           tempo = millis(); // passa à variável o valor de millis()
}  

if (sensorState == HIGH && tempor1 == 0) {  // se botão acionado
           tempor1 = 1; // inicia o temporizador
           temp1 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor2 == 0) {  // se botão acionado
           tempor2 = 1; // inicia o temporizador
           temp2 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor3 == 0) {  // se botão acionado
           tempor3 = 1; // inicia o temporizador
           temp3 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor4 == 0) {  // se botão acionado
           tempor4 = 1; // inicia o temporizador
           temp4 = millis(); // passa à variável o valor de millis()
}

if (millis() - tempo >= 1000 && temporizador == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele1, HIGH); // aciona o LED
}

 if (millis() - temp1 >= 1200 && tempor1 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele2, HIGH); // aciona o LED
}

if (millis() - temp2 >= 1400 && tempor2 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele3, HIGH); // aciona o LED
}

if (millis() - temp3 >= 1600 && tempor3 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele4, HIGH); // aciona o LED
}

if (millis() - temp4 >= 1800 && tempor4 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele5, HIGH); // aciona o LED
}

if (millis() - tempo >= 2000 && temporizador == 1){ // após 2 seg. e temporizador 
                                                                                 //desligado

     digitalWrite(rele1, LOW); // apaga o LED 
     temporizador = 0; // desliga o temporizador
}

 if (millis() - temp1 >= 2200 && tempor1 == 1){ // após 2 seg. e temporizador 
                                                                                 //desligado

     digitalWrite(rele2, LOW); // apaga o LED 
     tempor1 = 0; // desliga o temporizador
}
if (millis() - temp2 >= 2400 && tempor2 == 1){ // após 2 seg. e temporizador 
                                                                                 //desligado

     digitalWrite(rele3, LOW); // apaga o LED 
     tempor2 = 0; // desliga o temporizador
}
if (millis() - temp3 >= 2600 && tempor3 == 1){ // após 2 seg. e temporizador 
                                                                                 //desligado

     digitalWrite(rele4, LOW); // apaga o LED 
     tempor3 = 0; // desliga o temporizador
}

if (millis() - temp4 >= 2800 && tempor4 == 1){ // após 2 seg. e temporizador 
                                                                                 //desligado

     digitalWrite(rele5, LOW); // apaga o LED 
     tempor4 = 0; // desliga o temporizador
}

}

Ola,
Se ao aproximar a mão ou outro objeto os sensores ficam "louco", pode ser problema de falta do comum (terra, gnd, ground). Verifique se essa conexão esta bem feita.
Também e recomendado a colocação de um capacitor de 100nF bem próximo ao pinos de alimentação do sensor. Caso seja uma placa/modulo e de se esperar que esse capacitor já esteja presente.

Já coloquei o capacitor da maneira que me falou e fiz uma programação sem os temporizadores, não ficou maluco o sensor acho que o problema está na programação mesmo

Como não consegui fazer a programação na IDE do Arduino, eu agora fiz uma no ldmicro, por que estou mais, familiarizado com a linguagem ladder, inclusive já testei ela no proteus, e está tudo correto, mais tem um porém não estou conseguindo fazer o upload usando o avrdudess, está aparecendo a mensagem avrdude.exe: stk500v2_ReceiveMessage(): timeout, o que será que está acontencendo, alguém pode me ajudar por favor.

Eu tentei novamente na IDE do Arduino, consegui que as digitais fossem acionadas e desacionadas em um determinado tempo porém o programa só funciona uma vez, gostaria de saber o que tem de errado?, coloquei o link do codigo para download por que o codigo ficou muito grande e não deu pra colocar ele no forum, outra coisa que percebi é que quando eu reseto o arduino o programa volta a funcionar, gostaria de saber se tema alguma maneira de resetar o arduino pela programação?

Codigo para Download