Duda proyecto alarma.No repetir accion.

Hola.

Soy usuario de arduino hace unos años y he realizado diversos proyectos.

Tengo una duda en un proyecto de una alarma.Lo que quiero conseguir es, que cuando se active, emita unos pitidos por un zumbador y no se vuelvan a repetir hasta que es desconectada y activada otea vez.

Con los pitidos no tengo problema, el problema viene cuando la activo que siempre se emiten esos pitidos cuando el micro empieza otra vez a leer el programa.

digitalWrite(zumbador,HIGH);
delay(500);

digitalWrite(zumbador,LOW);
delay(500);

digitalWrite(zumbador,HIGH);
delay(500);

digitalWrite(zumbador,LOW);
delay(500);

esto es lo que hace cuando se activa.Quiero conseguir que no lo haga repetidamente.

Gracias de antemano,confio en vuestra ayuda.

metelo en un IF con una variable de control , si la variable de control es cierta se emiten pitidos, cuando pase un tiempo pon a 0 la variable de control y no vuelve a pitar.

para que no pite desde un principio con la varable de control a 0 en el setup.

interpretando tu pregunta qcreo que es esto lo que pides. un saludo

SrDonGato:
metelo en un IF con una variable de control , si la variable de control es cierta se emiten pitidos, cuando pase un tiempo pon a 0 la variable de control y no vuelve a pitar.

para que no pite desde un principio con la varable de control a 0 en el setup.

interpretando tu pregunta qcreo que es esto lo que pides. un saludo

Hola gracias por su rapidez.

Resulta que el programa esta así,como tu dices con if pero no se poner ese tiempo que dices, que es el que quiero conseguir.

con la funcion millis()

en un primer momento (al principio de que quieras que hagan los pitidos) coges una variable , tiempoinicial=millis().

ahora una de las condicionses del if de los pitidos pones if ((millis()-tiempoinicial)<3 segundos)
de esta manera solo pitará 3 segundos desde el momento que se active la alarma.

un saludo

Si usas un detector comercial tipo PIR, ten en cuenta que este suele emitir la señal de detección durante unso 4 segundos, por lo tanto en el ejemplo que pone SrDonGato, en vez de sonar 3 segundos estaría sonando durante 6 segundos, porque al terminar el primer ciclo (3 segundos) detectaria una nueva alarma (realmente es la misma que dura 4 segundos) y comenzaría un nuevo ciclo, finalizado este pararian los pitidos...

SrDonGato:
con la funcion millis()

en un primer momento (al principio de que quieras que hagan los pitidos) coges una variable , tiempoinicial=millis().

ahora una de las condicionses del if de los pitidos pones if ((millis()-tiempoinicial)<3 segundos)
de esta manera solo pitará 3 segundos desde el momento que se active la alarma.

un saludo

El codigo no lo posteo porque es muy extenso.La alarma consta de muchos sensores,sirenas,teclados,modem gsm...
Por ello voy a poner el codigo de un botón y así ayudarme haber como se pone lo de millis que dices,porque no tengo ni idea.La función millis la he usado en proyectos de iluminacion.

int ledPin = 13; // Elegimos el pin al que está conectado el LED
int inPin = 2; // Elegimos el pin de entrada (El del pulsador)
int val = 0; // Declaramos una variable que almacenará el estado del pulsador

void setup() {
pinMode(ledPin, OUTPUT); // Declaramos el LED como Salida
pinMode(inPin, INPUT); // Declaramos el Pulsador como Entrada
}

void loop(){
val = digitalRead(inPin); // Leemos el valor de la entrada
if (val == HIGH) { // Si el valor es igual a HIGH (Botón no presionado)
digitalWrite(ledPin, LOW); // Apaga el led
} else { // Y si no
digitalWrite(ledPin, HIGH); // Enciende el led
}
}

Lo suyo seria pulsar el botón, emitir esos dos pitidos y el les que siga ON.
Si consigo la ayuda pues ya lo implanto en mi codigo para la alarma.De antemano muchas gracias desde Alicante.

Un saludo.

Imagina:
Si usas un detector comercial tipo PIR, ten en cuenta que este suele emitir la señal de detección durante unso 4 segundos, por lo tanto en el ejemplo que pone SrDonGato, en vez de sonar 3 segundos estaría sonando durante 6 segundos, porque al terminar el primer ciclo (3 segundos) detectaria una nueva alarma (realmente es la misma que dura 4 segundos) y comenzaría un nuevo ciclo, finalizado este pararian los pitidos...

Muchas gracias imagina.El caso es que cuando la estaba montando, me di cuenta de eso y tube que hacer unas modificaciones.
Lo tendré en cuenta cuando solucione lo de millis. :wink:
Gracias!

Te modifico tu código para que se pueda encender el tiempo que quieras el led.

int ledPin = 13; // Elegimos el pin al que está conectado el LED
int inPin = 2; // Elegimos el pin de entrada (El del pulsador)
int val = 0; // Declaramos una variable que almacenará el estado del pulsador
int tiempoinicial=0;

void setup() {
pinMode(ledPin, OUTPUT); // Declaramos el LED como Salida
pinMode(inPin, INPUT); // Declaramos el Pulsador como Entrada
}

void loop(){
val = digitalRead(inPin); // Leemos el valor de la entrada
if ((val == HIGH) OR ((millis()-tiempoinicial)<3000)) { // Si el valor es igual a HIGH (Botón no presionado) o la diferencia es menos de 3 segundos
digitalWrite(ledPin, LOW); // Apaga el led
} else { // Y si no
digitalWrite(ledPin, HIGH); // Enciende el led
}
}
if (val == HIGH) tiempoinicial=millis(); // actualiza el valor inicial cada vez que val == high

de esta manera si no me he equivocado , estara encendido el led 3 segundos cada vez de se levante el dedo del boton

un saludo

SrDonGato:
Te modifico tu código para que se pueda encender el tiempo que quieras el led.

int ledPin = 13; // Elegimos el pin al que está conectado el LED

int inPin = 2; // Elegimos el pin de entrada (El del pulsador)
int val = 0; // Declaramos una variable que almacenará el estado del pulsador
int tiempoinicial=0;

void setup() {
pinMode(ledPin, OUTPUT); // Declaramos el LED como Salida
pinMode(inPin, INPUT); // Declaramos el Pulsador como Entrada
}

void loop(){
val = digitalRead(inPin); // Leemos el valor de la entrada
if ((val == HIGH) OR ((millis()-tiempoinicial)<3000)) { // Si el valor es igual a HIGH (Botón no presionado) o la diferencia es menos de 3 segundos
digitalWrite(ledPin, LOW); // Apaga el led
} else { // Y si no
digitalWrite(ledPin, HIGH); // Enciende el led
}
}
if (val == HIGH) tiempoinicial=millis(); // actualiza el valor inicial cada vez que val == high




de esta manera si no me he equivocado , estara encendido el led 3 segundos cada vez de se levante el dedo del boton

un saludo

Okey, muchísimas gracias de verdad.En un día tengo la solución.Estoy encantado.
Lo implanto en el sistema y comento el resultado,un saludo.

a9965:

SrDonGato:
Te modifico tu código para que se pueda encender el tiempo que quieras el led.

int ledPin = 13; // Elegimos el pin al que está conectado el LED

int inPin = 2; // Elegimos el pin de entrada (El del pulsador)
int val = 0; // Declaramos una variable que almacenará el estado del pulsador
int tiempoinicial=0;

void setup() {
pinMode(ledPin, OUTPUT); // Declaramos el LED como Salida
pinMode(inPin, INPUT); // Declaramos el Pulsador como Entrada
}

void loop(){
val = digitalRead(inPin); // Leemos el valor de la entrada
if ((val == HIGH) OR ((millis()-tiempoinicial)<3000)) { // Si el valor es igual a HIGH (Botón no presionado) o la diferencia es menos de 3 segundos
digitalWrite(ledPin, LOW); // Apaga el led
} else { // Y si no
digitalWrite(ledPin, HIGH); // Enciende el led
}
}
if (val == HIGH) tiempoinicial=millis(); // actualiza el valor inicial cada vez que val == high




de esta manera si no me he equivocado , estara encendido el led 3 segundos cada vez de se levante el dedo del boton

un saludo

Hola:

'Nos conocemos' de algún post y dudas que me has resuelto.Te escribo porque he visto que hay una feria en Valencia,al ver que tu ibas y ya que nunca he ido,pues me gustaría asistir así que preguntarte por si hay que ser mayor de edad,ser alguien en especial,de alguna empresa...
Bueno espero tu respuesta tan rápida como en el foro.
Un saludo.
Gracias

Voy a la feria ? :smiley:

no se donde lo has visto pero tampoco me lo he planteado, no tengo muchas vacaciones ahora.

No sé que requisitos hacen falta para ir tampoco pero seguramente sea abierto a calqueir persona y edad, no creo que sea necesario seas de alguna empresa y demás

Yo soy un simple aficionado que me gusta echar una mano enla medida de lo que sé y conozco, aunque tengo poco tiempo para dedicar a mis hobbys

un cordial saludo ¡

SrDonGato:
Voy a la feria ? :smiley:

no se donde lo has visto pero tampoco me lo he planteado, no tengo muchas vacaciones ahora.

No sé que requisitos hacen falta para ir tampoco pero seguramente sea abierto a calqueir persona y edad, no creo que sea necesario seas de alguna empresa y demás

Yo soy un simple aficionado que me gusta echar una mano enla medida de lo que sé y conozco, aunque tengo poco tiempo para dedicar a mis hobbys

un cordial saludo ¡

Hola!
Pues muchas gracias por contestar.El caso es que yo tengo mas tiempo ya que aun no trabajo y estudio, y como nunca he ido pues pienso que debe ser interesante.

Por cierto,lo de millis no me sirve porque cuando cuenta esos 3 segundos arduino sigue leyendo el codigo,por lo tanto el sensor de entrada te pilla.

Gracias un saludo!
(ayudenmee) =)

Según tengo entendido,la función millis cuenta pero sin parar el programa.Por lo que ya se,la función delay cuenta y detiene el programa.Lo que quiero conseguir es: detener el programa( para no obtener lectura alguna de ningún sensor,por lo tanto activar la alarma sin que me pille el sensor de la entrada) y poner un tiempo de salida.(por ejemplo unos 15 segundos).

Me falta ese detalle para ternimarla.Un saludo y gracias!! =)

la funcion millis como dice en la referencia es que devuelve

"Tiempo en milisegundos desde que el programa se inició (long sin signo (unsigned long)) "

no para el programa, es un contador que se incrementa constantemente y la funcion millis devuelve el calor de ese contador cada vez que se le llama, pero no para el programa.

haz una funcion para que la alarma empiece a funcionar despues de 15 segundos, para eso no es necesario "parar" el programa, sino que se dé esa circunstancia, con la funcion millis podras hacerlo tambien sin problemas de la misma manera
"si han pasado 15 segundos desde que se activo alarga--> empieza a hacer lectura de sensores"

otro IF y otra variable de control.

Un saludo