Détermination de la densité de gaz à partir des résultats de la mesure de la pression et de la température avec des capteurs Arduino

Présentation


La tâche de mesurer les paramètres d'un mélange gazeux est répandue dans l'industrie et le commerce. Le problème de l'obtention d'informations fiables lors de la mesure des paramètres de l'état du milieu gazeux et de ses caractéristiques à l'aide de moyens techniques est résolu par les procédures de mesure adoptées dans les normes (MVI), par exemple, lors de la mesure du débit et de la quantité de gaz à l'aide de dispositifs de restriction standard [1], ou à l'aide d'une turbine, débitmètres et compteurs rotatifs et vortex [2].

L'analyse périodique des gaz permet d'établir une correspondance entre le mélange réel analysé et son modèle, selon laquelle les paramètres physicochimiques du gaz sont pris en compte dans le MVI: la composition du mélange gazeux et la densité du gaz dans des conditions standard.
De plus, le MVI prend en compte les caractéristiques thermophysiques du gaz: densité dans les conditions de fonctionnement (pression et température du gaz auquel son débit ou volume est mesuré), viscosité, facteur et facteur de compressibilité.

Les paramètres d'état du gaz mesurés en temps réel comprennent: la pression (pression différentielle), la température, la densité. Pour mesurer ces paramètres, respectivement, des moyens de mesure sont utilisés: manomètres (manomètres différentiels), thermomètres, densitomètres. La mesure de la densité du milieu gazeux peut être mesurée par des méthodes de mesure directes ou indirectes. Les résultats des méthodes de mesure directes et indirectes dépendent de l'erreur des instruments de mesure et de l'erreur méthodologique. Dans des conditions de fonctionnement, les signaux d'information de mesure peuvent être affectés par un bruit important, dont l'écart quadratique moyen peut dépasser l'erreur instrumentale. Dans ce cas, une tâche urgente est le filtrage efficace des signaux d'information de mesure.

Cet article traite de la méthode de mesure indirecte de la densité de gaz dans des conditions de fonctionnement et standard à l'aide d'un filtre de Kalman.

Modèle mathématique pour déterminer la densité de gaz


Passons aux classiques et rappelons l'équation d'état d'un gaz idéal [3]. Nous avons:

1. L'équation de Mendeleev-Clapeyron:

(1)

où:

- pression de gaz;

- volume molaire;

R est la constante de gaz universelle,

;

T est la température absolue, T = 273,16 K.

2. Deux paramètres mesurés:

p - pression de gaz, Pa
t est la température du gaz, ° C

On sait que le volume molaire dépend du volume de gaz V et du nombre de moles de gaz dans ce volume:

(2)

On sait également que

(3)

où: m est la masse de gaz, M est la masse molaire de gaz.

Étant donné (2) et (3) nous réécrivons (1) sous la forme:

(4).

Comme on le sait, la densité d'une substance

est égal à:

(5).

De (4) et (5), nous dérivons l'équation de la densité de gaz

:

(6)

et introduire la notation du paramètre

, qui dépend de la masse molaire du mélange gazeux:

(7).

Si la composition du mélange gazeux ne change pas, alors le paramètre k est constant.
Ainsi, pour calculer la densité du gaz, il est nécessaire de calculer la masse molaire du mélange gazeux.

La masse molaire d'un mélange de substances est définie comme la moyenne arithmétique de la masse molaire des fractions massiques incluses dans le mélange de substances individuelles.

Nous prenons la composition connue des substances dans un mélange gazeux - dans l'air, qui se compose de:

  • 23% en poids de molécules d'oxygène
  • 76% en poids de molécules d'azote
  • 1% en poids d'atomes d'argon

Les masses molaires de ces substances atmosphériques seront respectivement égales à:

, g / mol.

Nous calculons la masse molaire de l'air comme la moyenne arithmétique pondérée:



Maintenant, connaissant la valeur de la constante

, on peut calculer la densité de l'air selon la formule (7) en tenant compte des valeurs mesurées

et t :



Ramener la densité du gaz à des conditions normales et standard


Dans la pratique, les mesures des propriétés des gaz sont effectuées dans différentes conditions physiques, et pour garantir la comparaison entre différents ensembles de données, des ensembles de conditions standard doivent être établis [4].

Les conditions normalisées de température et de pression sont les conditions physiques établies par la norme, avec lesquelles les propriétés des substances qui dépendent de ces conditions sont corrélées.

Différentes organisations établissent leurs conditions standard, par exemple: l'Union internationale de chimie pure et appliquée (IUPAC), a établi la définition de la température et de la pression standard (STP) dans le domaine de la chimie: température 0 ° C (273,15 K), pression absolue 1 bar (Pa); L'Institut national des normes et de la technologie (NIST) définit une température de 20 ° C (293,15 K) et une pression absolue de 1 atm (101,325 kPa), et cette norme est appelée température et pression normales (NTP); L'Organisation internationale de normalisation (ISO) établit des conditions normalisées pour le gaz naturel (ISO 13443: 1996, confirmée en 2013): température 15,00 ° C et pression absolue 101,325 kPa.

Par conséquent, dans l'industrie et le commerce, il est nécessaire d'indiquer les conditions standard de température et de pression, en fonction desquelles les calculs nécessaires sont effectués.

Nous calculons la densité de l'air selon l'équation (8) dans des conditions de fonctionnement de température et de pression. Conformément à (6), nous écrivons l'équation de la densité de l'air dans des conditions standard: température et pression absolue :

(9).

Nous faisons le calcul de la densité de l'air réduit aux conditions standard. Nous divisons l'équation (9) par l'équation (6) et écrivons cette relation pour :

(10).

De même, nous obtenons une équation pour calculer la densité de l'air réduit à des conditions normales: température et pression absolue

:

(11).

Dans les équations (10) et (11), nous utilisons les valeurs des paramètres de l'air , T et P de l'équation (8) obtenus dans les conditions de fonctionnement.

La mise en œuvre de la pression et de la température du canal de mesure


Pour résoudre de nombreux problèmes d'obtention d'informations, en fonction de leur complexité, il est pratique de créer un prototype d'un futur système basé sur l'une des plateformes de microcontrôleurs telles que Arduino, Nucleo, Teensy, etc.

Quoi de plus simple? Faisons une plate-forme de microcontrôleur pour résoudre un problème spécifique - créer un système pour mesurer la pression et la température, dépenser moins, éventuellement, des fonds et utiliser tous les avantages du développement logiciel dans l'environnement Arduino Software (IDE).

Pour cela, au niveau matériel, nous aurons besoin de composants:

  1. Arduino (Uno, ...) - utiliser comme programmeur;
  2. microcontrôleur ATmega328P-PU - microcontrôleur de la future plateforme;
  3. un résonateur à quartz de 16 MHz et une paire de condensateurs céramiques de 12-22 pF chacun (selon les recommandations du fabricant);
  4. un bouton d'horloge pour réinitialiser le microcontrôleur et un pull-up plus l'alimentation de la broche RESET de la résistance de 1 kOhm du microcontrôleur;
  5. BMP180 - transmetteur de température et de pression avec interface I2C;
  6. convertisseur d'interface TTL / USB;
  7. consommables - fils, soudure, carte de circuits imprimés, etc.

Un schéma de principe de la plateforme, prenant en compte les interfaces nécessaires: une interface série standard, I2C, et rien de plus, est présentée sur la Fig. 1.


Fig. 1 - Schéma de principe d'une plateforme de microcontrôleur pour la mise en œuvre d'un système de mesure de pression et de température

Nous allons maintenant examiner les étapes de la mise en œuvre de notre tâche.

1. Premièrement, nous avons besoin d'un programmeur. Nous connectons Arduino (Uno, ...) à l'ordinateur. Dans l'environnement Arduno Software, dans le menu, allez dans Fichier-> Exemples-> 11. ArdunoISP nous arrivons au programmeur programmeur ArduinoISP, que nous cousons en Arduino. Tout d'abord, dans le menu Outils, sélectionnez respectivement la carte, le processeur, le chargeur, le port. Après avoir téléchargé le programme ArduinoISP sur la carte, notre Arduino se transforme en programmeur et est prêt à l'emploi pour son usage prévu. Pour ce faire, dans l'environnement Arduno Software, dans le menu Outils , sélectionnez l'élément Programmeur: «Arduino as ISP ».

2. Connectez le microcontrôleur esclave ATmega328P via l'interface SPI au programmateur maître Arduino (Uno, ...), Fig. 2. Il convient de noter qu'auparavant, les bits du registre Low Fuse Byte du microcontrôleur ATmega328P étaient définis sur un état non programmé. Accédez à l'environnement Arduno Software et dans le menu Outils , sélectionnez l'élément Burn Loader . Flashage du microcontrôleur ATmega328P.


Fig. 2 - Schéma de connexion du microcontrôleur au programmateur

3. Une fois le micrologiciel réussi, le microcontrôleur ATmega328P est prêt à être installé sur la plate-forme de microcontrôleur développée (Fig. 3), qui est programmable ainsi que l'Arduino à part entière (Uno, ...). Le programme d'interrogation du transmetteur de pression et de température est indiqué dans le listing 1.


Fig. 3 Système de mesure de pression et de température

Listing 1 - Programme d'interrogation des transducteurs de pression et de température
#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); } } } } } 


Programme Python pour filtrer par canaux de température et de pression, et obtenir des résultats


Le programme Python pour la méthode de détermination de la densité de gaz à partir des mesures de pression et de température est présenté dans le listing 2. Les informations du système de mesure sont affichées en temps réel.

Listing 2 - Détermination de la densité de gaz à partir de mesures de pression et de température
 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() 


Les résultats des calculs sont présentés par liste et Fig. 4, 5, 6.

Interface utilisateur et tableau des résultats des calculs
   : 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 - résultats de mesure (rouge) et de filtration (bleu) de la pression


Fig. 5 - résultats de mesure (rouge) et filtration (bleu) de la température


Fig. 6 - résultats de calcul de la densité de l'air réduite aux conditions standard (température 273,15 K; pression absolue 101,325 kPa)

Conclusions


Une technique a été développée pour déterminer la densité de gaz à partir de mesures de pression et de température à l'aide de capteurs Arduino et d'un logiciel Python.

Liens vers des sources d'informations


  1. GOST 8.586.5-2005. URL
  2. GOST R 8.740 - 2011. URL
  3. Loi du gaz idéal. URL
  4. Conditions standard de température et de pression. URL

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


All Articles