Go Down

Topic: Problema con codigo para deteccion con FC-51 {SOLUCIONADO} (Read 127 times) previous topic - next topic

jpmarques

Hola , estoy desarrollando un pequeño proyecto utilizando un Arduino Uno , un modulo sensor FC-51 y un modulo bluetooth HC-05 , la idea es detectar un objeto en movimiento que pasa delante del sensor y enviar un dato a través de BT a una aplicación al móvil , la aplicación activa un cronometro con este dato y lo para cuando pasa el siguiente objeto delante del sensor , en resumen controla el tiempo que trascurre entre detección y detección del sensor.
A nivel hardware y app lo tengo controlado , y el proyecto en general lo tengo funcionando con este codigo .

Code: [Select]
// Envia dato mediante BT y al led

#include <SoftwareSerial.h>

SoftwareSerial miBT(10, 11);

int sensor = 2;
int LED = 13;

void setup(){
 //Serial.begin(9600);
 miBT.begin(38400);
 pinMode (sensor, INPUT);
 pinMode (LED, OUTPUT);
}

void loop(){
 miBT.println("A");
 if (digitalRead(sensor) == LOW) {
 miBT.println("1");
 //Serial.println("1");
 digitalWrite(LED, HIGH);

 }
 else {
 miBT.println("0");
 //Serial.println("0");
 digitalWrite(LED, LOW);                     
  }
 }


El problema que tengo es el siguiente , los objetos a detectar son irregulares y de diferentes volumenes , entonces pasa alguna ves que el mismo objeto es detectado varias veces a su paso por lo cual recibo en la aplicacion varios "1" provenientes del mismo objeto .
La pregunta es ¿ como podría hacer a través del código para evitar esto y solo obtener una deteccion por cada objeto ? yo se que el siguiente objeto a detectar nunca pasara antes de 2 o 3 segundos con lo que podria contar con este tiempo de margen para que el sistema vuelva a detetar , pero no tengo claro como hacerlo.
Soy un viejo electronico , pero algo nuevo en la programacion de arduino , intentando aprender poco a poco.
Gracias de antemano.

jordi3sk97

Busca ejemplos de debounce  por software. Y lo aplicas a tu código  poniendo el lapso que dices de 2 segundos.

Por otro lado, imho, una comunicación por BT no te dará ninguna precisión para un cronometro, tendría que ser el Arduino quien calculara el tiempo y enviarlo a la App.

surbyte

Como te dice jordi3sk97, bastaría por bloquear tu detección por esos 2000 mseg cuando has detectado algo y cierras entonces tu capacidad para ver mas objetos o el mismo.

Pero viendo tu código veo otro problema y es el que todos cometen.
Cuando ves algo y se pone en el estado de detección
Code: [Select]

 if (digitalRead(sensor) == LOW) {


tu sistema enviará varios 1s porque el te sigue diciendo que lo ve, porque esta delante!!

Lo que debes hacer es enviar esa información cuando el sensor cambia de 1 a 0 o sea mirar el flanco de caida del sensor.
El sensor viene diciendo NO VEO NADA, NO VEO NADA y de repente dice DETECTO OBJETO pues.. eso es un cambio de flanco de NO VEO NADA en HIGH a DETECTO OBJETO en LOW.

eso se hace asi

Code: [Select]
// Envia dato mediante BT y al led

#include <SoftwareSerial.h>

SoftwareSerial miBT(10, 11);

const byte sensor = 2;
const byte LED    = 13;
bool  detecto, detectoAnt = true;

void setup(){
    //Serial.begin(9600);
    miBT.begin(38400);
    pinMode (sensor, INPUT);
    pinMode (LED, OUTPUT);
}

void loop(){
    miBT.println("A");

    detecto = digitalRead(sensor);
    // Flanco descendente de 1 a 0
    if (!detecto && detectoAnt) {
        miBT.println("1");        // envio 1 para indicar que veo objeto
        //Serial.println("1");
        digitalWrite(LED, HIGH);
    }
   
    // envio 0 para indicar que no veo nada
    // esto lo hará una sola vez
    // flanco ascendente de 0 a 1
    if (detecto && !detectoAnt) {
        miBT.println("0");
        //Serial.println("0");
        digitalWrite(LED, LOW);                     
    }
    detectoAnt = detecto;
}

jpmarques

Gracias por la información y explicaciones , en cuanto regrese de viaje hago pruebas y comento.
Una duda , sobre lo que dice jordi3sk97 sobre la precisión del BT es por el retardo de este tipo de comunicación ? , en este caso solo lo uso para la orden remota de activación/desactivación pero entiendo que la precisión del propio crono estará determinada por la programación de la App.

jordi3sk97

../..en este caso solo lo uso para la orden remota de activación/desactivación pero entiendo que la precisión del propio crono estará determinada por la programación de la App.
Leyendo esto,... no entiendo la frase. No me queda claro que se activa/desactiva, quien da la orden remota, y si la App te refieres al programa del Arduino o a la del móvil.

Pero según tu primer mensaje yo entendí:

1 - El Arduino detecta un objeto,
2 - El Arduino  envía una señal por BT al móvil
3 - El móvil empieza a cronometrar(*)
4 - El Arduino detecta un objeto
5 - El Arduino  envía una señal por BT al móvil
6 - El móvil termina de cronometrar(*)

Imho cronometro = precisión, y yo por aquí no la veo.
Me parece mas correcto.

1 - El Arduino detecta un objeto,
2 - El Arduino detecta un objeto
3 - El Arduino  calcula el tiempo y envía un mensaje con el valor por BT al móvil.


jpmarques

Solucionado el tema del código , gracias .
Un saludo,,

Go Up