Buenas noches amigos, soy nuevo con este interesante mundo del arduino, estoy desarrollando un proyecto para mi trabajo y necesito ayuda de ustedes ya que soy nuevo con este tema, el problema es el siguiente, en la D2 de mi arduino nano llegara un pulso constante y cuando el tenga este pulso quiero que este en high la salida D4 por un tiempo de 1.5seg y luego quede en Low, el problema lo tengo es que el pulso de entrada es un Switch y no un pulsador, es decir la señal estara fija en la entrada y por lo tanto la condicional me mantiene en high la salida D4, espero hayan podido entender mi problema. les dejo mi codigo, ya intente con delays y tambien intente hacer como un loop dentro de la condicional if pero no me sale, gracias de antemano
const int GPS=2;
const int BLOQUEO=4;
int variable;
void setup() {
pinMode (2,INPUT);
pinMode (4,OUTPUT);
}
void loop() {
variable = digitalRead (GPS);
if (variable==HIGH) {digitalWrite (BLOQUEO,HIGH);}
else {digitalWrite (BLOQUEO,LOW);}
}
Tenés que trabajar con el flanco de la señal, o sea, reaccionar al cambio de la señal no al nivel de la misma.
Entonces, lees el pin y comparas su estado con el estado de la ultima lectura (que guardas en una variable.
Si son distintos es porque hay un cambio entonces te fijas si es el estado que te interesa y ejecutas lo que deseas.
Suponiendo que el switch está activo cuando cierra a masa (GND) y que has declarado una variable estadoanterior
byte estadoactual = digitalRead(tupin);
if (estadoactual != estadoanterior) {
if (estadoactual == LOW) {
// aca tus acciones
}
}
estadoanterior = estadoactual;
Bueno la idea es que cuando D2 este en high me de un pulso de 1.5 seg en D4 y cuando D2 este este en Low me de un pulso de 1.5 seg en D6, el tema está en que la duración de la señal que lee D2 tiene un tiempo indefinido, como puede durar 2 min hasta 2 horas, no se me hago entender
Entiendo su idea, me quedaría revisar un poco más de código con los manuales para lograr hacerlo pero entiendo la esencia de la idea, está interesante la desarrollaré más
Así como te lo planteé, el switch puede estar 20 años en LOW o en HIGH que tu código solo va a reaccionar cuando lo cambies y si es el estado que quieres.
Moderador
Por favor lee el punto 5 de las normas y de paso todas las normas y modifica el título " [Ayuda con un condicional por favor"
Ni "Ayuda" ni "por favor".
Son titulo que no dicen NADA o considerados inútiles
Debes colocar algo que exprese tu consulta, tu problema.
El foro solo AYUDA y solo pida a cambio que se respeten las normas cosa que no ha ocurrido pero tienes la oportunidad de modificarlo y seguimos adelante.
Me parece que CHANGE no es la opción correcta porque envías el pulso con cada flanco, y el PO solo necesita disparar la señal con uno de los flancos, RISING o FALLING.
Va en gustos pero, salvo que el tiempo de respuesta sea crítico, usar una interrupción para leer un interruptor me parece desproporcionado, además es más complicado filtrar los rebotes (algo que en el código de #3 no puse).
¿ Y redefinir la interrupción recordando que nivel la activo anteriormente ?. Recuerda el #6, el PO también quiere otro pulso de salida en D6 al cambiar a LOW.
Y piénsalo bien si se producen rebotes " flag " siembre retorna "true", ya estamos eliminando los posibles rebotes.
Aunque hayan rebotes no se tratan, la ISR no cambia el valor de "flag", (no contamos pulsos), lo hace siempre verdadero, es el loop cuando trata la interrupción y tras 1,5 seg. Tiempo mas que suficiente para eliminar cualquier rebote.