hello, I coding a simple toll system, I need that when the limit switch (S1) is on, the system wait for 5 seconds and after that it executes the function (turning on a motor). The thing is that millis() starts counting at the same that the programs starts, so my problem is that I if start the program and let's say I wait for 10 seconds and then I press S1, the motor will turn on immediately and It will not wait 5 seconds because the "time has already passed". I need to reset it some way but I don't know how can I do it.
const int S1 = 4;
const int S2 = 3;
const int STOP = 5;
const int MARCHA = 6;
const int FC1 = 7;
const int FC2 = 8;
const int MOTOR_SUBIR = 11;
const int MOTOR_BAJAR = 12;
const int SEMAFORO_ROJO = 13;
const int SEMAFORO_VERDE = 2;
const int INDICADOR_LUMINOSO = 10;
const int INDICADOR_SONORO = 9;
int estadoStop = LOW;
const unsigned long interval = 5000;
long previousTime = 0;
void setup() {
pinMode(S1, INPUT);
pinMode(S2, INPUT);
pinMode(STOP, INPUT_PULLUP);
pinMode(MARCHA, INPUT_PULLUP);
pinMode(FC1, INPUT);
pinMode(FC2, INPUT);
pinMode(MOTOR_SUBIR, OUTPUT);
pinMode(MOTOR_BAJAR, OUTPUT);
pinMode(SEMAFORO_ROJO, OUTPUT);
pinMode(SEMAFORO_VERDE, OUTPUT);
pinMode(INDICADOR_LUMINOSO, OUTPUT);
pinMode(INDICADOR_SONORO, OUTPUT);
}
void loop() {
// Semaforo en Rojo cuando la barrera no está abierta
if(digitalRead(FC2) != HIGH) {
digitalWrite(SEMAFORO_ROJO, HIGH);
digitalWrite(SEMAFORO_VERDE, LOW);
} else {
digitalWrite(SEMAFORO_ROJO, LOW);
digitalWrite(SEMAFORO_VERDE, HIGH);
}
unsigned long currentTime = millis();
// Si hay un auto presente, se encienden luz, bocina y temporizador
if (digitalRead(S1) == HIGH && estadoStop == LOW) {
activarSalidas();
if (currentTime - previousTime >= interval) {
subirBarrera();
previousTime = currentTime;
}
}
// Verifica el botón de STOP
if (digitalRead(STOP) == HIGH && estadoStop == LOW) {
bajarBarrera();
detenerSalidas();
estadoStop = HIGH;
} else if (digitalRead(MARCHA) == HIGH && digitalRead(STOP) == LOW && estadoStop == HIGH || digitalRead(S2) == HIGH && digitalRead(STOP) == LOW && estadoStop == HIGH) {
estadoStop = LOW;
}
if (digitalRead(STOP) == HIGH) {
bajarBarrera();
}
// Sube la barrera si el botón MARCHA está presionado
if (digitalRead(MARCHA) == HIGH && digitalRead(STOP) == LOW) {
subirBarrera();
}
// Sensor de salida, Bajar la barrera al activarse
if (digitalRead(S2) == HIGH) {
bajarBarrera();
}
// Detener el motor al llegar el final de carrera
if (digitalRead(FC1) == HIGH){
digitalWrite(MOTOR_BAJAR, LOW);
}
if (digitalRead(FC2) == HIGH){
digitalWrite(MOTOR_SUBIR, LOW);
}
}
void activarSalidas() {
digitalWrite(INDICADOR_LUMINOSO, HIGH);
digitalWrite(INDICADOR_SONORO, HIGH);
}
void detenerSalidas() {
digitalWrite(INDICADOR_LUMINOSO, LOW);
digitalWrite(INDICADOR_SONORO, LOW);
}
void subirBarrera() {
if (digitalRead(FC2) == LOW) {
digitalWrite(MOTOR_BAJAR, LOW);
digitalWrite(MOTOR_SUBIR, HIGH);
} else if(digitalRead(FC2) == HIGH){
digitalWrite(MOTOR_BAJAR, LOW);
digitalWrite(MOTOR_SUBIR, LOW);
}
}
void bajarBarrera() {
if (digitalRead(FC1) == LOW) {
digitalWrite(MOTOR_SUBIR, LOW);
digitalWrite(MOTOR_BAJAR, HIGH);
} else if(digitalRead(FC1) == HIGH){
digitalWrite(MOTOR_BAJAR, LOW);
digitalWrite(MOTOR_SUBIR, LOW);
}
}


