Hola! tengo una duda con el sensor ultrasonico, lo estoy queriendo implementar en un bastón para ciegos y tengo el inconveniente que con cualquier movimiento me da lecturas falsas por unos instantes (como si detectara algún objeto) lo que hace accionar mi mecanismo de aviso.
Buscando por Internet encontré que es un problema habitual del sensor, me decían que tenia que hacer varias tomas y luego hacer un promedio de las mismas para tratar de minimizar los errores y evitar las "lecturas fantasmas".
hice cambios en mi código y me funciona medianamente bien. habría alguna forma de optimizar mi código para que haga las lecturas mas rápido? ya que se toma unos instantes en reaccionar debido a las tomas y al calculo eso hace que no detecte algunos obstáculos que pasen algo rapidos...
#define PIN_TRIG 6 //Cambiar según sea mas comodo
#define PIN_ECO 5 //Cambiar según sea mas comodo
long duracion, distancia; // Variables
int toma1=0;
int toma2=0;
int toma3=0;
int toma4=0;
int toma5=0;
int distaciaMinima=80; //Distacia minima en cm para accionar led
void lectura(){
/* Hacer el disparo */
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH); // Flanco ascendente
delayMicroseconds(10); // Duracion del pulso
digitalWrite(PIN_TRIG, LOW); // Flanco descendente
/* Recepcion del eco de respuesta */
duracion = pulseIn(PIN_ECO, HIGH);
/* Calculo de la distancia efectiva */
distancia = (duracion/2) / 29;
}
void setup() {
// Inicializacion de la comunicacion serial
Serial.begin (9600);
// Inicializacion de pines digitales
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECO, INPUT);
pinMode(2, OUTPUT);
}
void loop() {
lectura();
toma1=distancia;
// Retardo para disminuir la frecuencia de las lecturas
delay(100);
lectura();
toma2=distancia;
// Retardo para disminuir la frecuencia de las lecturas
delay(100);
lectura();
toma3=distancia;
// Retardo para disminuir la frecuencia de las lecturas
delay(100);
lectura();
toma4=distancia;
// Retardo para disminuir la frecuencia de las lecturas
delay(100);
lectura();
toma5=distancia;
if(toma1<=distaciaMinima&&toma2<=distaciaMinima&&toma3<=distaciaMinima&&toma4<=distaciaMinima&&toma5<=distaciaMinima){
digitalWrite(2,HIGH);
delay(100);
toma1=0;
toma2=0;
toma3=0;
toma4=0;
toma5=0;
}else digitalWrite(2,LOW);
}