De nada sirve
if(millis()-t>=3000){
digitalWrite(Rele, LOW);
}
con los delay() que tienes cuando presionas el pulsador
Esto código tiene una máquina de estados. No esta probado de modo que si tiene errres o falta definir alguna variable verifícalo y haz las correcciones necesarias.
#include <VarSpeedServo.h>
VarSpeedServo Myservo;
unsigned long t;
byte Pulsador = 2;
byte Rele = 4;
int pos = 0;
bool accion = false;
int estado;
enum _modos = {NOSEMUEVE, CINCOSEG, CIERRO_RELE};
_modos modo = NOSEMUEVE;
void setup() {
pinMode(Pulsador, INPUT_PULLUP);
pinMode(Rele, OUTPUT);
Myservo.attach(3);
Myservo.write(98, 100, true);
}
void loop() {
estado = digitalRead(Pulsador);
if (estado == LOW) {
accion = true;
}
if (accion)
switch(modo) {
case NOSEMUEVE: digitalWrite(Rele, HIGH);
t = millis();
modo = CINCOSEG;
break;
case CINCOSEG : if (millis() - t > 5000UL) {
Myservo.write(0, 255, true);
t = millis();
modo = CIERRO_RELE;
}
break;
case CIERRO_RELE: if (millis() - t > 15000UL) {
digitalWrite(Rele, LOW);
modo = NOSEMUEVE;
accion = false;
}
break;
}
}