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 ==
// finaliza seteos
{
digitalWrite(4, LOW);//D.V.
} // fin if (parada ==
// finaliza seteos
//delay(10); //evito esta parada de la tarjeta con el millis
} // del if (millis() > TiempoAhora)
} // DEL VOID LOOP