TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jonathanPIC888 en 22 de Junio de 2023, 11:25:42

Título: Control de nivel de líquidos - Consulta de implementación
Publicado por: jonathanPIC888 en 22 de Junio de 2023, 11:25:42
Buen día estimados, tengo el siguiente circuito:

(https://i.ibb.co/XJB5bvP/circuito.png) (https://imgbb.com/)

El mismo es un resumen de un circuito más complejo, donde se obtiene una señal de voltaje variable, en función del nivel de agua en un tanque.

Si el interruptor  A - genera el voltaje que denominaremos V1 correspondiente al 25%.
                         B - genera el voltaje que denominaremos V2 correspondiente al 50%.
                         C - genera el voltaje que denominaremos V3 correspondiente al 75%.
                         D - genera el voltaje que denominaremos V4 correspondiente al 100%.

Mi consulta 1 es la siguiente:

Quiero saber como podría implementar una función en C, para el siguiente caso:

Si el interruptor A,B,C o D se cierra, independientemente de cuál lo haga primero tendría que obtener un valor del 25% de la función.
Si por ejemplo A y B o C y D o cualquier combinación de 2 interruptores se cierra, obtener un valor del 50% de la función.
Si por ejemplo cualquier grupo de interruptores se cierra, obtener un 75% de la función.
Si los 4 interruptores se cierran, obtener el 100% de la función.

Mi implementación funciona solo en manera ascendente:

Si A se cierra -> 25%
Si A+B se cierra -> 50%
Si A+B+C se cierra -> 75%
Si A+B+C+D se cierra -> 100%

Consulta 2:

Teniendo en cuenta el circuito, como se podría calcular el arreglo de divisores de tensión para obtener la relación de voltaje lo más diferenciada posible
según el interruptor deseado.
Para explicarlo de otra manera, en vez de tener saltos de 500mV....o 300mV....como poder tener una escala de aprox 1.2...o 1.5v entre saltos.

Saludos y espero puedan entender mi consulta.


Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: AleSergi en 22 de Junio de 2023, 12:31:02
Yo haría así, es UNA solución, seguro hay otras mejores o peores...

A cada interruptor A, B, C, D, de hago corresponder las variables a, b, c, d, que solo toman valor 0 ó 1, abierto/cerrado respectivamente.

Sumo las cuatro variables, y obtendria, 0, 1, 2, 3, ó 4
Con esos valores le voy a una elección múltiple, (case), y asigno el porcentaje que corresponda.

La segunda pregunta te la debo, hay que agarrar la calculadora, pero fijate en la imagen, corresponde a un circuito arduinero llamado KeyPad Shield, donde leen cinco pulsadores con una línea del ADC, como planteas,  podrías empezar con esos valores..
(https://europe1.discourse-cdn.com/arduino/original/4X/c/c/3/cc3c7642f0105f301ff225a2ab1723443a714b28.png)

No pensaste en usar una inductancia variable, en función del nivel, se genera una frecuencia con un circuito en el que participa esta reactancia, se mide la frecuencia, y se le hace corresponde a distintos niveles, ahora, la variable, puede ser continua, y no discreta de solo cinco punto.
Las ultimas generaciones de lavarropas emplean éste mecanismo que indico, para ser muy finos con el nivel de agua.
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: DominusDRR en 22 de Junio de 2023, 13:01:56
Buen día estimados, tengo el siguiente circuito:

(https://i.ibb.co/XJB5bvP/circuito.png) (https://imgbb.com/)

El mismo es un resumen de un circuito más complejo, donde se obtiene una señal de voltaje variable, en función del nivel de agua en un tanque.

Si el interruptor  A - genera el voltaje que denominaremos V1 correspondiente al 25%.
                         B - genera el voltaje que denominaremos V2 correspondiente al 50%.
                         C - genera el voltaje que denominaremos V3 correspondiente al 75%.
                         D - genera el voltaje que denominaremos V4 correspondiente al 100%.

Mi consulta 1 es la siguiente:

Quiero saber como podría implementar una función en C, para el siguiente caso:

Si el interruptor A,B,C o D se cierra, independientemente de cuál lo haga primero tendría que obtener un valor del 25% de la función.
Si por ejemplo A y B o C y D o cualquier combinación de 2 interruptores se cierra, obtener un valor del 50% de la función.
Si por ejemplo cualquier grupo de interruptores se cierra, obtener un 75% de la función.
Si los 4 interruptores se cierran, obtener el 100% de la función.

Mi implementación funciona solo en manera ascendente:

Si A se cierra -> 25%
Si A+B se cierra -> 50%
Si A+B+C se cierra -> 75%
Si A+B+C+D se cierra -> 100%

Consulta 2:

Teniendo en cuenta el circuito, como se podría calcular el arreglo de divisores de tensión para obtener la relación de voltaje lo más diferenciada posible
según el interruptor deseado.
Para explicarlo de otra manera, en vez de tener saltos de 500mV....o 300mV....como poder tener una escala de aprox 1.2...o 1.5v entre saltos.

Saludos y espero puedan entender mi consulta.

Pregunta

¿Por qué no conectas directamente cada interruptor a terminales o pines del microcontrolador y te olvidas del ADC? ¿Es tu microcontrolador muy pequeño?
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: DominusDRR en 22 de Junio de 2023, 13:07:59
Tal vez tu arreglo de resistencias debería ser así:

(https://pbs.twimg.com/media/FzPTwOqWYAYXWxa?format=png&name=small)
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: jonathanPIC888 en 22 de Junio de 2023, 13:13:18
Estimado AleSergi,

Citar
A cada interruptor A, B, C, D, de hago corresponder las variables a, b, c, d, que solo toman valor 0 ó 1, abierto/cerrado respectivamente.

Sumo las cuatro variables, y obtendria, 0, 1, 2, 3, ó 4
Con esos valores le voy a una elección múltiple, (case), y asigno el porcentaje que corresponda.

Lo que pasa es que acá solo se lee una señal, lo que podría ir haciendo, se me ocurre, es con el valor que leo en analógico, relacionarlo con un arreglo de porcentajes. Algo similar a esto:

Código: [Seleccionar]
// Lee el nivel de batería.
  int nVoltageRaw = analogRead(A0);
  float fVoltage = (float)nVoltageRaw * 0.01024;

  float fVoltageMatrix[22][2] = {
    {4.2,  100},
    {4.15, 95},
    {4.11, 90},
    {4.08, 85},
    {4.02, 80},
    {3.98, 75},
    {3.95, 70},
    {3.91, 65},
    {3.87, 60},
    {3.85, 55},
    {3.84, 50},
    {3.82, 45},
    {3.80, 40},
    {3.79, 35},
    {3.77, 30},
    {3.75, 25},
    {3.73, 20},
    {3.71, 15},
    {3.69, 10},
    {3.61, 5},
    {3.27, 0},
    {0, 0}
  };

  int i, perc;

  perc = 100;

  // Procesa el porcentaje del nivel de batería.
  for(i=22; i>=0; i--) {
    if(fVoltageMatrix[i][0] >= fVoltage) {
      perc = fVoltageMatrix[i + 1][1];
      break;
    }
  }

Citar
No pensaste en usar una inductancia variable, en función del nivel, se genera una frecuencia con un circuito en el que participa esta reactancia, se mide la frecuencia, y se le hace corresponde a distintos niveles, ahora, la variable, puede ser continua, y no discreta de solo cinco punto.
Las ultimas generaciones de lavarropas emplean éste mecanismo que indico, para ser muy finos con el nivel de agua.

Desconozco como funciona ese mecanismo. Acá el problema es que el sensor ya está colocado y es muy simple (alambres a diferentes niveles), lo que yo trato de hacer es un transmisor de nivel, basándome en lo que ya está conectado.
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: jonathanPIC888 en 22 de Junio de 2023, 13:18:38
Citar
¿Por qué no conectas directamente cada interruptor a terminales o pines del microcontrolador y te olvidas del ADC? ¿Es tu microcontrolador muy pequeño?

En el diseño original está así, una entrada por señal. Pero ahora se está rediseñando la placa para ahorrar espacio y costo.

Citar
Tal vez tu arreglo de resistencias debería ser así:

Para estudiar el arreglo de las resistencias, voy a estudiar este apunte:
https://users.exa.unicen.edu.ar/catedras/edigital/teorias/c11_conversores_ad-da.pdf (https://users.exa.unicen.edu.ar/catedras/edigital/teorias/c11_conversores_ad-da.pdf)
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: DominusDRR en 22 de Junio de 2023, 13:24:46
En el diseño original está así, una entrada por señal. Pero ahora se está rediseñando la placa para ahorrar espacio y costo.

Si estás rediseñando, deberías aprovechar para hacerlo más simple. Ese tipo de medición con resistencias, suele tener problemas como ruido eléctrico, cambio de los valores de las resistencia con el tiempo o cambios de temperatura, sobre todo cuando está muy lejos entre los interruptores y el microcontrolador.

Debe ir de la mano de un filtro para eliminar el ruido.

Si es algo didáctico, tal vez no sea necesario.



En mi caso los "interruptores" son salidas de amplificadores operacionales, por lo que tendrían que estar si o si colocados a través de una resistencia a la red de división de tensión.

Si las salidas son amplificadores operaciones, podrían ir todas esas salidas a un sumador con otro amplificador operacional y en el mismo un filtro para alminar el ruido.

Tal vez deberías compartir el circuito verdadero para analizarlo de mejor manera.



Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: jonathanPIC888 en 22 de Junio de 2023, 13:34:04
Para darle un poco más de claridad a lo que quiero hacer, este sería el circuito que se está implementando.
(https://i.ibb.co/9g46qBw/circuito.png) (https://ibb.co/r0pYZqb)

Todo el circuito funciona ok hace ya un par de años, sin problema de ruido o falsas lecturas. Lo que se está ensayando es la red de división de tensión y la lógica para procesar el nivel.
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: DominusDRR en 22 de Junio de 2023, 13:44:49
Para darle un poco más de claridad a lo que quiero hacer, este sería el circuito que se está implementando.
(https://i.ibb.co/9g46qBw/circuito.png) (https://ibb.co/r0pYZqb)

Todo el circuito funciona ok hace ya un par de años, sin problema de ruido o falsas lecturas. Lo que se está ensayando es la red de división de tensión y la lógica para procesar el nivel.

Si, ahora se comprende, y ese circuito si posee un filtro con el último operacional.

Respecto a tu pregunta, si deseas mantener el mismo circuito original o uno parecido, es decir analógica la salida final, el análisis para resolver la consulta 1 puede ser un poco complejo y creo que tomaría algo de tiempo.

Sigo pensando que las salidas de los operacionales deberían ir directamente a entradas del microcontrolador, al menos que no poseas más entradas disponibles.
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: jonathanPIC888 en 22 de Junio de 2023, 13:57:39
Citar
Si, ahora se comprende, y ese circuito si posee un filtro con el último operacional.

Respecto a tu pregunta, si deseas mantener el mismo circuito original o uno parecido, es decir analógica la salida final, el análisis para resolver la consulta 1 puede ser un poco complejo y creo que tomaría algo de tiempo.

Sigo pensando que las salidas de los operacionales deberían ir directamente a entradas del microcontrolador, al menos que no poseas más entradas disponibles.

Es necesario mantener el circuito original, porque está funcionando bien, pero necesito que la salida sea analógica. Tengo solo 1 entrada analógica disponible de mi microcontrolador.

Citar
el análisis para resolver la consulta 1 puede ser un poco complejo y creo que tomaría algo de tiempo.

En mi cabeza creo tenerlo más o menos resuelto, tengo que escribir código y hacer pruebas.
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: DominusDRR en 22 de Junio de 2023, 13:58:18
Podrías simular tu circuito para determinar que voltaje obtienes con las combinaciones mencionadas, pero tu primer circuito con interruptores, creo que está mal, ya que cuando un interruptor no está presionado, la salida del operacional está en 0 lógico, es decir está conectada a tierra.

A la izquierda de la siguiente imagen, puse un circuito equivalente.

(https://pbs.twimg.com/media/FzPe4opXoAA8VDK?format=png&name=large)
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: jonathanPIC888 en 22 de Junio de 2023, 14:02:53
Citar
Podrías simular tu circuito para determinar que voltaje obtienes con las combinaciones mencionadas, pero tu primer circuito con interruptores, creo que está mal, ya que cuando un interruptor no está presionado, la salida del operacional está en 0 lógico, es decir está conectada a tierra.

Cierto, me olvidé que tenían que estar a tierra cuando estaban abiertos.

Voy a hacer algunas simulaciones y pruebas y les comento mis resultados.
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: Eduardo2 en 22 de Junio de 2023, 14:05:10
Para la Consulta1 tenés que armar una tabla con los límites de voltaje y rango para cada caso.
Los limites no son los valores del ADC sino un valor intermedio entre dos situaciones

Ojo porque diferentes combinaciones de switchs te pueden dar voltajes muy parecidos, como consecuencia no serán combinaciones confiables.


Algo asi:
Código: [Seleccionar]
// los límite deben estar en orden ascendente
const int8 limites[] = {0 , 24 , 45 , 130 ,...} ; 

// los rangos deben corresponderse con cada límite
const int8 rango[] =   {25 , 50 , 35 , 12 , 84 ,...} ; 

Código: [Seleccionar]
int LeoSwitchs(void){       
    int k ;
   
    voltaje = ADC_Read() ;                       // Lee el voltaje
       
    for(k=Nestados; voltaje < limites[k] ;k--);  // Se detiene cuando el voltaje
                                                 // está entre dos de la tabla
   
    return rango[k] ;
}
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: DominusDRR en 22 de Junio de 2023, 14:06:22
Pues creo que deberías usar otro diseño, ya que si la salida 1 y 2 están activas (izquierda), el voltaje es 0.441V, mientras que si las salidas 3 y 4 están activas, el voltaje es 2.647.

Y según lo que mencionaste, al estar activas dos de las 4 salidas (cualquiera), el voltaje debería ser el mismo.25% (O eso entendí)

(https://pbs.twimg.com/media/FzPgmHKWcAIc74k?format=png&name=large)
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: jonathanPIC888 en 22 de Junio de 2023, 15:23:21
Esta sería la tabla de referencia que voy a usar.

(https://i.ibb.co/D40GGMV/Sin-t-tulo.png) (https://imgbb.com/)

Ahora tengo que agarrar la simulación y ver que valores obtengo. Luego agarrar el circuito real y comparar.
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: jonathanPIC888 en 22 de Junio de 2023, 18:25:22
Datos obtenidos luego de las pruebas y mediciones.

(https://i.ibb.co/SVQBgt2/Sin-t-tulo.png) (https://ibb.co/3Sfcbpw)

Ahora queda hacer unas pruebas de código y ver que pasa.

El circuito final que estoy usando es este.

(https://i.ibb.co/1XGC4Wc/2.png) (https://ibb.co/xgqnrTZ)
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: DominusDRR en 22 de Junio de 2023, 18:39:46
Datos obtenidos luego de las pruebas y mediciones.

(https://i.ibb.co/SVQBgt2/Sin-t-tulo.png) (https://ibb.co/3Sfcbpw)

Ahora queda hacer unas pruebas de código y ver que pasa.

El circuito final que estoy usando es este.

(https://i.ibb.co/1XGC4Wc/2.png) (https://ibb.co/xgqnrTZ)

no creo que sea necesario que conviertas a float el valor del ADC, es decir podrías trabajar en valor entero, pero independiente del formato usado, no deberías hacer un pseudocódigo así aproximadamente:

Código: C
  1. switch (analogRead(A0));
  2. {
  3.     case 1.24V: accion1(); break;
  4.     case 2.47V: accuin2(); break;
  5.     etc.
  6. }

Ya que es un circuito analógico, y las resistencias y fuentes de voltaje no son exactas, el pseudocódigo sería así:

Código: C
  1. if (analogRead(A0) > (1.24 - 10%) && analogRead(A0) < (1.24 -10%)) {accion1();}
  2. else if (analogRead(A0) > (2.47 - 10%) && analogRead(A0) < (2.47 -10%)) {accion1();}
  3. etc.

El porcentaje que puse (10%) fue un ejemplo, deberías determinar que valor es el adecuado, sin que te pases al valor anterior o superior.


Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: Robert76 en 22 de Junio de 2023, 18:50:17
Pues creo que deberías usar otro diseño, ya que si la salida 1 y 2 están activas (izquierda), el voltaje es 0.441V, mientras que si las salidas 3 y 4 están activas, el voltaje es 2.647.

Y según lo que mencionaste, al estar activas dos de las 4 salidas (cualquiera), el voltaje debería ser el mismo.25% (O eso entendí)

(https://pbs.twimg.com/media/FzPgmHKWcAIc74k?format=png&name=large)
Al tratarse de un nivel de varillas, sólo pueden darse las condiciones 1, 1-2, 1-2-3 y 1-2-3-4, si consideramos que el nivel mínimo arranca por el 1.
Por lo tanto, la condición 3 y 4 solamente, jamás pordrían darse.
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: Robert76 en 22 de Junio de 2023, 18:53:43
Datos obtenidos luego de las pruebas y mediciones.

(https://i.ibb.co/SVQBgt2/Sin-t-tulo.png) (https://ibb.co/3Sfcbpw)

Ahora queda hacer unas pruebas de código y ver que pasa.

El circuito final que estoy usando es este.

(https://i.ibb.co/1XGC4Wc/2.png) (https://ibb.co/xgqnrTZ)
En tu tabla, hay condiciones que jamás podrían darse, ya que estamos hablando de niveles por varilla.
Tendrás en el caso mínimo, ningún sensor actuado, y en máximo estarán todos actuados, por lo tanto las condiciones serán empezando por mínimo:   0001, 0011, 0111 y 1111, tendrás sólo cuatro estados posibles, o al menos eso comprendí de tu sistema de detección.
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: DominusDRR en 22 de Junio de 2023, 19:11:47
Pues creo que deberías usar otro diseño, ya que si la salida 1 y 2 están activas (izquierda), el voltaje es 0.441V, mientras que si las salidas 3 y 4 están activas, el voltaje es 2.647.

Y según lo que mencionaste, al estar activas dos de las 4 salidas (cualquiera), el voltaje debería ser el mismo.25% (O eso entendí)

(https://pbs.twimg.com/media/FzPgmHKWcAIc74k?format=png&name=large)
Al tratarse de un nivel de varillas, sólo pueden darse las condiciones 1, 1-2, 1-2-3 y 1-2-3-4, si consideramos que el nivel mínimo arranca por el 1.
Por lo tanto, la condición 3 y 4 solamente, jamás pordrían darse.

Ojalá sea así, ya que según entendí (tal vez mal) al OP , si existe dicha posibilidad.
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: jonathanPIC888 en 22 de Junio de 2023, 19:18:17
Datos obtenidos luego de las pruebas y mediciones.

(https://i.ibb.co/SVQBgt2/Sin-t-tulo.png) (https://ibb.co/3Sfcbpw)

Ahora queda hacer unas pruebas de código y ver que pasa.

El circuito final que estoy usando es este.

(https://i.ibb.co/1XGC4Wc/2.png) (https://ibb.co/xgqnrTZ)
En tu tabla, hay condiciones que jamás podrían darse, ya que estamos hablando de niveles por varilla.
Tendrás en el caso mínimo, ningún sensor actuado, y en máximo estarán todos actuados, por lo tanto las condiciones serán empezando por mínimo:   0001, 0011, 0111 y 1111, tendrás sólo cuatro estados posibles, o al menos eso comprendí de tu sistema de detección.

Esta parte no me expliqué del todo bien. El problema es que el transmisor a veces lo conectan mal. Donde va la varilla 1 de medición (25%) conectan la varilla 2 (50%) o la varilla 3 donde va la 4. Entonces es necesario contemplar ese posible error de manera electrónica
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: jonathanPIC888 en 22 de Junio de 2023, 19:51:15
Les dejo el código que usé y funciona ok en todos los casos que plantee al principio.

Código: [Seleccionar]
void setup() {
Serial.begin(9600);
}


void loop() {

  // Lee el nivel de agua.
  int nVoltageRaw = analogRead(A0);
  float fVoltage = (float)nVoltageRaw/1023*5.0;
  Serial.println(fVoltage);
  delay(500);

  if (fVoltage <=0) {Serial.println("0%");}
  if (fVoltage > 1.116 && fVoltage < 1.5) {Serial.println("25%");}
   else if (fVoltage > 2.21 && fVoltage < 2.7) {Serial.println("50%");}
   else if (fVoltage > 3.33 && fVoltage < 4.07) {Serial.println("75%");}
   else if (fVoltage > 4.44 && fVoltage < 5.43) {Serial.println("100%");}
}

El código sale del ejemplo que me dió DominusDRR

Muchas gracias a todos por su ayuda !
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: Robert76 en 22 de Junio de 2023, 21:15:18
Dudo que el sistema pueda detectar, si una varilla está mal conectada. Creo y me parece coherente que debe conectarse como corresponde, ya que no hay nada redundante que detecte un error de manipulación. Tienes que asegurarte de manera mecánica, que las varillas se conectan correctamente, por ejem. utilizando algún conector que evite ser insertado al revés, o bien utilizar varillas de diferente diámetro para evitar ser conectadas en un terminal que no coincide.
Título: Re:Control de nivel de líquidos - Consulta de implementación
Publicado por: jonathanPIC888 en 22 de Junio de 2023, 21:42:07
Citar
Dudo que el sistema pueda detectar, si una varilla está mal conectada. Creo y me parece coherente que debe conectarse como corresponde, ya que no hay nada redundante que detecte un error de manipulación. Tienes que asegurarte de manera mecánica, que las varillas se conectan correctamente, por ejem. utilizando algún conector que evite ser insertado al revés, o bien utilizar varillas de diferente diámetro para evitar ser conectadas en un terminal que no coincide.

Acá la idea no es detectar si la varilla está bien puesta, porque está fija en la tapa, no hay manera de cambiarla de posición. Lo que conectan mal es el cableado del transmisor, pero con las pruebas que hice hoy ya pude sacarlo funcionando. Ahora hay que ver como funciona en campo nomás.