Determinaci贸n de la densidad del gas a partir de los resultados de medici贸n de presi贸n y temperatura con sensores Arduino

Introduccion


La tarea de medir los par谩metros de una mezcla de gases est谩 muy extendida en la industria y el comercio. El problema de obtener informaci贸n confiable al medir los par谩metros del estado del medio gaseoso y sus caracter铆sticas utilizando medios t茅cnicos se resuelve mediante los procedimientos de medici贸n adoptados en los est谩ndares (MVI), por ejemplo, al medir el caudal y la cantidad de gases usando dispositivos de constricci贸n est谩ndar [1], o usando una turbina, medidores y medidores de flujo rotacionales y de v贸rtice [2].

El an谩lisis peri贸dico de gases nos permite establecer una correspondencia entre la mezcla analizada real y su modelo, seg煤n la cual los par谩metros fisicoqu铆micos del gas se tienen en cuenta en el MVI: la composici贸n de la mezcla de gases y la densidad del gas en condiciones est谩ndar.
Adem谩s, el MVI tiene en cuenta las caracter铆sticas termof铆sicas del gas: densidad en condiciones de funcionamiento (presi贸n y temperatura del gas en el que se mide su caudal o volumen), viscosidad, factor y factor de compresibilidad.

Los par谩metros del estado del gas medidos en tiempo real incluyen: presi贸n (presi贸n diferencial), temperatura, densidad. Para medir estos par谩metros, respectivamente, se utilizan medios de equipos de medici贸n: man贸metros (man贸metros diferenciales), term贸metros, densit贸metros. La medici贸n de la densidad del medio gaseoso puede medirse por m茅todos de medici贸n directos o indirectos. Los resultados de los m茅todos de medici贸n directos e indirectos dependen del error de los instrumentos de medici贸n y del error metodol贸gico. En condiciones de funcionamiento, las se帽ales de informaci贸n de medici贸n pueden verse afectadas por un ruido significativo, cuya desviaci贸n cuadr谩tica media puede exceder el error instrumental. En este caso, una tarea urgente es el filtrado efectivo de las se帽ales de informaci贸n de medici贸n.

Este art铆culo analiza el m茅todo de medici贸n indirecta de la densidad del gas en condiciones de operaci贸n y est谩ndar utilizando un filtro Kalman.

Modelo matem谩tico para determinar la densidad del gas.


Pasemos a los cl谩sicos y recordemos la ecuaci贸n de estado de un gas ideal [3]. Tenemos:

1. La ecuaci贸n de Mendeleev-Clapeyron:

(1)

donde:

- presi贸n de gas;

- volumen molar;

R es la constante de gas universal,

;

T es la temperatura absoluta, T = 273.16 K.

2. Dos par谩metros medidos:

p - presi贸n de gas, Pa
t es la temperatura del gas, 掳 C.

Se sabe que el volumen molar depende del volumen de gas V y la cantidad de moles de gas en este volumen:

(2)

Tambi茅n se sabe que

(3)

donde: m es la masa de gas, M es la masa molar de gas.

Dado (2) y (3) reescribimos (1) en la forma:

(4)

Como se sabe, la densidad de una sustancia

es igual a:

(5)

De (4) y (5) derivamos la ecuaci贸n para la densidad del gas

:

(6)

e introducir la notaci贸n para el par谩metro

, que depende de la masa molar de la mezcla de gases:

(7)

Si la composici贸n de la mezcla de gases no cambia, entonces el par谩metro k es constante.
Entonces, para calcular la densidad del gas, es necesario calcular la masa molar de la mezcla de gases.

La masa molar de una mezcla de sustancias se define como el promedio aritm茅tico de la masa molar de las fracciones de masa incluidas en la mezcla de sustancias individuales.

Tomamos la composici贸n conocida de sustancias en una mezcla de gases, en el aire, que consiste en:

  • 23% en peso de mol茅culas de ox铆geno
  • 76% en peso de mol茅culas de nitr贸geno
  • 1% en peso de 谩tomos de arg贸n

Las masas molares de estas sustancias atmosf茅ricas ser谩n respectivamente iguales a:

, g / mol.

Calculamos la masa molar del aire como el promedio aritm茅tico ponderado:



Ahora, sabiendo el valor de la constante

, podemos calcular la densidad del aire de acuerdo con la f贸rmula (7) teniendo en cuenta los valores medidos

y t :



Llevando la densidad del gas a condiciones normales y est谩ndar


En la pr谩ctica, las mediciones de las propiedades de los gases se llevan a cabo en diferentes condiciones f铆sicas, y para garantizar la comparaci贸n entre diferentes conjuntos de datos, se deben establecer conjuntos de condiciones est谩ndar [4].

Las condiciones est谩ndar de temperatura y presi贸n son las condiciones f铆sicas establecidas por el est谩ndar, con las cuales se correlacionan las propiedades de las sustancias que dependen de estas condiciones.

Varias organizaciones establecen sus condiciones est谩ndar, por ejemplo: la Uni贸n Internacional de Qu铆mica Pura y Aplicada (IUPAC), ha establecido la definici贸n de temperatura y presi贸n est谩ndar (STP) en el campo de la qu铆mica: temperatura 0 掳 C (273.15 K), presi贸n absoluta 1 bar (Pa); El Instituto Nacional de Est谩ndares y Tecnolog铆a (NIST) establece una temperatura de 20 掳 C (293.15 K) y una presi贸n absoluta de 1 atm (101.325 kPa), y este est谩ndar se llama temperatura y presi贸n normales (NTP); La Organizaci贸n Internacional de Normalizaci贸n (ISO) establece condiciones est谩ndar para el gas natural (ISO 13443: 1996, confirmado en 2013): temperatura 15.00 掳 y presi贸n absoluta 101.325 kPa.

Por lo tanto, en la industria y el comercio es necesario indicar las condiciones est谩ndar de temperatura y presi贸n, con respecto a las cuales se realizan los c谩lculos necesarios.

Calculamos la densidad del aire de acuerdo con la ecuaci贸n (8) en condiciones operativas de temperatura y presi贸n. De acuerdo con (6), escribimos la ecuaci贸n para la densidad del aire en condiciones est谩ndar: temperatura y presi贸n absoluta :

(9)

Hacemos el c谩lculo de la densidad del aire reducida a las condiciones est谩ndar. Dividimos la ecuaci贸n (9) por la ecuaci贸n (6) y escribimos esta relaci贸n para :

(10)

Del mismo modo, obtenemos una ecuaci贸n para calcular la densidad del aire reducida a condiciones normales: temperatura y presi贸n absoluta

:

(11)

En las ecuaciones (10) y (11) usamos los valores de los par谩metros del aire. , T y P de la ecuaci贸n (8) obtenida en condiciones de funcionamiento.

La implementaci贸n del canal de medici贸n de presi贸n y temperatura.


Para resolver muchas tareas de obtener informaci贸n, dependiendo de su complejidad, es conveniente crear un prototipo de un sistema futuro basado en una de las plataformas de microcontroladores como Arduino, Nucleo, Teensy, etc.

驴Qu茅 podr铆a ser m谩s f谩cil? Hagamos una plataforma de microcontrolador para resolver un problema espec铆fico: crear un sistema para medir la presi贸n y la temperatura, gastar menos, posiblemente, fondos y utilizar todas las ventajas del desarrollo de software en el entorno del Software Arduino (IDE).

Para esto, a nivel de hardware, necesitaremos componentes:

  1. Arduino (Uno, ...) - uso como programador;
  2. microcontrolador ATmega328P-PU - microcontrolador de la futura plataforma;
  3. un resonador de cuarzo de 16 MHz y un par de condensadores cer谩micos de 12-22 pF cada uno (de acuerdo con las recomendaciones del fabricante);
  4. un bot贸n de reloj para reiniciar el microcontrolador y un pull-up m谩s alimentaci贸n al pin RESET del microcontrolador 1 kOhm de resistencia;
  5. BMP180 - transmisor de temperatura y presi贸n con interfaz I2C;
  6. convertidor de interfaz TTL / USB;
  7. Consumibles: cables, soldadura, placa de circuito, etc.

Un diagrama esquem谩tico de la plataforma, teniendo en cuenta las interfaces necesarias: una interfaz serial est谩ndar, I2C, y nada m谩s, se presenta en la Fig. 1)


Fig. 1 - Diagrama esquem谩tico de una plataforma de microcontrolador para la implementaci贸n de un sistema de medici贸n de presi贸n y temperatura

Ahora consideraremos las etapas de la implementaci贸n de nuestra tarea.

1. Primero, necesitamos un programador. Conectamos Arduino (Uno, ...) a la computadora. En el entorno del software Arduno, desde el men煤, vaya a Archivo-> Ejemplos-> 11. ArdunoISP llegamos al programador programador ArduinoISP, que cosimos en Arduino. Primero, en el men煤 Herramientas, seleccione respectivamente la placa, el procesador, el cargador y el puerto. Despu茅s de descargar el programa ArduinoISP a la placa, nuestro Arduino se convierte en un programador y est谩 listo para usar para el prop贸sito previsto. Para hacer esto, en el entorno del software Arduno, en el men煤 Herramientas , seleccione el elemento Programador: "Arduino como ISP ".

2. Conecte el microcontrolador esclavo ATmega328P a trav茅s de la interfaz SPI al programador maestro Arduino (Uno, ...), Fig. 2. Debe tenerse en cuenta que anteriormente los bits del registro de bytes de bajo fusible del microcontrolador ATmega328P estaban configurados en un estado no programado. Vaya al entorno de Arduno Software y, en el men煤 Herramientas , seleccione el elemento Grabar cargador . Destellando el microcontrolador ATmega328P.


Fig. 2 - Diagrama de conexi贸n del microcontrolador al programador

3. Despu茅s de un firmware exitoso, el microcontrolador ATmega328P est谩 listo para su instalaci贸n en la plataforma de microcontrolador desarrollada (Fig. 3), que es programable, as铆 como el Arduino completo (Uno, ...). El programa de sondeo para el transmisor de presi贸n y temperatura se muestra en el Listado 1.


Fig. 3 Sistema de medici贸n de presi贸n y temperatura.

Listado 1 - Programa de sondeo para transductores de presi贸n y temperatura
#include <SFE_BMP180.h> SFE_BMP180 pressure; double T,P; void setup() { Serial.begin(9600); pressure.begin(); } void loop() { P = getPressure(); Serial.println(P+0.5, 2); Serial.println(T+0.54, 2); delay(1000); } double getPressure(){ char status; status = pressure.startTemperature(); if (status != 0){ delay(status); //    status = pressure.getTemperature(T); if (status != 0){ status = pressure.startPressure(3); if (status != 0){ delay(status); //    status = pressure.getPressure(P,T); if (status != 0){ return(P); } } } } } 


Programa Python para filtrar por canales de temperatura y presi贸n, y obtener resultados


El programa Python para el m茅todo para determinar la densidad del gas a partir de las mediciones de presi贸n y temperatura se muestra en el Listado 2. La informaci贸n del sistema de medici贸n se muestra en tiempo real.

Listado 2 - Determinaci贸n de la densidad del gas a partir de mediciones de presi贸n y temperatura
 import numpy as np import matplotlib.pyplot as plt import serial from drawnow import drawnow import datetime, time from pykalman import KalmanFilter #      transition_matrix = [[1, 1, 0, 0], [0, 1, 0, 0], [0, 0, 1, 1], [0, 0, 0, 1]] observation_matrix = [[1, 0, 0, 0], [0, 0, 1, 0]] #     initial_state_mean = [101000, 0, 28, 0] #    : #   R, [/(*)] R = 8.314459848 #   M, [/] M = 29.04 # k = M/R, [/(*)] k = M / R # , [K] K = 273.16 # () , [] Pn = 101325 #   #    str_m = input("  : ") m = eval(str_m) #    mw = 16 #    ser = serial.Serial() ser.baudrate = 9600 port_num = input("   : ") ser.port = 'COM' + port_num ser #   try: ser.open() ser.is_open print(" : " + ser.portstr) except serial.SerialException: print("   : " + ser.portstr) raise SystemExit(1) #  l1 = [] #   1-  l2 = [] #   2-  t1 = [] #    lw1 = [] #    1-  lw2 = [] #    2-  n = [] #     nw = [] #      l1K = [] #    1-  l2K = [] #    2-  ro = [] #     #      filename = 'count.txt' in_file = open(filename,"r") count = in_file.read() count_v = eval(count) + 1 in_file.close() in_file = open(filename,"w") count = str(count_v) in_file.write(count) in_file.close() filename = count + '_' + filename out_file = open(filename,"w") #      print("\n:\n") print("n -  , ;") print("P - , ;") print("Pf -   P, ;") print("T - , . ;") print("Tf -   T, . ;") print("ro -  , /^3;") print("\n   \n") print('{0}{1}{2}{3}{4}{5}\n'.format('n'.rjust(3),'P'.rjust(10),'Pf'.rjust(10), 'T'.rjust(10),'Tf'.rjust(10),'ro'.rjust(10))) #     #  #   i = 0 while i < m: n.append(i) nw.append(n[i]) if i >= mw: nw.pop(0) ser.flushInput() #flush input buffer, discarding all its contents line1 = ser.readline().decode('utf-8')[:-1] line2 = ser.readline().decode('utf-8')[:-1] t1.append(time.time()) if line1: l = eval(line1) #l = np.random.normal(l,100.0) l1.append(l) lw1.append(l1[i]) if i >= mw: lw1.pop(0) if line2: l = eval(line2) #l = np.random.normal(l,1.5) l2.append(l) lw2.append(l2[i]) if i >= mw: lw2.pop(0) #------------------------- initial_state_mean = [l1[i],0,l2[i],0] kf1 = KalmanFilter(transition_matrices = transition_matrix, observation_matrices = observation_matrix, initial_state_mean = initial_state_mean) if i == 0: measurements = np.array( [ [l1[i], l2[i]], [initial_state_mean[0], initial_state_mean[2]] ] ) measurements = np.array( [ [l1[i], l2[i]], [l1[i-1], l2[i-1]] ] ) kf1 = kf1.em(measurements, n_iter=2) (smoothed_state_means, smoothed_state_covariances) = kf1.smooth(measurements) l1K.append(smoothed_state_means[0, 0]) l2K.append(smoothed_state_means[0, 2]) #     #ro.append( k * l1K[i]/( l2K[i] + K) ) # ,     ro.append( (k * l1K[i]/( l2K[i] + K)) * (Pn*(l2K[i]+K)/K/l1K[i]) ) # ,     #ro.append( (k * l1K[i]/( l2K[i] + K)) * (Pn*(l2K[i]+K)/(K+20)/l1K[i]) ) print('{0:3d} {1:10.3f} {2:10.3f} {3:10.3f} {4:10.3f} {5:10.3f}'. format(n[i],l1[i],l1K[i],l2[i],l2K[i],ro[i])) i += 1 ser.close() time_tm = t1[m - 1] - t1[0] print("\n  : {0:.3f}, c".format(time_tm)) Ts = time_tm / (m - 1) print("\n  : {0:.6f}, c".format(Ts)) #    print("\n    {}\n".format(filename)) for i in np.arange(0,len(n),1): out_file.write('{0:3d} {1:10.3f} {2:10.3f} {3:10.3f} {4:10.3f} {5:10.3f}\n'. format(n[i],l1[i],l1K[i],l2[i],l2K[i],ro[i])) #    out_file.close() now = datetime.datetime.now() #    #  plt.figure('') plt.plot( n, l1, "b-", n, l1K, "r-") plt.ylabel(r'$, $') plt.xlabel(r'$ \ $' + '; (  : {:.6f}, c)'.format(Ts)) plt.title("BMP180\n(" + now.strftime("%d-%m-%Y %H:%M") + ")") plt.grid(True) plt.figure('') plt.plot( n, l2, "b-", n, l2K, "r-") plt.ylabel(r'$, \degree $') plt.xlabel(r'$ \ $' + '; (  : {:.6f}, c)'.format(Ts)) plt.title("BMP180\n(" + now.strftime("%d-%m-%Y %H:%M") + ")") plt.grid(True) plt.figure(' ') plt.plot( n, ro, "r-") plt.ylabel(r'$ , /^3$') plt.xlabel(r'$ \ $' + '; (  : {:.6f}, c)'.format(Ts)) plt.title("BMP180\n(" + now.strftime("%d-%m-%Y %H:%M") + ")") plt.grid(True) plt.show() 


Los resultados del c谩lculo se presentan por listado y Fig. 4, 5, 6.

Interfaz de usuario y tabla de resultados de c谩lculo
   : 33    : 6  : COM6 : n -  , ; P - , ; Pf -   P, ; T - , . ; Tf -   T, . ; ro -  , /^3;     n P Pf T Tf ro 0 101141.000 101141.000 28.120 28.120 1295.574 1 101140.000 101140.099 28.190 28.183 1295.574 2 101140.000 101140.000 28.130 28.136 1295.574 3 101141.000 101140.901 28.100 28.103 1295.574 4 101140.000 101140.099 28.100 28.100 1295.574 5 101141.000 101140.901 28.110 28.109 1295.574 6 101141.000 101141.000 28.100 28.101 1295.574 7 101139.000 101139.217 28.100 28.100 1295.574 8 101138.000 101138.099 28.090 28.091 1295.574 9 101137.000 101137.099 28.100 28.099 1295.574 10 101151.000 101149.028 28.100 28.100 1295.574 11 101136.000 101138.117 28.110 28.109 1295.574 12 101143.000 101142.052 28.110 28.110 1295.574 13 101139.000 101139.500 28.100 28.101 1295.574 14 101150.000 101148.463 28.110 28.109 1295.574 15 101154.000 101153.500 28.120 28.119 1295.574 16 101151.000 101151.354 28.110 28.111 1295.574 17 101141.000 101142.391 28.130 28.127 1295.574 18 101141.000 101141.000 28.120 28.121 1295.574 19 101142.000 101141.901 28.110 28.111 1295.574 20 101141.000 101141.099 28.120 28.119 1295.574 21 101142.000 101141.901 28.110 28.111 1295.574 22 101146.000 101145.500 28.120 28.119 1295.574 23 101144.000 101144.217 28.130 28.129 1295.574 24 101142.000 101142.217 28.130 28.130 1295.574 25 101142.000 101142.000 28.140 28.139 1295.574 26 101142.000 101142.000 28.130 28.131 1295.574 27 101146.000 101145.500 28.150 28.147 1295.574 28 101142.000 101142.500 28.190 28.185 1295.574 29 101146.000 101145.500 28.230 28.225 1295.574 30 101146.000 101146.000 28.230 28.230 1295.574 31 101146.000 101146.000 28.220 28.221 1295.574 32 101150.000 101149.500 28.210 28.211 1295.574   : 6.464, c   : 0.201998, c     68_count.txt 



Fig. 4 - resultados de medici贸n (rojo) y filtraci贸n (azul) de presi贸n


Fig. 5 - resultados de medici贸n (rojo) y filtraci贸n (azul) de temperatura


Fig. 6 - resultados de c谩lculo de la densidad del aire reducida a condiciones est谩ndar (temperatura 273.15 K; presi贸n absoluta 101.325 kPa)

Conclusiones


Se ha desarrollado una t茅cnica para determinar la densidad del gas a partir de mediciones de presi贸n y temperatura utilizando sensores Arduino y el software Python.

Enlaces a fuentes de informaci贸n.


  1. GOST 8.586.5-2005. URL
  2. GOST R 8.740 - 2011. URL
  3. Ley del gas ideal. URL
  4. Condiciones est谩ndar de temperatura y presi贸n. URL

Source: https://habr.com/ru/post/es412915/


All Articles