Moniteur portatif avec STONE Écran tactile série et ESP32

En utilisant STONE Moniteur portable à écran tactile série, le département matériel a décidé d'utiliser la puce de microprocesseur 32 bits de NXP comme surveillance complète de la machine, analyse ECG, centre de contrôle, par amplification d'acquisition de bioélectricité ECG, entraînement de la jambe droite, importation de la base de données MIT ECG pour faire un algorithme, mais surveillez également le signal électrique du capteur SpO2, la pression artérielle, l'amplification du signal électrique respiratoire et le traitement du filtrage, grâce à une communication à haut débit en bauds, au lecteur STONE en série -nous écran pour afficher les changements de forme d'onde et de paramètre en temps réel, et comparer avec une valeur de référence pour porter un jugement, et surveiller et alerter les changements des paramètres du corps humain. S'il y a un écart de portée, il émet automatiquement des invites vocales.

La nouvelle version du STONE L'écran tactile série prend parfaitement en charge la représentation et l'affichage des courbes, le protocole de communication est simple et facile à mémoriser, les ingénieurs en microcontrôleur peuvent l'utiliser après avoir lu le manuel, il existe de nombreux exemples de pilotes dans le jeu de commandes, directement copiés pour modifier le nom et les paramètres peuvent être utilisé. La connexion série est simple, vous pouvez utiliser la carte adaptateur officielle, qu'il s'agisse d'une connexion série directe ou USB vers série, elle est très pratique et facile à utiliser. Le moniteur affiche plusieurs groupes de paramètres vitaux en même temps, en particulier 3 courbes qui sont dessinées dynamiquement et affichées en même temps de manière très fluide, et devraient pouvoir dessiner plus de groupes de graphiques de courbes en même temps, vous pouvez essayer au besoin . Bien sûr, la fonction de courbe de jeu de commandes a un exemple de plusieurs données poussées en même temps, mais l'utilisation réelle du matériel actuel ne répond pas, j'espère que l'officiel pourra être optimisé dès que possible. Il peut également être résolu en mettant à jour le firmware. Pour cette nouvelle version de la fonction de courbe de dessin, j'ai d'abord essayé comment ne pas être déconnecté, et j'ai finalement appris que l'écran série avait un nouveau firmware, brossé le nouveau firmware pour voir le "vrai visage de la montagne". En voyant la courbe ECG lisse sortir de l'écran série avec le firmware brossé, l'ambiance est heureuse, hein ……

L'image de conception de ce projet est illustrée à la figure (1). L'interface est basée sur un STWI101WT-01 écran série avec une résolution de 1024*600, le côté gauche montre 2/3 de la courbe de forme d'onde et le 1/3 droit montre la valeur.

Cet article se concentrera sur la création et la représentation de la vue du graphique en courbe. C'est complètement conforme au processus de production de la démo du projet, sans classification, peut-être que vous vous sentez désordonné, mais c'est le vrai processus de développement réel.

Tout d'abord, nous avons décidé de fixer la représentation de la courbe de l'ECG.

 

Figure (1) Interface attendue de la conception du projet
Figure (1) Interface attendue de la conception du projet

Cette démo simule une fréquence cardiaque de 75 bpm, ce qui équivaut à un battement de cœur de 800 ms, c'est-à-dire un point toutes les 40 ms, un cycle tous les 20 points, basé sur l'ensemble de la vue du graphique, contrôle l'axe X divisé en 100 parties égales, forme d'onde de 4 s par écran, rafraîchissement de l'écran taux 25Hz, semble très lisse. L'élément de série de lignes de cette commande de vue graphique est défini sur lisse = faux (la forme d'onde ECG est nette), l'enveloppe inférieure n'est pas affichée et le marqueur de point n'est pas affiché. Région. Voir ici la figure (4), min = 0, max = 140 pour l'axe Y, la valeur maximale donnée dans le programme est de 130 et la plage est relativement complète. Voir Figure (2) – Figure (7) pour les autres paramètres, qui sont définis pour la vue graphique1 et ses éléments X axis1, Yaxis2, bar series1 et line series1. Nous choisissons transparent rgba (0,0,0,0) pour la couleur bg du contrôle de la vue du graphique, qui révèle la couleur de base (noir), et d'autres contrôles, tels que la vue, ont les mêmes caractéristiques.

Figure (2) Paramètres de propriété de la vue graphique1
Figure (2) Paramètres de propriété de la vue graphique1
Figure (3) Paramètre de la propriété X axis1 de la vue graphique1
Figure (3) Paramètre de la propriété X axis1 de la vue graphique1
Figure (4) Paramètre de la propriété Y axis1 de la vue graphique1
Figure (4) Paramètre de la propriété Y axis1 de la vue graphique1
Figure (5) paramètre de propriété de la série de barres1 de la vue graphique1
Figure (5) paramètre de propriété de la série de barres1 de la vue graphique1
Figure (6) Paramètre de la propriété line series1 de la vue graphique111
Figure (6) Paramètre de la propriété line series1 de la vue graphique111
Figure (7) réglage de la propriété line series1 de la vue graphique12
Figure (7) réglage de la propriété line series1 de la vue graphique12

Le code de programmation pour simuler la forme d'onde ECG (75 bpm) selon les paramètres ci-dessus est le suivant.

Tout d'abord, définissez deux variables comme suit.

  Int num19_1 = 0;
  Int num19_2 = 0;
Then generally in the main loop main.c, the ECG curve is depicted by the following code.
  delay(10);   
  
  num19_1 += 1;
  if(num19_1 >= 4){ // Draw one point every 40ms.
    num19_1 = 0;
    num19_2 += 1;
    if(num19_2 == 3){
      Serial.println("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series1\",\"mode\":\"push\",\"value\" :10}>ET");
    }else if(num19_2 == 4){
      Serial.println("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series1\",\"mode\":\"push\",\"value\" :130}>ET");
    }else{
      Serial.println("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series1\",\"mode\":\"push\",\"value\" :40}>ET");
    }
    if(num19_2 >= 20){  //every 20 data is a cycle
      num19_2 = 0;
    }
  }

Ensuite, vous voulez vous occuper de la courbe de CO2, en vous concentrant sur la synchronisation du balayage.

 

Les 3 courbes de ce projet, la vue graphique 2 est pour le capteur d'oxygène sanguin SpO2 et la vue graphique 3 est pour la respiration au CO2.

Vue graphique2, vue graphique3 axe X sont définis min = 0, max = 100 et vue graphique ECG1 identique, balayage de courbe pour rester synchronisé, vue graphique2 axe Y2 max = 100, de sorte que la préparation de la valeur de l'axe Y du programme est donnée à 95 maximum, l'algorithme est illustré dans le code de programme suivant.

First, define 3 variables as follows.
Int num19_3 = 0;
Int num19_4 = 0;
Int num19_5 = 0;
The CO2 curve is then generally depicted in the main loop, main.c, by the following code.
num19_3 += 1;
if(num19_3 >= 4){ //one point every 40ms
num19_3 = 0;
num19_4 += 1;
if(num19_4 <= 10){
num19_5 = num19_4*9; //the first 10 points increase linearly
Serial.print("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series3\",\"mode\":\"push\",\"value\":" );
Serial.print(num19_5);
Serial.println("}>ET");
}else if(num19_4 <= 40){ // the last 30 points decrease linearly
num19_5 = 95 - (num19_4 - 10)*3;
Serial.print("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series3\",\"mode\":\"push\",\"value\":" );
Serial.print(num19_5);
Serial.println("}>ET");
}else{
num19_4 = 0;
Serial.println("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series3\",\"mode\":\"push\",\"value\" :5}>ET");
} }

La figure (8) montre la forme d'onde ECG en haut et la forme d'onde CO2 en bas (symbole rond rayon = 4)
La figure (8) montre la forme d'onde ECG en haut et la forme d'onde CO2 en bas (symbole rond rayon = 4)
La figure (9) montre la forme d'onde ECG en haut et la forme d'onde CO2 en bas (symbole rond rayon = 30)
La figure (9) montre la forme d'onde ECG en haut et la forme d'onde CO2 en bas (symbole rond rayon = 30)

La forme d'onde de CO2 suivante dans la figure (8) est l'effet du programme ci-dessus lorsque le rayon rond du symbole d'attribut = 4 pour la série de lignes3. Nous essayons de modifier le rayon rond du symbole = 30, en espérant que la transition de la courbe soit plus arrondie, mais le résultat du test n'est pas différent de la figure (8), voir la figure (9), qui montre que lorsque les points sont plus denses, l'effet d'arrondi n'est pas évident. Cela ne peut être réalisé qu'en modifiant les coordonnées du point.

Figure (10) avec les coordonnées séparant les axes
Figure (10) avec les coordonnées séparant les axes

Examinons les propriétés de l'axe X dans la figure (3) en utilisant la figure (10). Dans la figure (3), lorsque show = true pour la ligne de séparation, la longue barre verticale (barre de séparation) s'affiche ; lorsque show = true pour la ligne, la ligne horizontale de l'axe X sera affichée (telle que la ligne horizontale en bas de la vue graphique supérieure) ; lorsque show = true pour tick, la fine ligne de l'échelle sous la ligne horizontale de l'axe X sera affichée ; lorsque show = true pour l'étiquette, le nombre sous la ligne horizontale de l'axe X (la valeur remplie dans les données) sera affiché. = true, il affichera le nombre sous la ligne horizontale de l'axe X (la valeur remplie dans les données). C'est tout.

Maintenant, c'était la courbe SpO2 et j'ai décidé d'utiliser la conversion AD.

Simulation de courbe à l'aide ESP32 ADC, c'est 12 bits, pleine échelle 4096. vue graphique2 axe Y max = 255, la valeur de lecture ADC divisée par 20, peut répondre à l'affichage de la courbe. L'affichage SPO2 pleine échelle est de 100 %, de sorte que la valeur ADC lue divisée par 20 puis divisée par 2.55 peut être affichée dans label2, le programme car il s'agit d'une opération de nombre entier, l'algorithme est corrigé, veuillez voir le test réel bon code de programme. Utilisez la fonction analogRead (32) dans Arduino pour lire directement la valeur de conversion AD de GPIO32 (également ADC-CH4) de ESP32. Le test peut être effectué par un potentiomètre, mais aussi simplement connecter la broche ADC-CH4 à GND, à + 3.3 V, à + 5 V, ou en surplomb pour voir la forme d'onde d'interférence, voir l'effet vidéo (affiché à bas lorsqu'il est mis à la terre, connecté à + 3.3 V, + 5 V est la même amplitude complète élevée, le porte-à-faux est une courbe parasite), la bonne étiquette2 contrôle en temps opportun les changements de tension ADC. Le code et le code de l'algorithme sont les suivants.

//--------ADC-------
int adcPin = 32; // GPIO32, also ADC-CH4
int adcValue = 0;
int num19_6 = 0;
 delay(10);   
 adcValue = analogRead(adcPin); // Read in the value of the AD conversion
 adcValue = adcValue/20;
  //-----SPO2 curve plotting ------
  num19_6 += 1;
  if(num19_6 >= 4){ // one point every 40ms
    num19_6 = 0;
        Serial.print("ST<{\"cmd_code\":\"set_value\",\"type\":\"line_series\",\"widget\":\"line_series2\",\"mode\":\"push\",\"value\":" );
    Serial.print(adcValue);
    Serial.println("}>ET");      
    adcValue = (adcValue*10)/21;
        Serial.print("ST<{\"cmd_code\":\"set_value\",\"type\":\"label\",\"widget\":\"label2\",\"value\":");
    Serial.print(adcValue);
    Serial.println("}>ET");      
  }

Fig. (11) Les 3 groupes de courbes réels complétés partiellement
Fig. (11) Les 3 groupes de courbes réels complétés partiellement

Voir la figure (11) pour une vue partielle de l'image réelle et la figure (12) pour l'interface de conception dans l'ordinateur. Comme dans la figure (3), lorsque le show = false de la ligne de séparation de l'axe X2 de la vue graphique2, la barre de séparation de la zone SPO2 jaune au milieu de la figure (12) éteindra l'affichage (comme le vrai image); la forme d'onde lisse de l'affichage vidéo peut être entièrement réalisée comme un oscilloscope en temps réel.

Figure (12) 3 séries de courbes complétées par ordinateur
Figure (12) 3 séries de courbes complétées par ordinateur

Points de référence

  • La structure du STONE le contrôle de la vue graphique de la plate-forme de concepteur est illustré à la figure (13). Il y a une description détaillée dans le manuel de l'utilisateur officiel 8.1, y compris l'explication de chaque propriété et paramètre ; le jeu d'instructions 4.24 donne la méthode de poussée de données, voir la figure (14), et il y a des exemples d'instructions utilisées dans le programme ici.
Figure (13) Structure de la vue graphique du contrôle de la courbe
Figure (13) Structure de la vue graphique du contrôle de la courbe
Figure (14) Instructions d'utilisation de la vue graphique de la commande de courbe
Figure (14) Instructions d'utilisation de la vue graphique de la commande de courbe

2. La fonction de lecture analogRead() d'Arduino pour la conversion AD analogique. Dans le menu Arduino version 1.8.13 "Help"—"Reference" —- "learning —– "Analog I/O", vous pouvez voir la description de la fonction analogRead() comme suit.

analogRead ()

Description

La carte Arduino contient un convertisseur analogique-numérique 6 bits à 8 canaux (16 canaux sur le Mini et le Nano, 10 sur le Mega). Cela signifie qu'il cartographiera les tensions d'entrée entre 0 et 5 volts en valeurs entières entre 0 et 1023. Cela donne une résolution entre les lectures de 5 volts / 1024 unités ou 0049 volts (4.9 mV) par unité. analogReference ()

Il faut environ 100 microsecondes (0.0001 s) pour lire une entrée analogique, de sorte que la vitesse de lecture maximale est d'environ 10,000 XNUMX fois par seconde.

Syntaxe

lecture analogique (broche)

Paramètres

pin : le nombre de broches d'entrée analogiques à lire (0 à 5 sur la plupart des cartes, 0 à 7 sur la Mini et la Nano, 0 à 15 sur la Mega)

Retours et remboursements

entier (0 à 1023)

Notes

Si la broche d'entrée analogique n'est connectée à rien, la valeur renvoyée par analogRead() fluctuera en fonction d'un certain nombre de facteurs (par exemple, les valeurs des autres entrées analogiques, la proximité de votre main avec la carte, etc.).

Cependant, veuillez noter qu'ici l'ADC-CH4 de l'ESP32 est de 12 bits et la valeur de retour sera de 0 à 4096. Pour plus de détails, veuillez vous référer au lien connexe dans l'article d'origine et au manuel de l'ESP32.

stone_tft_lcd_module_touch_screen_display_hmi_display (23)

stone_tft_lcd_module_touch_screen_display_hmi_display (23)

Remonter en haut