Hola
Soy nuevo en el foro y apenas estoy empezando en la programación de arduino, espero y puedan ayudarme.
Antes que nada ya estuve buscando en Internet como poder solucionar mi problema pero no he encontrado algo que pueda ayudarme hasta ahora.
Estoy haciendo un circuito que utiliza un sensor de movimiento como entrada digital de arduino, es un PIR, quiero que cada vez que el sensor mande un HIGH (detecto movimiento) me encienda un foco y a la vez me muestre un conteo binario del 0 al 15 en unos LEDs.
Para el encendido y apagado del foco use la instruccion if y para el contador el switch case, y funciona, el problema es que el tiempo que el sensor PIR manda un 1 (HIGH) dura lo suficiente como para que el contador incremente cuatro veces.
Siendo que cada vez que detecta movimiento se cuentan de 4 en 4. Yo quiero saber si es posible que el switch case detecte el HIGH del sensor, me haga el incremento, pero que cuando regrese a void loop (para entonces el sensor sigue en HIGH) no vuelva a incrementar sino que espera a que se ponga en LOW y de nuevo en HIGH para hacer otro incremento.
Si hay otra forma de hacer el conteo si usar case les agradecería mucho su ayuda.
float cuenta;
int numero = 0;
int estado; //Variable que cambiara de acuerdo al estado del sensor.
void setup() {
pinMode (pinSensor, INPUT); //El pin del sensor se configura como entrada.
pinMode (pinFoco, OUTPUT); //El pin del foco se configura como salida.
pinMode (b4, OUTPUT);
pinMode (b3, OUTPUT);
pinMode (b2, OUTPUT);
pinMode (b1, OUTPUT);
digitalWrite (pinFoco, LOW); //El pin del foco se pone en bajo como estado inicial.
}
void retardo(){
for (cuenta=0; cuenta < 50000; cuenta++) {
}
}
void binario(int v4, int v3, int v2, int v1){
digitalWrite(b4,v4);
digitalWrite(b3,v3);
digitalWrite(b2,v2);
digitalWrite(b1,v1);
}
void loop() {
estado = digitalRead (pinSensor); //Lee el estado del sensor.
if (estado == HIGH) { //Si el sensor detecta movimiento:
digitalWrite (pinFoco, HIGH); //Poner el pin del foco en alto, activando el rele, encendiendo el foco.
}
else { //Si el sensor no detecta movimiento:
digitalWrite (pinFoco, LOW); //Pone el pin del foco en bajo, desactivando el rele, apagando el foco.
}
if (estado == HIGH and numero <16) {
numero = numero + 1;
}
if (numero == 16){
numero = numero - 16;
}
switch (numero) {
case 0:
binario(0,0,0,0);
break;
case 1:
binario(0,0,0,1);
break;
case 2:
binario(0,0,1,0);
break;
case 3:
binario(0,0,1,1);
break;
case 4:
binario(0,1,0,0);
break;
case 5:
binario(0,1,0,1);
break;
case 6:
binario(0,1,1,0);
break;
case 7:
binario(0,1,1,1);
break;
case 8:
binario(1,0,0,0);
break;
case 9:
binario(1,0,0,1);
break;
case 10:
binario(1,0,1,0);
break;
case 11:
binario(1,0,1,1);
break;
case 12:
binario(1,1,0,0);
break;
case 13:
binario(1,1,0,1);
break;
case 14:
binario(1,1,1,0);
break;
case 15:
binario(1,1,1,1);
break;
}
retardo();
}