Error lectura Medidor de Velocidad Vertical

Hola amigos, recien entré con un nuevo proyecto pero no logro hacerlo funcionar bien. Las lecturas son erroneas y puede que mi falta de conocimiento sea el causante. Aporto información para hubicaros y así puedan aportar la ayuda que solicito.

Este dispositivo permite medir la viscosidad en fluidos Newtonianos, es decir, con viscosidad constante en todo su volumen.

El procedimiento utilizado para mediciones de viscosidad consiste en dejar caer un imán sobre un fluido y medir el tiempo que tarda en atravesarlo. Dividiendo la distancia entre el tiempo transcurrido se obtiene una aproximación de la velocidad del imán.

La duda que me surge es en las lineas de lectura de campo magnético donde valor absoluto “abs”

Field1 = abs(510 - analogRead(A3));

  • Field2 = abs(510 - analogRead(A2));*
  • Field3 = abs(510 - analogRead(A1));*

//No entiendo el 510 a que hace referencia y en que debo basarme. No consigo interpretar.

Los detectores magnéticos empleados son el A1302 Datasheet
Junto con el nano v3,
LCD 16x2,
potenciómetro de 10K,
Resistencia 10K
pulsador

Ahí va el diagrama

/*

Medidor de Velocidad Vertical 

*/

#include <LiquidCrystal.h>

//Variables para el campo magnético
int Field1 = 0;
int Field2 = 0;
int Field3 = 0;
int Field4 = 0;

//Etapas de detección
int Stage1 = 0;
int Stage2 = 0;

//Valores máximos
int Max1 = 0;
int Max2 = 0;

//Tiempo de cada etapa
int Tiempo1 = 0;
int Tiempo2 = 0;

//Tiempo total entre un punto y otro
int Tiempo = 0;

//Tiempo en segundos
double TiempoReal = 0;

//Distancia entre dos puntos
double distancia = 0;

//Velocidad del imán
double velocidad = 0;

//Variables para la impresión en pantalla
int PrintTime1 = 0;
int PrintTime2 = 0;

//Detector de botón
int Push = 0;

//Variable de inicio de ejecución
boolean start = false;

LiquidCrystal lcd(4, 2, 6, 7, 8, 9);

void setup() {
  //30 CM de distancia
  distancia = 0.3;

  lcd.begin(16, 2);


  //El pin 13 alimenta la luz de la pantalla y el led que incorporo al pulsador
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);

  //En el pin 19 va el botón
  pinMode(19, INPUT);

}

void loop() {

  //Lectura del estado del botón
  if (digitalRead(19) == 1) {
    delay(500);
    Push++;
    if (Push > 4 ) {
      Push = 1;
    }
  }

  //Lecturas de campo magnético
  if (start == true) {
    Field1 = abs(510 - analogRead(A3));
    Field2 = abs(510 - analogRead(A2));

    Field3 = abs(510 - analogRead(A1));
    Field4 = abs(510 - analogRead(A0));

    //Cálculo de los promedios del campo magnético
    Stage1 = (Field1 + Field2) / 2;
    Stage2 = (Field3 + Field4) / 2;

    //Detección de los tiempos de detección del máximo campo
    if (Stage1 > Max1) {
      Max1 = Stage1;
      Tiempo1 = millis();
    }

    if (Stage2 > Max2) {
      Max2 = Stage2;
      Tiempo2 = millis();
    }

    //Cálculos de tiempo y velocidd

    Tiempo = Tiempo2 - Tiempo1;
    TiempoReal = Tiempo * 0.001;
    velocidad = distancia / TiempoReal;

  }
  PrintTime2 = millis();

  //Se imprime en pantalla
  if ((PrintTime2 - PrintTime1) > 500) {
    LCD_print();
    PrintTime1 = PrintTime2;
  }

}


/* Le da funcionalidad al menú.
Cuando se presiona el botón, el valor de Push aumenta y cambia lo mostrado en la pantalla.
*/

void LCD_print() {
  switch (Push) {

    case 0:
      lcd.clear();

      lcd.print("Proyecto:");
      lcd.setCursor(0, 1);
      lcd.print("Viscosimetro");

      break;

    case 1:
      Tiempo = 0;
      Tiempo1 = 0;
      Tiempo2 = 0;
      velocidad = 0;

      lcd.clear();
      lcd.print("Iniciar Prueba");
      break;

    case 2:
      start = true;
      lcd.clear();
      lcd.print("Prueba en Curso");
      break;

    case 3:
      start = false;
      lcd.clear();
      lcd.print("RESULTADOS");
      lcd.setCursor(0, 1);
      lcd.print("OBTENIDOS");

      break;

    case 4:
      lcd.clear();
      lcd.print("V= ");
      lcd.print(velocidad);
      lcd.print(" m/s");
      lcd.setCursor(0, 1);
      lcd.print("Tiempo= ");
      lcd.print(Tiempo);
      lcd.print(" ms");

      break;
  }
}

Las lecturas que me dan son negativas o en la mayoria de veces “Inf”

Gracias.

Field1 = abs(510 - analogRead(A3)); Field2 = abs(510 - analogRead(A2));

Field3 = abs(510 - analogRead(A1));

//No entiendo el 510 a que hace referencia y en que debo basarme. No consigo interpretar.

Seguramente tu sensor tiene una salida que arranca en 2.5V = 510 = 1023/2 = aprox a 510 Entonces cuando el iman se acerca al sensor, éste tendrá una respuesta creciente y como mides una diferencia veras por ejemplo un máximo de -430 = 510 - 940 => abs(-430) = +430 y luego decae esas diferencia a 0, para volver a crecer en valor negativo hasta el máximo, supongamos 400 pero sería 400 = 510 - 110 = 400 => abs(400) = 400

De todos modos la hoja de datos en la pagina 3 dice |500x105

O sea.. puede ser 2.5V o puede ser 2.8V (maximo) o 2.4V (minimo) para 0 Gauss Te recomiendo que midas el valor de reposo para modificar ese 510 por lo que diga tu Arduino para cada Sensor. De todos modos no es una medida importante porque no mides Gauss sino el pasaje por ese sensor y por ende el tiempo y de ahi calculas la viscosidad.

Debo suponer que Stage1 son un par de sensores conectados a A3 y A2 Stage2 son el otro para de sensores a A1 y A0

Los primeros inician la cuenta y los ultimos la terminan cuando agrupos llegan a sus máximos.

intenta esto, no sea cosa que por una conversión de tipo de variables tengas problemas

TiempoReal = (double) Tiempo * 0.001;

Gracias Surbyte, si así es, dos que inician y dos que finalizan, en doble para que el calculo sea algo más preciso.

En reposo aportan 2.44v estando alimentado desde el propio nano ya que según he visto, Al alimentarlo desde una fuente externa, el valor de salida Vout varía según el valor de entrada que le doy. 4,8-5,4 v Total que de momento según he visto con todo en modo el hardware en marcha los sensores dan un Vout de 2,44v. Los 4 detectores coinciden con ese valor.

Voy a seguir probando y os cuento.

Gracias.

Voy a seguir mirando

el valor de salida Vout varía según el valor de entrada que le doy. 4,8-5,4 v

El NANO o cualquier arduino (menos el MiniPro o uno que funcione a 3.3V como el DUE) se alimentan con 7V mínimo. Regulador de 5V requiere 2V más para poder entregar una buena salida de tensión regulada.