Programa alarma en caja registradora

Hola buen dia soy nuevo en arduino y quiero explicarles mi problema:

Tengo un arduino UNO con el cual quiero hacer una alarma cuando el cajon de una caja registradora se abra despues de x segundos y se apague al cerrar. Voy a usar uninterruptor magnetico tipo alarma de ventana o puerta.

Con el codigo que llevo hecho no espera el mismo tiempo cada vez que se abre el cajon. Lo adjunto

Por su ayuda gracias

const int pinSensor = 2;
const int BUZZER = 12;
long previousMillis = 0;

long intervalOn = 4000;


void setup() {

  pinMode(pinSensor, INPUT_PULLUP);
  pinMode(BUZZER, OUTPUT);
}

void loop() {
  int value = digitalRead(pinSensor);

  if (value == HIGH) {
    digitalWrite(BUZZER, HIGH);
    
  } else {
    digitalWrite(BUZZER, LOW);
  }

  delay(4000);
}

A ver asi

const byte pinSensor = 2;
const byte BUZZER = 12;

unsigned long intervalOn = 4000;
unsigned long start = 0;
bool value, valueAnt = false;
 
void setup() {
 
  pinMode(pinSensor, INPUT_PULLUP);
  pinMode(BUZZER, OUTPUT);
}
 
void loop() {
  
  value = digitalRead(pinSensor);
 
  if (value && valueAnt) {
     ActivoBuzzer = true;
     unsigned long start = millis();
  }
  else 
     ActivoBuzzer = false;
  valueAnt = value;
  if (ActivoBuzzer && millis() - start < intervalOn) // si se abre el cajon
  	  digitalWrite(BUZZER, HIGH);					 // se escuchará el buzzer x 4 seg	
  else 
  	  digitalWrite(BUZZER, LOW);
  
}

Gracias por tu pronta respuesta voy a probar tu programa y te pido una disculpa el codigo que yo puse no era el correcto.

Agrego el correcto y checo tu programa

const int pinSensor = 2;
const int BUZZER = 12;
long previousMillis = 0;


long intervalOn = 8000;


void setup() {

  pinMode(pinSensor, INPUT_PULLUP);
  pinMode(BUZZER, OUTPUT);
}

void loop() {

  unsigned long currentMillis = millis();
  int value = digitalRead(pinSensor);

  if (value == HIGH) {
   
    if(currentMillis - previousMillis > intervalOn){
         previousMillis = currentMillis;
         digitalWrite(BUZZER, HIGH);
    }
  }  else 
      digitalWrite(BUZZER, LOW);
    
  
  }

Me salio este error:

Arduino: 1.8.5 (Windows 10), Board: "Arduino/Genuino Uno"

C:\foroCaja.ino: In function 'void loop()':

foroCaja:19: error: 'ActivoBuzzer' was not declared in this scope

      ActivoBuzzer = true;

      ^

foroCaja:23: error: 'ActivoBuzzer' was not declared in this scope

      ActivoBuzzer = false;

      ^

foroCaja:25: error: 'ActivoBuzzer' was not declared in this scope

   if (ActivoBuzzer && millis() - start < intervalOn) // si se abre el cajon

       ^

exit status 1
'ActivoBuzzer' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Agregalo.!! vamos que no merece ser consultado.

bool ActivoBuzzer = false;

Gracias una disculpa soy noob

por otro lado no se escucha ningun sonido

gracias de antemano

surbyte: Agregalo.!! vamos que no merece ser consultado.

bool ActivoBuzzer = false;

Corrige esto que se me escapó

void loop() {
  
  value = digitalRead(pinSensor);

  if (value && !valueAnt) {
     ActivoBuzzer = true;
     digitalWrite(BUZZER, HIGH);
     unsigned long start = millis();
  }
  if (!value && valueAnt) {
     ActivoBuzzer = false;
  }
  valueAnt = value;
  if (ActivoBuzzer) 
      if (millis() - start > intervalOn) {   // si se abre el cajon
      digitalWrite(BUZZER, LOW);         // se escuchará el buzzer x 4 seg
      ActivoBuzzer = false;
    }  
}

Si abres la caja, y permanece abierta sonará x 4 segundos. Si abres y cierras antes de los 4 segundos se apagará el sonido.

al cargarle el programa y abrir la caja sono por 4 segundos, se cerro la caja no volvio a sonar la siguiente vez que se abrio.

Quiza no me di a entender en el primer post(en el cual puse un codigo equivocado, despues agregue el correcto en mi siguiente mensaje) . Lo que quiero hacer es que al abrir la caja pueda la persona cobrar sin que suene (se activara la alarma a los 8 segundos despues) y despues el sonido seguira indefinidamente hasta que se cierre

Con el codigo que postie en mi segundo mensaje la alarma la primera vez si suena a los 8 segundos, pero no se resetea el contador, en las siguientes veces que abres la caja es aleatorio el tiempo hasta que se dispara la alarma

gracias

para facilitar las cosas agrego de nuevo mi codigo:

const int pinSensor = 2;
const int BUZZER = 12;
long previousMillis = 0;
long intervalOn = 8000;


void setup() {

  pinMode(pinSensor, INPUT_PULLUP);
  pinMode(BUZZER, OUTPUT);
}

void loop() {

  unsigned long currentMillis = millis();
  int value = digitalRead(pinSensor);

  if (value == HIGH) {
   
    if(currentMillis - previousMillis > intervalOn){
         previousMillis = currentMillis;
         digitalWrite(BUZZER, HIGH);
    }
  }  else 
      digitalWrite(BUZZER, LOW);
    }

Bueno mi error.. no entendí la consigna.

const byte pinSensor    = 2;
const byte BUZZER       = 12;

unsigned long intervalOn = 8000;
unsigned long start      = 0;
bool value, valueAnt     = false;
bool ActivoBuzzer        = false;
bool cajaAbierta         = false;

void setup() {

  pinMode(pinSensor, INPUT_PULLUP);
  pinMode(BUZZER, OUTPUT);
}

void loop() {
  
    value = digitalRead(pinSensor);

    if (value && !valueAnt) {
        cajaAbierta = true;
        unsigned long start = millis();
    }
    if (!value && valueAnt) {
        cajaAbierta = false;
        ActivoBuzzer = false;
    }
    valueAnt = value;

    if (cajaAbierta) {
      if (millis() - start > intervalOn) {   // si se abre el cajon        
             ActivoBuzzer = true;
          }      
    }

    if (ActivoBuzzer)
          digitalWrite(BUZZER, HIGH);         // se escuchará el buzzer x 4 seg)
    else 
          digitalWrite(BUZZER, LOW);         // se escuchará el buzzer x 4 seg)        
}

No problem amigo, gracias por ayudar

La primera vez que cargue el programa se activo como debe de ser, las siguentes al abrir se activaba la alarma al instante

saludos y gracias

Agrega el monitor Serie y mira como se comportan los flags, esas variables bool que he puesto.

Hola que tal

puse el serial de lo que me pediste, pero donde le vi el problema fue con (start), al llegar a 8000 se activa cierras el cajon se detiene el contador, cuando la abres de nuevo empieza el contador pero por ejemlo en 22234 y se activa la alarma

en otras palabras no se resetea esa variable a 0

saludos

Que tengas un excelente dia

Eso esta bien porque start toma el valor de millis() y millis() es un cronómetro. En la primer ocación start valia casi 0 pero en la segunda ya habían pasado 22 segundos o sea 22.000 mseg

Nunca te pongas a programar algo sin leer al menos un poco. Te falta base de comprensión para entender lo que estas haciendo. Ve a Documentación y al menos presta atención a las clases de Youtube. Son fáciles de llevar y entender

Acá te puse la misma versión con leyendas que te indican como se comporta. Según comprendo cuando cierras se apaga. Pero si esta abierta y superas intervalOn suena el Buzzer y no se apaga hasta que cierres.

const byte pinSensor    = 2;
const byte BUZZER       = 12;

unsigned long intervalOn = 8000;
unsigned long start      = 0;
bool value, valueAnt     = false;
bool ActivoBuzzer        = false;
bool cajaAbierta         = false;

void setup() {

  pinMode(pinSensor, INPUT_PULLUP);
  pinMode(BUZZER, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  
    value = digitalRead(pinSensor);

    if (value && !valueAnt) {   // caja Abierta pasa de 0 a 1. Cerrada a Abierta
        cajaAbierta = true;     // cajaAbierta = 1
        unsigned long start = millis();
        Serial.println(cajaAbierta?"Caja Abierta":"Caja Cerrada");
    }
    if (!value && valueAnt) {  // cierro caja => Pasa de Abierta a Cerrada
        cajaAbierta = false;   // cajaAbierta = 0
        ActivoBuzzer = false;  // apago Buzzer
        Serial.println(cajaAbierta?"Caja Abierta":"Caja Cerrada");
        Serial.println(ActivoBuzzer?"Buzzer ON":"Buzzer OFF");
    }
    valueAnt = value;

    if (cajaAbierta) {
       if (millis() - start > intervalOn) {   // Si se supera intervalOn       
            ActivoBuzzer = true;               // Activo Buzzer
            Serial.println(ActivoBuzzer?"Buzzer ON":"Buzzer OFF");
        }     
    }

    if (ActivoBuzzer)
        digitalWrite(BUZZER, HIGH);         // se escuchará el buzzer 
    else 
        digitalWrite(BUZZER, LOW);         // se escuchará el buzzer
}

Hola que tal

Disculpa la tardanza no habia podido contestar. El monitor funciona correctamente:

Caja Abierta Buzzer ON Caja Cerrada Buzzer OFF

El funcionamiento sigue siendo el mismo. La primera vez que se abre tarda 8 segundos en sonar la alarma. cierras el circuito deja de sonar.

El problema viene cuando abres de nuevo la caja ya que suena al instante sin esperar los 8 segundos y asi las demas veces.

No sera necesario sumarle al IntervalOn los segundos transcurridos?

saludos

No te imaginas la pavada… se me pasó algo que no borré

start estaba definida dos veces, como global y como local (en el loop)

dejalo asi, modifica todo el loop

void loop() {
  
  value = digitalRead(pinSensor);

  if (value && !valueAnt) {
    cajaAbierta = true;
    start = millis();                 // <== ACA EL CAMBIO
  }
  if (!value && valueAnt) {
    cajaAbierta = false;
    ActivoBuzzer = false;
  }
  valueAnt = value;
  
  if (cajaAbierta) {
    if (millis() - start > intervalOn) {   // si se abre el cajon         
          ActivoBuzzer = true;
      }   
  }

  if (ActivoBuzzer)
      digitalWrite(BUZZER, HIGH);         // se escuchará el buzzer x 4 seg)
  else 
      digitalWrite(BUZZER, LOW);         // se escuchará el buzzer x 4 seg)    
}

Muchas gracias

Funciono a la perfeccion!!!

Aprendi bastante amigo, gracias de nuevo. Por aqui nos seguimos leyendo!!!