Duda con millis()

estimados todos, espero esta consulta no sea ultra repetida, probablemente si, pero no como la quiero plantear,

pasa que estoy haciendo un código, que, cuando x pin cambie su estado, haga automáticamente una función, bueno, lo que hice, lo hace la primera vez que yo subo el código al arduino, pero ya a la segunda vez on me funciona pq millis sigue subiendo, y por ende después de la segunda vez ya está mas allá del valor inicial, y no encuentro como soluconarlo, les dejo lo que hace, a ver si me ayudan

currentMillis lo estoy tomando en el loop

currentMillis = millis();

// Pines de entrada
const int botonAbrirPin = 6;
const int botonCerrarPin = 7;
const int pinPuerta = 8;
const int ledPin =  10;

// Pines de salida
const int ledAbrirPin = 11;
const int ledCerrarPin = 12;

// Variables
bool buttonAbrirPulsado  = false;
bool buttonCerrarPulsado = false;
bool estadoSeguro;
unsigned long previousMillis = 0;
unsigned long currentMillis, 
              tiempo;
long interval = 13000;
int ledState = LOW;
String msje, msje2, msje3;
bool mensajeEnviado = false;
bool mensajeEnviado2 = false;
bool mensajeEnviado3 = false;

void setup() {
  // Configuramos los pines de entrada
  pinMode(botonAbrirPin, INPUT_PULLUP);
  pinMode(botonCerrarPin, INPUT_PULLUP);
  pinMode(pinPuerta, INPUT_PULLUP);

  // Configuramos los pines de salida
  pinMode(ledAbrirPin, OUTPUT);
  digitalWrite(ledAbrirPin, LOW);
  pinMode(ledCerrarPin, OUTPUT);
  digitalWrite(ledCerrarPin, LOW);
  
  Serial.begin(9600);
}


void loop() {

  currentMillis = millis();
  
  if (digitalRead(botonAbrirPin) == LOW) {
    if ( estadoSeguro == true ){
      msje = "seguro estaba abierto";
      sndmesaje();
      mensajeEnviado = true;
    }else{
      abrir();
      estadoSeguro = true;
    }
  }
    
  if (digitalRead(botonCerrarPin) == LOW) {
    if ( estadoSeguro == false ){
      msje = "seguro estaba cerrado";
      sndmesaje();
      mensajeEnviado = false;
    }else{
      cerrar();
      estadoSeguro = false;
    }  
  }  

  if (estadoSeguro == true){
    if (digitalRead(pinPuerta) == LOW){
      msje = "puerta abierta";
      sndmesaje();
      mensajeEnviado = false;
    }else{
      msje = "puerta cerrada";
      sndmesaje();
      mensajeEnviado = false;
      cerrarxtiempo();
    }
  }
}


}

void cerrar(){
  msje = "seguro cerrado";
  sndmesaje();
  mensajeEnviado = false;
  digitalWrite(ledCerrarPin, HIGH);
  delay(500);
  digitalWrite(ledCerrarPin, LOW);
  estadoSeguro = true;
}

void cerrarxtiempo(){
  //millis();
  if ( currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    cerrar();
    estadoSeguro = false;
  }
}


entonces lo que quiero es que cada vez que lo vaya a usar comience desde 0, o alguna función que lo haga, saludos y feliz navidad desde chile!

Postea el código completo. Por ejemplo, no sabemos de dónde toma su valor currentMillis

listo!, gracias por el tiempo, saludos!

Como está declarada la variable currentMillis?

Sin ver el código completo vamos a irnos muuy despacio..

hecho, XD

interval también debe ser unsigned long

Intenta con

Yo cambiaría el nombre de la variable a algo como “iniciaCierrexTiempo” o algo así.

Y por favor, no edites el código que ya has publicado porque forma los comentarios que estamos haciendo pierden validez, y este tema será leído posteriormente por otros usuarios.

Publica cada cambio que hagas en un nuevo post.

Y esto no va

EDIT: con esto evitas que la variable siga “avanzando” con el tiempo

lo tenía puesto así, pero en la segunda vez que se hace, se pasa el tiempo de millis() ya no está en 0 para contar hasta 13, sino que va en un valor mucho más elevado, maldición!, gracias igual estimado!

Hace falta agregar una bandera que indique que el cierre por tiempo está en curso y evite que se reinicie el contador (previousMillis). Esta bandera se bajaría cuando se ejecuta “abrir()”

Hola elmiranda

No entiendo cual es tu intención final con este código.
He encontrado varias instrucciones y variables que no se que fin tienen.

bool mensajeEnviado2 = false; (no utilizado)
bool mensajeEnviado3 = false; (no utilizado)
msje2, msje3; (no se utilizan ???)
sndmesaje(); (funcion sin contenido ???)
 tiempo; ???
const int ledAbrirPin = 11;   ???
const int ledCerrarPin = 12;  ???
abrir(); (funcion ????)

A parte de las correcciones de mancera y MaximoEsfuerzo
Seria bueno que replantearas el código, y nos expliques que deseas conseguir con el.

Un saludo !!!

Es un código parcial (por eso hice solo ese comentario escueto).

Has leído solo media línea

unsigned long currentMillis, tiempo;

:wink:

Hola @MaximoEsfuerzo :

Lo que he comentado a: @elmiranda es que esa variable (tiempo) , no se utiliza, así como otras. ???
Un saludo !!! :cocktail:

bueno, son variables que usaré para otras cosas, olvidé sacarlas, pq no eran relevantes para mi consulta, gracias de todas maneras muchach@s

El problema no son las variables, las funciones que no están si.

Para ayudarte primero tenemos que "limpiar" el código para poder compilarlo, y no es el caso.
Siempre sube códigos que podamos compilar, o sea, aunque no sea funcional al menos que compile.

Moderador:

Cuando alguien te pida algo, usa un nuevo post, de lo contrario el comentario de quien te observa algo queda desconectado con lo que luego se lee.