¿Esto es un error o es intencional?
minutos = now.minute()+9;
Saludos
¿Esto es un error o es intencional?
minutos = now.minute()+9;
Saludos
Hola, disculpa la demora en la respuesta, había estado ocupado en otra cosa y no había visto tu respuesta: Es una acción intencional, no debería ir, se me pasó al mostrárselos a ustedes.
Hola, yo de vuelta. Finalmente agregué un ads 1115 para el sensor de presión y pude establecer correctamente la relación presión - fuerza. El problema sigue siendo el sensor de distancia, esta vez estoy usando un adafruit vl6180x , al parecer se comporta mejor que el vl53l0x, pero no tan bien como quisiera. Acá les dejo un Excel foro arduino.zip (44,6 KB)
con los datos si alguien quiere ver los datos en detalle, pero lo más importante lo dejo en este comentario. El sensor fue registrando un aumento de distancia poco a poco desde una medida real base de 100 mm hasta aproximadamente 122 mm, cuando realmente la distancia de aumento fue de 23 mm, el problema es que el registro de los datos sube y baja, y solamente debería subir. Ya me dijeron acá que este sensor no sirve para medir, pero quiero "suavizar" la curva, disminuir el ruido, acá la figura:
Lo que usé fue promediar los tramos, sin darme cuenta y luego de leer me percaté que estaba usando la tecnica de "media movil" que varias veces se ha conversado acá, pero estoy muy confundido en como implementarlo en mi código cada 150 segundos y que a la vez coincida con el valor del registrado del sensor de presión, lo que quiero es que mi código me entregue:
tiempo: 150 ... carga : 225 ...distancia 105
tiempo 300....carga: 358 ... distancia : 105
Deseo que esto sea hecho por arduino, el promedio, y no en excel.
Mi codigo:
#include <Wire.h>
#include <Adafruit_ADS1X15.h>
#include "Adafruit_VL6180X.h"
Adafruit_VL6180X vl = Adafruit_VL6180X();
int salida=0;
// Crear objeto de la clase
Adafruit_ADS1115 ads;
void setup(void)
{
//Serial.begin(9600);
Serial.begin(115200);
delay(200);
// Cambiar factor de escala
ads.setGain(GAIN_ONE);
// Iniciar el ADS1115
ads.begin();
// wait for serial port to open on native usb devices
while (!Serial) {
delay(1);
}
Serial.println("Adafruit VL6180x test!");
if (! vl.begin()) {
Serial.println("Failed to find sensor");
while (1);
}
Serial.println("Sensor found!");
}
void loop(void)
{
// Obtener datos del A0 del ADS1115
short adc0 = ads.readADC_SingleEnded(0);
// función map: (valor de entrada, inicio rango de entrada, final rango de entrada, inicio rango de salida, final rango de salida)
salida=map(adc0,8131,9603,0,4800);
Serial.print("senal: ");
Serial.print(adc0);
Serial.print(" Carga: ");
Serial.print(salida);
float lux = vl.readLux(VL6180X_ALS_GAIN_5);
//Serial.print("Lux: "); Serial.println(lux);
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
if (status == VL6180X_ERROR_NONE) {
Serial.print(" Range: "); Serial.println(range);
}
// Some error occurred, print it out!
if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.println("System error");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.println("ECE failure");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.println("No convergence");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.println("Ignoring range");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.println("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.println("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.println("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.println("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.println("Range reading overflow");
}
delay(10000);
}
Sube los datos loggeados para poder hacer pruebas.
Hola @Surbyte, aquí puedes encontrar los datos en formato txt
adc_6180_1_10000ms.zip (2,1 KB), que corresponden al ads 1115 unido al sensor de presión, donde también participa el sensor de distancia vl6180, datos recogidos a 10.000ms.
senal: señal anologa del sensor de presión con ayuda del adc
carga: relación (lectura analoga-carga real de la maquina) obtenida con función map
range: distancia en mm obtenida con sensor vl6180.
Saludos
edit: aclaración, en la columna "carga" quiero obtener directamente el dato correspondiente a la fila 150s, luego para 300s y así. La idea luego es que cuando obtenga el archivo txt hacer una grafica (post procesado, no con Arduino) carga vs distancia
Gracias, ahora tenemos algo con qué seguirte y ayudarte.
Intenté hacer el codigo pero me dice que la variable "range" no está definida, pero ella corresponde a la lectura del sensor de distancia, me podrías ayudar? crees que con este código puedo lograr lo que planteé en mi intervención anterior? soy pésimo con los ciclos for jajajaj
#include <Wire.h>
#include <Adafruit_ADS1X15.h>
#include "Adafruit_VL6180X.h"
int sum;
int ventana;
Adafruit_VL6180X vl = Adafruit_VL6180X();
int salida=0;
// Crear objeto de la clase
Adafruit_ADS1115 ads;
void setup(void)
{
//Serial.begin(9600);
Serial.begin(115200);
delay(200);
// Cambiar factor de escala
ads.setGain(GAIN_ONE);
// Iniciar el ADS1115
ads.begin();
// wait for serial port to open on native usb devices
while (!Serial) {
delay(1);
}
Serial.println("Adafruit VL6180x test!");
if (! vl.begin()) {
Serial.println("Failed to find sensor");
while (1);
}
Serial.println("Sensor found!");
ventana=15;
Serial.print("ventana: ");
Serial.println( ventana );
for(int i = 0; i < ventana; i++ ){
sum = sum + range(i);
}
promedio = sum/ventana;
Serial.print(" Promedio: ");
Serial.println( sum/ventana );
}
void loop(void)
{
// Obtener datos del A0 del ADS1115
short adc0 = ads.readADC_SingleEnded(0);
// función map: (valor de entrada, inicio rango de entrada, final rango de entrada, inicio rango de salida, final rango de salida)
salida=map(adc0,8131,9603,0,4800);
Serial.print("senal: ");
Serial.print(adc0);
Serial.print(" Carga: ");
Serial.print(salida);
float lux = vl.readLux(VL6180X_ALS_GAIN_5);
//Serial.print("Lux: "); Serial.println(lux);
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
if (status == VL6180X_ERROR_NONE) {
Serial.print(" Range: "); Serial.println(range);
}
// Some error occurred, print it out!
if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.println("System error");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.println("ECE failure");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.println("No convergence");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.println("Ignoring range");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.println("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.println("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.println("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.println("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.println("Range reading overflow");
}
delay(10000);
}
edit: @Surbyte puedo crear un tema especifico en la categoría software para lograr mayor visibilidad sobre este tema en particular del promedio? con el titulo del actual proyecto no alude a mi problema actual. El problema en que me centré mas para este tema fue el sensor de presión, y ese ya fue solucionado con un adc, puedo crear uno para el sensor de distancia? plisss
Buenas tardes comunidad, he estado complicado intentando armar un código que calcule el promedio tramos de valores leídos por un sensor de distancia vl6180x.
Mi sensor de distancia entrega unos resultados, digamos...muy ruidosos, cuando lo grafiqué en Excel
hoja excel foro arduino.zip (44,6 KB)
me di cuenta que si promediaba tramos de datos entregados por el sensor los resultados mejoraban, pueden ver esto en este gráfico.
(es normal que el grafico se vea un aumento de 105 a 120 porque el objetivo a medir se movió 23 mm aprox en 1 hora y pico)
En azul los datos entregados con un delay de 20s, lo que hice en Excel fue promediar tramos cada 150 segundos (linea roja) y así los resultados no son tan ruidosos, quiero hacer eso que hice en excel pero inmediatamente con Arduino. La estructura debería ser:
Resaltar que también hay un sensor de presión trabajando, quiero que para el segundo 150 se imprima el dato del sensor correspondiente al segundo 150 y el promedio de los datos correspondientes de 0 a 150 segundos para el sensor de distancia. Para así luego con post procesado (en excel por ejemplo) crear un gráfico distancia v/s presión (por eso se deben imprimir la misma cantidad de valores para ambos sensores).
Leyendo más, me di cuenta que esto en el mundo de los sensores es bastante estudiado, son filtros, este recibe el nombre a veces de "media movil", hay varios filtros unos más elaborados que otros, intenté unir esos códigos de filtros con el mío sin éxito, esto debería ser más fácil, pero me está costando por la sintaxis a la que no estoy acostumbrado.
Mi código y datos en bruto formato txt.
adc_6180_1_10000ms.zip (2,1 KB)
#include <Wire.h>
#include <Adafruit_ADS1X15.h>
#include "Adafruit_VL6180X.h"
int sum;
int ventana;
Adafruit_VL6180X vl = Adafruit_VL6180X();
int salida=0;
// Crear objeto de la clase
Adafruit_ADS1115 ads;
void setup(void)
{
//Serial.begin(9600);
Serial.begin(115200);
delay(200);
// Cambiar factor de escala
ads.setGain(GAIN_ONE);
// Iniciar el ADS1115
ads.begin();
// wait for serial port to open on native usb devices
while (!Serial) {
delay(1);
}
Serial.println("Adafruit VL6180x test!");
if (! vl.begin()) {
Serial.println("Failed to find sensor");
while (1);
}
Serial.println("Sensor found!");
ventana=15;
Serial.print("ventana: ");
Serial.println( ventana );
for(int i = 0; i < ventana; i++ ){
sum = sum + range(i);
}
promedio = sum/ventana;
Serial.print(" Promedio: ");
Serial.println( sum/ventana );
}
void loop(void)
{
// Obtener datos del A0 del ADS1115
short adc0 = ads.readADC_SingleEnded(0);
// función map: (valor de entrada, inicio rango de entrada, final rango de entrada, inicio rango de salida, final rango de salida)
salida=map(adc0,8131,9603,0,4800);
Serial.print("senal: ");
Serial.print(adc0);
Serial.print(" Carga: ");
Serial.print(salida);
float lux = vl.readLux(VL6180X_ALS_GAIN_5);
//Serial.print("Lux: "); Serial.println(lux);
uint8_t range = vl.readRange();
uint8_t status = vl.readRangeStatus();
if (status == VL6180X_ERROR_NONE) {
Serial.print(" Range: "); Serial.println(range);
}
// Some error occurred, print it out!
if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) {
Serial.println("System error");
}
else if (status == VL6180X_ERROR_ECEFAIL) {
Serial.println("ECE failure");
}
else if (status == VL6180X_ERROR_NOCONVERGE) {
Serial.println("No convergence");
}
else if (status == VL6180X_ERROR_RANGEIGNORE) {
Serial.println("Ignoring range");
}
else if (status == VL6180X_ERROR_SNR) {
Serial.println("Signal/Noise error");
}
else if (status == VL6180X_ERROR_RAWUFLOW) {
Serial.println("Raw reading underflow");
}
else if (status == VL6180X_ERROR_RAWOFLOW) {
Serial.println("Raw reading overflow");
}
else if (status == VL6180X_ERROR_RANGEUFLOW) {
Serial.println("Range reading underflow");
}
else if (status == VL6180X_ERROR_RANGEOFLOW) {
Serial.println("Range reading overflow");
}
delay(10000);
}
De partida no entiendo porqué dice que "range" no está declarado si
uint8_t range = vl.readRange();
corresponde a la lectura del sensor de distancia.
Sería de enorme ayuda sus consejos o propuestas de codigos. Saludos
En el setup() tienes
for(int i = 0; i < ventana; i++ ){
sum = sum + range(i);
}
pero el array range no está definido.
Saludos
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.