Buenas noches comunidad, estoy haciendo un proyecto para la Universidad (ingeniería mecánica) que trata sobre crear un sistema de adquisición de datos para una máquina de ensayos universal (UTM en ingles) del año 60 aprox, los materiales son:
- Arduino UNO
- Shield Datalogger (SD y RTC) marca Adafruit
- Sensor VL53L0X marca Adafruit
- Transductor de presión industrial marca Wika modelo A-10
- LCD 16x2 con I2C
- Protoboard
- Fuente de poder (conector jack) de 12V-3A
Una breve introducción del objetivo del proyecto: la meta es digitalizar las acciones de la maquina, con la ayuda de un transductor de presión incorporado en el sistema hidráulico (Fig 1) crear una relación mediante codigo con el marcador analógico (que marca la fuerza ejecutada en kilogramos) de la maquina (Fig 2).
Fig 1:
Fig 2:
La relación entre lo que indica el marcador analogico y el transductor lo estoy haciendo con una función map, cuando no hay fuerza actuando el transductor siempre indica aprox 200, el problema que tengo es que en la maquina aplico 3 toneladas de fuerza y el sensor apenas marca 227, con un comportamiento terrible en todo el espectro (fig 3), en la Fig4 pueden ver los datos manuales (al ojo, viendo el monitor serie) que anoté. En la columna 1 los valores de la carga real que marca la maquina y en la segunda los valores en brutos leídos por el sensor (no la salida de "map").
Fig 3.
Fig 4
Con ese comportamiento no voy a poder crear una relación, por ejemplo, que cuando en la maquina se indique que hay 2000kg de fuerza aplicados en la salida de la función map me muestre 2000kg.
En la Fig 5 todo conectado, que desastre de cablería jajajaj, pero luego voy a cambiar la protoboard por cables soldados al shield datalogger
Fig5
En resumen, mis preguntas son 2:
1) Que me recomiendan para obtener una BUENA relación entre lo que marca la maquina y el sensor?
2) Como establezco una referencia común para la distancia entregada por el sensor VL53L0X y la presión por el transductor, con un delay de 1000 para cada sensor?
El código de todo el sistema es:
#include <VL53L0X.h>
#include <LiquidCrystal_I2C.h>
#include <SD.h>
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
RTC_PCF8523 RTC;
VL53L0X sensor;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int type = 1;// 1=mm , 2= cm
const int analogInPin=A0;
int sensorValue=0;
int outputValue=0;
// Funcion que simula la lectura de un sensor
const int chipSelect=10; // pin 10 para tarjeta sd
int distance()
{
return 0;
}
//int SensorPin=A0
String unit;// variable para la unida de medida de VL53L0X [mm]
String ano;
String dia;
String mes;
String horas;
String minutos;
String segundos;
String FECHA;
String HORA;
String Nombredelarchivo;
String Imprimir;
void setup() {
//pinMode(Salida,OUTPUT);
Serial.begin(9600);
Wire.begin();
RTC.begin();
// instrucciones para RTC
if (! RTC.isrunning())
{
Serial.println("RTC no está activada");
//Para ajustar la fecha y hora, por primera vez, a la del computador que está usando, debe descomentar la siguiente linea:
//RTC.adjust(DateTime(__DATE__,__TIME__));
}
Serial.print("Iniciando tarjeta SD ...");
if (!SD.begin(chipSelect))
{
Serial.println("Error al iniciar");
//while(1);
}
else {
Serial.println(" SD Iniciada correctamente");
}
// fin instruccion RTC
///////////////////////////////////////
// inicio instrucciones para LCD y VL53L0X
sensor.init();
sensor.setTimeout(500);
// Start continuous back-to-back mode (take readings as
// fast as possible). To use continuous timed mode
// instead, provide a desired inter-measurement period in
// ms (e.g. sensor.startContinuous(100)).
sensor.startContinuous(500);
// inicializando LCD,
lcd.begin();
// Enciendiendo luz de fondo e impresión de mensaje
lcd.backlight();
// fin instrucciones para LCD y VL53L0X
}
void loop() {
// almacenamientos de valores en variable "distance" para sensor VL53L0X
int distance = sensor.readRangeContinuousMillimeters();
// Instrucciones para sensor de temperatura:
sensorValue=analogRead(analogInPin);
outputValue=map(sensorValue,198,216,0,2100);
//función map: (valor de entrada, inicio rango de entrada, final rango de entrada, inicio rango de salida, final rango de salida)
// analogWrite(analogOutPin, outputValue);
//delay(1000);
// configuración de varibles para RTC
DateTime now=RTC.now();
ano = now.year();
mes = now.month();
dia = now.day();
horas = now.hour();
minutos = now.minute();
segundos = now.second();
FECHA = dia + "/" + mes + "/" + ano + " " ;
HORA = horas + ":" + minutos + ":" + segundos;
//////////////////////////////////////////
Nombredelarchivo = dia + mes + ano + ".txt";
/////////////////////////////////////////
// inicio instrucciones para LCD y VL53L0X
// instrucciones para LCD 16x2
lcd.clear();
lcd.print("A10:");
lcd.print(sensorValue);
lcd.setCursor (0,1); // go to start of 2nd line
lcd.print("Dist.: ");
lcd.setCursor (7,1); // go to start of 2nd line
if(type ==2){
float distanceCM = (float) (distance/10.0);
unit ="cm";
lcd.print(distanceCM);
//Serial.print(distanceCM);
//Serial.print(unit);
}else{
unit ="mm";
lcd.print(distance);
//Serial.print(distance);
//Serial.print(unit);
}
lcd.print(unit);
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
//Serial.println();
delay(1000);
// fin instrucciones para LCD y VL53L0X
///////////////////////////////////////
// instrucciones para impresión en tarjeta SD
Imprimir= FECHA + HORA + " " + " " + "Distancia: " + distance + " lectura sensor: " + sensorValue;
File dataFile= SD.open(Nombredelarchivo,FILE_WRITE);
//Si el archivo está disponible, escribir en el:
if (dataFile) {
dataFile.println(Imprimir);
dataFile.close();
Serial.println(Imprimir);
}
//Si el archivo no se puede abrir, imprimir mensaje de error:
else {
Serial.println("Error al intentar escribir en el archivo");
}
delay(500);
}
Un video (25s) por si quieren verlo..
Saludos!