Bienvenido, Invitado
Nombre de Usuario: Contraseña: Recordarme
  • Página:
  • 1
  • 2

TEMA:

problema con mi ADS 1115 3 años 2 meses antes #2219

Cordial saludo, tengo un proyecto donde utilizo arduino Nano y ADS1115, tomo lecturas de un transductor de presion, los parametros iniciales en 300psi y en 700 psi se reconoce sin problema y en escritorio funciona bien, pero al momento de ejecutarlo en la maquina para que me encienda un led a una presion seteada segun el proceso (por ejemplo 900 psi) este me avisa en otro punto (como puede ser en 600 psi) y me toca modificar sin ninguna coherencia los parametros iniciales para lograr el punto aproximado de aviso. Si cambio a otro proceso donde la presion de aviso requerida sea otra (por ejemplo 1100 psi) me avisa a otras psi (puede ser a 950 psi) y debo empezar a aproximar los parametos iniciales nuevamente para que se acerque al valor de aviso requerido, no siempre debe ser a los 900psi , depende del proceso que se tenga y de la maquina a la que lo conecte.

Mi proyecto funciona bien en el escritorio, el codigo no presenta errores y con una bomba manual me reacciona bien, pero en las maquinas que he probado me sucede lo mismo sin ningun patron de desvio, he cambiado de arduino y de ADS por nuevos y no se soluciona, uds me pueden guiar?

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

problema con mi ADS 1115 3 años 2 meses antes #2220

Podrias subir el codigo para ver lo que estas haciendo?

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

problema con mi ADS 1115 3 años 2 meses antes #2221

Gracias Jose Luis, mi rutina captura por conexion de cable de red una variable (a, b, c, x, z) y dependiendo busca la rutina, cuando le doy 'x' me envia datos del transductor y los veo bien en el pc (aplicacion de visual basic), los puedo capturar sin problema para el seteo inicial (en 300 psi , en 600psi, en 1000psi, ...) preo al decirle 'a_####' el toma la letra 'a' para saber que empieza el proceso y el #### que le acompaña es valor al cual debe bloquear. Si es coherente matematicamente (lo compare con calculadora, con seguidores en el pc e inclusive con excel, pero no para en ese punto, es como si el seteo no sirviera y debo modificar manualmente esos datos de seteo iniciales y eso me tiene el proyecto varado; adiciona tengo duda con el delay que va al final del codigo, pues en todos las consultas que he revisado en internet esta puesto, porque debe ir? no se hasta que punto sea beneficioso pues eso detiene el arduino y ese "tiempo muerto" puede hacer que se pase del punto limite detectado?, adjunto mi codigo, agradezco una luz (pues no soy muy conocedor de programacion y no puedo hacer que funcione correctamente):


// ****** comunicacion ethernet ************
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

IPAddress my_ip(192, 168, 1, 72);
IPAddress ip_client(192, 168, 1, 103);
// byte my_mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte my_mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xD1, 0x4B }; //????
// byte my_mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x3A, 0xDC }; //???
unsigned int localPort = 2000;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];

EthernetUDP Udp;

char ReplyBuffer[] = "repite";
String inputString = "";
boolean stringComplete = false;
char inChar;
String recibido;
String u;

// ****** FIN comunicacion ethernet ************

String dato = "";
String dato_b;//primer caracter recibido
String dato_c;//resto de caracteres recibido
int dato_a;//numero recibido

String bandera_temp = "";

unsigned long TiempoAhora = 0;


//=========== SENSOR INDUCT 12-24VDC ================
// arduino --> SENSOR
// pin 2 --> OUT A (BLACK)
// + 12-24 VDC (BROWN)
// - VDC (GND / BLUE)

const byte encoderPinA = 2;//outputPinA Encoder digital pin2
// volatile uint32_t count;
int bandera_vueltas=0;
//=========== FIN SENSOR INDUCT 12-24VDC ================

const int azul =14; // led strat (PIN A0)
const int rojo = 15; // led stop (PIN A1)
const int verde =16; //led end (PIN A2)
int parada; //seleccion del case




//============= ADS 1115 ======================================
//link microcontrollerslab.com/ads1115-external-adc-with-esp32/
#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads;
// ESQUEMA CONEXION DEL CONVERTIDOR ANALOGO / DIGITAL
///
// ADS1115 ARDUINO UNO Transductor
// V --- 5V
// G --- negativo
// SCL --- A5
// SDA --- A4
// ADDR --- negativo
// ALERT ---
// A0 --- RECIBE 4-20mA
// A1 ---
// A2 ---
// A3 ---
int32_t adc0, adc1, adc2, adc3;//maximo valor 2 a la 32 (4,294,967,296)
// int16_t adc0, adc1, adc2, adc3; //maximo valor 2 a la 15 (32.767)
String voltaje_adc0; //float voltaje_adc0 = 0.0;//test
// ============= FIN ADS 1115 =================================


void setup()
{
Serial.begin(9600);

Serial.println("ok");

// ****** comunicacion ethernet ************
Ethernet.begin(my_mac, my_ip);
Udp.begin(localPort);
inputString.reserve(200);
// ****** comunicacion ethernet ************

Serial.println("setup 34 listo!!");
Serial.println("ok");

Serial.println("pin 5 input");

//******** señales seguidores del estado actual *****************
pinMode(4, OUTPUT);//señal para la DUMP VALVE
digitalWrite(4, LOW); }

Serial.println("pin 4 low");
//*****************************************************

// //******** señales seguidores del estado actual *****************
// pines de los LEDS, habilito estos pines analogicos como digitales
pinMode (azul, OUTPUT); //pin del led verde
pinMode (rojo, OUTPUT); //pin del led Amarillo
pinMode (verde, OUTPUT);//pin del led rojo

digitalWrite(azul, LOW); digitalWrite(rojo, LOW); digitalWrite(verde, LOW);
//*****************************************************

parada = 0;

//=========== ADS 1115 ================
// ADS1015 ADS1115
//

ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default)
ads.begin();
//=========== FIN ADS 1115 ===========

Serial.print("parada inicial = "); Serial.println(parada);

TiempoAhora = 0; //para reinicio

} // DEL VOID SETUP


void loop()
{

if (millis() > TiempoAhora)
{
TiempoAhora = 30 + millis();

// ============= IP y puerto del PC ================
int packetSize = Udp.parsePacket();
if (packetSize)
{
Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
dato = packetBuffer; //lo que llega por el ethernet
String recibido = dato.substring(0,packetSize); // paquete sin acumulado
Serial.print(" info recibido "); Serial.println(recibido);//test

dato_b = recibido.substring(0,1); //leo el primer caracter

if ((digitalRead(azul)== LOW) && (dato_b =="a")) // "a_######"
{
parada=1; // APRUEBA EL ENVIO DE DATOSnicio
dato_c = recibido.substring(2,recibido.length()); //capturo el ###
// Serial.print("string --> "); Serial.println(dato_c); //test
dato_a = dato_c.toInt(); // convierto ### en entero
// Serial.print("int --> "); Serial.println(dato_a);
bandera_temp = "";
} // del ((digitalRead(azul)== LOW) && (dato_b =="a"))
//===== FIN boton 1 inicio lecturas ======================


//===== boton 2 termina el tubo ======================
if ((digitalRead(rojo)== LOW) && (dato_b =="b")) // parar
{
parada=2;
}

//===== boton 3 final total ======================
if ((digitalRead(verde)== LOW) && (dato_b =="c")) // fin job
{
parada=3; // APRUEBA EL ENVIO DE DATOS
}


//===== ABRE LA VALVE ======================
if (dato_b =="d") // off valve
{
parada=4;
}

//===== CIERRA LA VALVE ======================
if (dato_b =="e") // on valve
{
parada=5;
}


//===== TOMA DE DATOS PARA CALIBRACION ===================
if (dato_b =="x") // set transd
{
digitalWrite(azul, LOW);
digitalWrite(rojo, LOW);
digitalWrite(verde, LOW);
parada=6;
} // del if (dato_b =="x")

if (dato_b =="z") // salir de seteos
{
digitalWrite(azul, LOW);
digitalWrite(rojo, LOW);
digitalWrite(verde, LOW);
parada=8;
} // del if (dato_b =="z")

//===== FIN TOMA DE DATOS PARA CALIBRACION ======================


} // DEl if (packetSize)


if (parada == 1) // start
{
digitalWrite(azul, HIGH);
digitalWrite(rojo, LOW);
digitalWrite(verde, LOW);

//============ ADS 1115 ==============
adc0 = ads.readADC_SingleEnded(0); // lee ADS 1115
Serial.println("lee adc = " + String(adc0) + " ; tiempo mllis " + String(TiempoAhora));
//============ ADS 1115 ==============

if ((adc0 < dato_a))
{
digitalWrite(4, LOW);//D.V.

// ============= IP y puerto del PC ================
Serial.print("T_" + String(adc0));
Serial.println(" "); //en caso de enviar doble string
u="T_" + String(adc0);
Udp.beginPacket(ip_client, localPort);
Udp.print(u);
Serial.println(u);
Udp.endPacket();
}

if ((adc0 == dato_a))
{
digitalWrite(4, HIGH);//D.V.

// ============= IP y puerto del PC ================
// Serial.print("dato a limit --> "); Serial.println(dato_a);
Serial.print("T_" + String(adc0));
Serial.println(" "); //en caso de enviar doble string

u="T_" + String(adc0);
Udp.beginPacket(ip_client, localPort);
Udp.print(u);
Serial.println(u);
Udp.endPacket();

parada = 2;

u="ok vr= " + String(adc0) + + " ; tiempo mllis " + String(TiempoAhora) ;
Udp.beginPacket(ip_client, localPort);
Udp.print(u);
Serial.print("v/r adc "); Serial.println(adc0);
Serial.print("en Parada 1 '=' "); Serial.println(u);
Udp.endPacket();

bandera_temp = "igual";
// ============= FIN IP y puerto del PC ================
} // if ((adc0 == dato_a))

if ((adc0 > dato_a))
{
digitalWrite(4, HIGH);//D.V.

// ============= IP y puerto del PC ================
Serial.println("ok ");//de la libreria

parada = 2;

u="ok vr= " + String(adc0) + + " ; tiempo mllis " + String(TiempoAhora) ;
Udp.beginPacket(ip_client, localPort);
Udp.print(u);
Serial.print("v/r adc "); Serial.println(adc0);
Serial.print("en Parada 1 '>' "); Serial.println(u);
Udp.endPacket();

bandera_temp = "mayor";
// ============= FIN IP y puerto del PC ================

} // if ((adc0 >= dato_a))
} // fin if (parada == 1) // torquear


if ((digitalRead(rojo)== LOW) && (parada == 2)) // para de torquear (solo una vez)
{
digitalWrite(4, HIGH);//D.V.
digitalWrite(azul, LOW);
digitalWrite(rojo, HIGH);
digitalWrite(verde, LOW);

if (bandera_temp == "igual")
{
Serial.println(" ok desde igual");
bandera_temp = "";
}

if (bandera_temp == "mayor")
{
Serial.println(" ok desde mayor");
bandera_temp = "";
}

// ============= IP y puerto del PC ================
Serial.println("finaliza envio DATO");

u="finaliza send datos";
Udp.beginPacket(ip_client, localPort);
Udp.print(u);
Serial.print("v/r adc "); Serial.println(adc0);
Serial.print("en Parada 2 "); Serial.println(u);
Udp.endPacket();
// ============= FIN IP y puerto del PC ================

} // fin if (parada == 2) // parar de torquear


if ((parada == 3)) // fin job
{
digitalWrite(azul, LOW);
digitalWrite(rojo, LOW);
digitalWrite(verde, HIGH);
digitalWrite(4, LOW);//D.V.
Serial.println("en el parada 3 ");
while( (digitalRead(verde)== HIGH) ) //parada == 3)
{
//se anida aca hasta reiniciar el sistema -- para no seguir torqueando
}
} // fin if (parada == 3) // fin job

if (parada == 4) // off dump valve
{
digitalWrite(azul, LOW);
digitalWrite(rojo, LOW);
digitalWrite(verde, LOW);
digitalWrite(4, LOW);//D.V.
Serial.println("D.V. LOW ");
} // fin if (parada == 4) // off dump valve


if (parada == 5) // on valve
{
digitalWrite(azul, LOW);
digitalWrite(rojo, HIGH);
digitalWrite(verde, LOW);
digitalWrite(4, HIGH);//D.V.
Serial.println("D.V. HIGH ");
}


if (parada == 6) // set transd
{
digitalWrite(4, LOW);//D.V.

//============ ADS 1115 ==============
adc0 = ads.readADC_SingleEnded(0); // lee ADS 1115
//============ ADS 1115 ==============

// ============= IP y puerto del PC ================
Serial.print("T_");Serial.print(adc0);
Serial.println(" ");//en caso de enviar doble string
u="T_" + String(adc0) + " ";
Udp.beginPacket(ip_client, localPort);
Udp.print(u);
Serial.println(u);
Udp.endPacket();
// ============= FIN IP y puerto del PC ================
} // fin if (parada == 6) // set transd

if (parada == 8) // finaliza seteos
{
digitalWrite(4, LOW);//D.V.
} // fin if (parada == 8) // finaliza seteos

//delay(10); //evito esta parada de la tarjeta con el millis

} // del if (millis() > TiempoAhora)
} // DEL VOID LOOP

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

problema con mi ADS 1115 3 años 2 meses antes #2222

Entonces, si te he entendido bien, cuando pruebas el programa en el escritorio funciona bien, pero cuando lo pruebas en la maquina es cuando encuentras problemas.
Te has parado a pensar que el problema no sea de programacion y la diferencia este en el ruido electrico que vas tener en la entrada de la linea de captura cuando estas en un ambiente industrial?
Seguramente lo que estas capturando es ruido electrico, por eso tienes los problemas descritos.
Si tienes un osciloscopio, yo miraria la entrada al ads1115 a ver si presenta ruido. Yo creo que lo vas tener. tendras que intentar filtrarlo.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

problema con mi ADS 1115 3 años 2 meses antes #2223

entendido, voy a revisar el tema del ruido electrico, claro que lo unico que hay de corriente es el arduino, la valvula de bloqueo y el transductor pues la maquina es netamente hidraulica que la mueve un motor diesel (una bomba hidraulica y mangueras); en el escritorio cuando pruebo lo hago con una bomba hidraulica manual y me funciona super, por eso me parece poco logico la presencia de esas fallas.

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

problema con mi ADS 1115 3 años 2 meses antes #2224

en cuando al delay que veo que ponen en todos los programas que usan el ADS1115, para que se requiere? y debe ser de cuanto como minimo?

Por favor, Identificarse o Crear cuenta para unirse a la conversación.

  • Página:
  • 1
  • 2
Tiempo de carga de la página: 0.107 segundos
Gracias a Foro Kunena