Previamentes ya escribi sobre el control de ultrasonidos, pero al implementar el codigo con el que se me ayudo al que ya tenia de encendido/apagado de un LED con palmas y cuando quiero apagarlo con otras 3 palmas, no puedo.
Creo que tiene algo que ver con algo de "time" o algo asi porque no me da tiempo a hacer las 3 palmadas de la rutina. Tambien podria ser por la linea " duracion = pulseIn(echoPin, HIGH) ; " peor no estoy seguro de ello.
He mirado el conexionado y funciona perfectamente y el pin no esta fundido.
Mi codigo es el siguiente :
//Parte de distancia
#define trigPin 13
#define echoPin 12
//#define led 3
long duracion, distancia, distanciaAnterior;
int Limite = 25 ; // Medida en vacío del sensor
int intensidad;
bool unaVez = true, unaVez2 = true;
//Parte de palmas
const int pinLED = 5;
const int pinMicrophone = 9;
bool state1 = false;
bool state2 = false;
bool state3 = false;
bool stateLED = false;
bool soundDetected = false;
unsigned long tem;
//Parte nueva
bool BitMedicion;
void setup(){
//Parte de palmas
pinMode(pinLED, OUTPUT);
pinMode(pinMicrophone, INPUT);
Serial.begin(9600);
//Parte de medicion
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(pinLED, OUTPUT);
BitMedicion = LOW;
}
void loop(){
//Serial.print("Estado LED = ");
//Serial.println(digitalRead(pinLED));
soundDetected = digitalRead(pinMicrophone);
if ((soundDetected==true) && (state1==false) && (state2==false) && (state3==false)) {
state1 = true;
Serial.println("Estado1 true");
tem = millis();
delay (200);
} else if ((soundDetected == true) && (state1==true) && (state2==false) && (state3==false) ) {
state2 = true;
Serial.println("Estado2 true");
delay (200);
} else if ((soundDetected == true) && (state1==true) && (state2==true) && (state3==false) ) {
state3 = true;
Serial.println("Estado3 true");
delay (200);
}
if ((state1==true) && (state2==true) && (state3==true)){
stateLED = !stateLED;
digitalWrite(pinLED , stateLED);
BitMedicion = stateLED ;
Serial.println("Tres estados detectados");
Serial.print("Estado LED = ");
Serial.println(stateLED);
state1 = false;
state2 = false;
state3 = false;
}
if (((millis()-tem) >= 500) && (state1==true) && (state2==false || state3==false)){ // Reseteamos estados al pasar 500 ms
Serial.println("Reset Time");
Serial.println((millis()-tem));
state1 = false;
state2 = false;
state3 = false;
}
if(BitMedicion == HIGH) //Aqui ejecutamos el codigo de regulacion
{
//PARTE DE MEDICION
//CALCULAMOS LA DISTANCIA
digitalWrite(trigPin, LOW); // Nos aseguramos de que el trigger está desactivado
delayMicroseconds(2); // Para asegurarnos de que el trigger esta LOW
digitalWrite(trigPin, HIGH); // Activamos el pulso de salida
delayMicroseconds(10); // Esperamos 10µs. El pulso sigue active este tiempo
digitalWrite(trigPin, LOW); // Cortamos el pulso y a esperar el echo
duracion = pulseIn(echoPin, HIGH) ;
distancia = duracion / 2 / 29.1 ;
if ( distancia != distanciaAnterior )
{
Serial.println(String(distancia) + " cm.") ;
}
distanciaAnterior = distancia;
//DENTRO DEL LIMITE
if ( distancia <= Limite )
{
intensidad = 255 / Limite * distancia;
analogWrite ( pinLED , intensidad) ;
if ( unaVez == true )
{
Serial.println("Esta dentro de rango");
unaVez = false;
}
unaVez2 = true;
}
//FUERA DEL LIMITE
else
{
if (unaVez2 == true )
{
Serial.println("Esta fuera del rango");
unaVez2 = false;
}
unaVez = true;
}
delay (50) ; // Para limitar el número de mediciones
}
}
He llegado a la conclusion de que es cosa del codigo porque el conexionado esta bien y comprobado.
Mi problema basicamente es que al entrar en el estado de encendido despues de 3 palmas luego no puedo apagarlo al volver a palmar porque me aceptaba 2 de los 3 estados solo.
Muchas gracias de antemano.