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 .
// 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.
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.
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
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
// 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;
}
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.
jpmarques:
../..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.
Solucionado el tema del código , gracias .
Un saludo,,