Medidor de distancias con 3 sr04

Hola a todos, hace unas semanas me presente en este foro para pediros vuestra opinión sobre un proyecto… Estaba a la espera de recibir mi arduino y mis componentes, ya que los había comprado en china y bueno…ya sabéis que hay que esperar unas semanitas para que llegue…

Total, que por fin me ha llegado y he empezado a familiarizarme con el.

Voy a pasar a exponer mi proyecto, después copiare el poco código que tengo hasta ahora y después os planteare alguna duda que tengo…

Vereis, mi proyecto consiste básicamente en registrar la distancia mínima a la que ha pasado algún objeto de 3 sensores que estarán colocados en distintos sitios. Un display de 20x4 indicara cual es la distancia mínima a la que ha pasado un objeto de cada sensor, mas o menos el mensaje seria algo asi:

|Distancia minima sensor 1: Xcm|
|Distancia minima sensor 2: Xcm|
|Distancia minima sensor 3: Xcm|

La idea es muestrear constantemente la distancia de los sensores y almacenarla en 3 variables (una para cada sensor). Si la medida actual es menor que la almacenada, esta se guarda sustituyendola, y si es mayor que la guardada se mantiene la medida que habia, de forma que en la variable siempre este almacenada la medida mas pequeña.

Despues, mostraría en el display las variables, de forma que el display mostrase la medida mas pequeña que hubiera detectado cada sensor.

También me gustaría tener 2 botones:
-El primer botón (start) serviria para resetear los valores almacenados y empezar a muestrear
-El segundo botón (stop)pararia el muestreo( los valores permanecerían fijos en el display hasta que pulsase de nuevo el start).

Espero haberme explicado bien…si tenéis dudas consultarme

Ahora voy a exponeros el poco código que tengo, que lo he hecho combinando y modificando algún código que había por internet. he creado una variable que es la que contiene el valor que debe mostrar el display, y después realizo una comparación de la variable con la medida actual para almacenar en la variable la que sea mas pequeña de las 2. El display muestra correctamente el valor de la variable, el problema debe estar en la comparación, ya que el valor de la variable nunca cambia…o eso, o no leo correctamente el valor del sr04

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Ultrasonic.h>

Ultrasonic ultrasonic(12,13,5800); // (Trig PIN,Echo PIN)

LiquidCrystal_I2C lcd(0x27,20,4);

int distanciaminima = 100;          //Declaro la variable y la inicializo a 100

void setup()
{
  lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  lcd.backlight();
lcd.begin(20, 4);

}

void loop()
{
  if (ultrasonic.Ranging(CM)<distanciaminima)       //Realizo la comparacion
  {
    distanciaminima==ultrasonic.Ranging(CM);        //si el valor actual es menor que el almacenado en la variable este debe sustituirse por el actual
  }
  else 
  {
  distanciaminima==distanciaminima;                  //si el valor actual es mayor al almacenado dejo el almacenado igual
  }
  
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("Distancia");                            
  lcd.setCursor(5,1);
  lcd.print(distanciaminima);                         //escribo en el display la distancia almacenada en la variable
  lcd.print(" cm");
  delay(500);
}

Edito, he avanzado un poco el codigo, pero no consigo que funcione correctamente, arriba del codigo explico el problema

Lo cierto es que a dia de hoy apenas se programar, pero bueno…espero seguir aprendiendo poco a poco, y si me pudieseis ayudar en esto podría seguir haciendo pruebas y aprendiendo, asi que os agradezco vuestra colaboración por adelantado

saludos

Te corrijo algunos errores

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Ultrasonic.h>

Ultrasonic ultrasonic(12,13,5800); // (Trig PIN,Echo PIN)

LiquidCrystal_I2C lcd(0x27,20,4);

int distanciaminima = 100;          //Declaro la variable y la inicializo a 100
int distancia
void setup()
{
  lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  lcd.backlight();
lcd.begin(20, 4);

}

void loop() {

  distancia = ultrasonic.Ranging(CM);

  if (distancia < distanciaminima) {      //Realizo la comparacion
      distanciaminima = distancia;        //si el valor actual es menor que el almacenado en la variable este debe sustituirse por el actual
  }
  
  
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("Distancia");                            
  lcd.setCursor(5,1);
  lcd.print(distanciaminima);                         //escribo en el display la distancia almacenada en la variable
  lcd.print(" cm");
  delay(500);
}

No uses == para asignar valores. Solo un = es suficiente

gracias por tu respuesta, la verdad es que como tu lo pones tiene mucho mas sentido, aun así, no consigo que funcione...el display muestra constantemente que la distancia es 100cm, y bueno...revisando el código, hasta donde yo se no parece haber errores...quiero decir, se ve sencillo y eficaz, pero algo debe fallar

Porque no empezaste por lo básico. Lo básico es que verifiques que el sensor funcione. Lo has hecho? Devuelve valores menores a 100? Luego de hacer eso trabajas con este programa pero siempre siempre uno debe asegurarse. Si lo hiciste veremos que otro paso dar

Perdona agregaste un ; al final de la definición de int distancia porque yo lo olvidé.

De nuevo gracias por la respuesta.
si que agregue el “;”, ya que me daba un error de compilación y al revisar el código vi que falta y lo puse y ya no me dio error de compilación. Por otro lado, el sensor si que funciona, ya que si cargo otro código, como este por ejemplo si que funciona y me da la medición en tiempo real

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Ultrasonic.h>

Ultrasonic ultrasonic(12,11,5800); // (Trig PIN,Echo PIN)

LiquidCrystal_I2C lcd(0x27,20,4);



void setup()
{
  lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  lcd.backlight();
lcd.begin(20, 4);

}

void loop()
{
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("Distancia");
  lcd.setCursor(5,1);
  lcd.print(ultrasonic.Ranging(CM)); // CM or INC
  lcd.print(" cm");
  delay(600);
}

Esto es sin cambiar el montaje, es decir, sin tocar nada, este código funciona y me da la medición correcta menor a 100, pero el otro código me da un “100” constante en la pantalla.

Mañana seguiré con ello, a ver si puedo ir acotando el error hasta dar con el[/code]

tu código es similar al de esta página. Supongo que usas la versión de librería 2012 no?

exacto, de hecho descargue la librería de esa misma pagina, y como digo, el código que uso funciona bien para medir distancia "en tiempo real"

Otra cosa que quería comentaros...el display parece que se resetea...es decir, esta midiendo, se apaga y vuelve a encenderse y sigue midiendo, y así cada poco...Sabríais a que puede deberse? Decir que tengo arduino conectado a una fuente de alimentación independiente, y que si uso por ejemplo un código sencillo para escribir un mensaje en la pantalla el mensaje si queda sin que la pantalla se resetee. Pense que podria ser algo en el código...pero me parece extraño

Hola de nuevo, queria haceros una pregunta...hay alguna forma de saber el valor almacenado en una variable durante la ejecución del programa? es para analizar si el problema viene de que la variable distancia no toma el valor del sensor, o lo que pasa es que no se realiza bien la comparación.

gacias de antemano, saludos

hay alguna forma de saber el valor almacenado en una variable durante la ejecución del programa?

La manera es usando Serial.print(variable) pero ya esta hecho en tu programa

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Ultrasonic.h>

Ultrasonic ultrasonic(12,13,5800); // (Trig PIN,Echo PIN)

LiquidCrystal_I2C lcd(0x27,20,4);

int distanciaminima = 100;          //Declaro la variable y la inicializo a 100
int distancia
void setup()
{
  lcd.init();                      // initialize the lcd 
 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.begin(20, 4);

}

void loop() {
  char buffer[21];

  distancia = ultrasonic.Ranging(CM);

  if (distancia < distanciaminima) {      //Realizo la comparacion
      distanciaminima = distancia;        //si el valor actual es menor que el almacenado en la variable este debe sustituirse por el actual
  }
  

  lcd.setCursor(3,0);
  lcd.print("Minima ValorLeido");                            
  lcd.setCursor(5,1);
  sprintf(buffer, " %3d cm %3d cm", distanciaminima, distancia);   	// %d es para imprimir enteros el 3 reserva 3 espacios
  lcd.print(buffer);                    							//escribo en el display la distancia almacenada en la variable
  																	// Ajusta " %3d cm %3d cm" para que se vea alineado

  delay(500);
}

El display parece que se resetea por esta instrucción lcd.clear(); que lo borra cada 500 mseg

Bueno, pues ya he conseguido solucionar el problema, la verdad, no se como...imagino que la suerte del principiante, ahora toca seguir!!

surbyte, muchas gracias por todo!!

ahora paso a la siguiente parte del proyecto...los pulsadores y los cables.

Por un lado, tengo entendido que necesito introducir un codigo en los pulsadores para que no me falsee los resultados al vibrar internamente el contacto (nose si me he explicado bien). Mañana me centrare en esta parte a ver si consigo algo

Por otro lado, la parte que mas me preocupa ahora es el tema de los cables...si uso cables largos, de unos 10-15 metros para llevar la información de los sensores al arduino, como puedo solucionar el problema de las falsas señales? quiero decir...imagino que la señal podrá contaminarse o falsearse usando cables tan largos...alguien podría decirme algo acerca de esto?

Por ultimo, tendré que seguir con el código, pero eso lo dejare para mas adelante, cuando tenga solucionado el tema de los interruptores y los cables

EDITO Ya tengo implementados los pulsadores, aunque aun no tienen todas las funciones que me gustaria, pero bueno, poco a poco la cosa avanza ;)

Para resolver eso solo tienes que confirmar la lectura del estado del pulsador luego de x mseg. normalmente con 20 mseg es suficiente. Hay quienes usan mas. Busca Arduino debounce y encontrarás como se hace.