[RÉSOLU par Lesept] Projet Respirateur avec Pompe à Air !!!

Salut les amis

Tout d’abord je vous souhaite à chacun de bons moment malgré la situation difficile, santé, paix, réussite et bonheur à chacun.

Suite à une trouvaille de projet assez cool sur la fabrication d’un “Respirateur fait maison” et voulant changé le code source pour utilisé un LCD 1602 I2C au lieu du OLED I2C utilisé dans le code, je me retrouve en difficulté pour cette modification d’ou ma demande de rescousse aux Vrais, au expérimentées, connaisseurs, à la communauté.

Présentation du projet :

Big Respect à Adamcullen, l’auteur du projet.

Le matériels :

  • Pompe à air 12V DC (pour gonflé les gros ballons, matelas gonflable etc… pas cher)
  • Un microcontroleur Arduino Nano ou Uno…
  • Un module (L298N)
  • 4 potentiomètres rotatif
  • Un tuyau flexible de machine à laver ou similaire
  • Masque respiratoire “dans l’exemple c’est un 3M 6800” ou similaire masque d’apnée…
  • Embout réducteur BSP 1x 1/4
  • Embout réducteur BSP 1x 3/4
  • Adaptateur tuyau de pression de 3/4 x 20 mm

Voici le schéma du montage :

Comme vous pouvais le constaté, rien de bien compliqué, le montage est assez simple

Une autre image avec l’écran Oled i2c ajouté :

Les embouts pour la modif :

Avec le masque modifié :

Le problème c’est que je n’est pas de Oled i2c mais seulement 1 LCD 1602 i2c d’où la nécessité de modifier le code pour le rendre compatible mais je n’arrive pas :-[

Donc voici le code avec Oled i2c :

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // Largeur d affichage OLED, en pixels
#define SCREEN_HEIGHT 64 // Hauteur d affichage OLED, en pixels

// Declaration pour un ecran SSD1306 connecte a I2C (broches SDA, SCL)
#define OLED_RESET     4 // Reinitialiser la broche # (ou -1 si vous partagez la broche de reinitialisation Arduino)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int breath = 1;
int i = 0;
int inP=1028; int inT=1028; int inP_v=1028; int inT_v=1028;
int outP=1028; int outT=1028; int outP_v=1028; int outT_v=1028;

void setup() {
  Serial.begin(9600);
  pinMode(9, OUTPUT);

  // SSD1306_SWITCHCAPVCC = generer une tension d affichage de 3,3 V en interne
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Adresse 0x3D pour 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Ne continuez pas, bouclez pour toujours
  }

  // Afficher le contenu initial du tampon d affichage a l'ecran -
  // la bibliotheque initialise cela avec un ecran de demarrage Adafruit.
  display.display();

  // Vider le tampon
  display.clearDisplay();
}

void loop() {
  // effacer l affichage et configurer les valeurs initiales

  

  // le prochain souffle est-il une inspiration ou une expiration? 
  if (breath !=0) {breath = 0;}
    else breath = 1;
    Serial.println(breath);

  // appliquer le code d'inspiration ou d'expiration
  switch (breath) {
    case 0: // Inspirer
    i = 0;
    Serial.println(i); Serial.println(inT_v);
      while (i <= inT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        inP = analogRead(A0);
        inT = analogRead(A3);
        inP_v = ceil(inP/100)*25.5;
        inT_v = round(inT/100);

        Serial.println("Breath in");

        // utiliser pour afficher les valeurs sur l'ecran OLED
        display.clearDisplay();
        display.setCursor(0,0); display.setTextSize(1); display.setTextColor(WHITE);
        display.print(F("DIY Ventilator v1.0")); 
        display.setCursor(0,16); display.setTextSize(2);
        display.print("BREATH IN");
        display.setCursor(0,40); display.setTextSize(1);
        display.print("Pressure: "); display.print(ceil(inP_v/2.55)); display.println("%");
        display.setCursor(0,50);
        display.print("Time: "); display.print(inT_v*400); display.println("ms.");
        display.display();

        // nous allons produire la tension PWM et retarder seulement 400 ms ici et boucler sur un maximum de 10 periodes 
        // cela nous permet de relire la pression et le temps toutes les 400 ms à la fin de chaque cycle de respiration
        analogWrite(9, inP_v); 
        delay(400); 
        i++;        
      }
      break;

    case 1: // expirer
    i = 0;
      while (i <= outT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        outP = analogRead(A1);
        outT = analogRead(A2);
        outP_v = ceil(outP/100)*25.5;
        outT_v = round(outT/100);

        Serial.println("Breath out");
        
        // utiliser pour afficher les valeurs sur l'ecran OLED
        display.clearDisplay();
        display.setCursor(0,0); display.setTextSize(1); display.setTextColor(WHITE);
        display.print(F("DIY Ventilator v1.0")); 
        display.setCursor(0,16); display.setTextSize(2);
        display.setCursor(0,16); display.setTextSize(2);
        display.print("BREATH OUT");
        display.setCursor(0,40); display.setTextSize(1);
        display.print("Pressure: "); display.print(ceil(outP_v/2.55)); display.println("%");
        display.setCursor(0,50);
        display.print("Time: "); display.print(outT_v*400); display.println("ms.");
        display.display();
        
        // nous allons produire la tension PWM et retarder seulement 400 ms ici et boucler sur un maximum de 10 périodes 
        // cela nous permet de relire la pression et le temps toutes les 400 ms a la fin de chaque cycle de respiration
        analogWrite(9, outP_v);
        delay(400);
        i++;
      }
      break;
  }
  
}// boucle de fin

Voici le code modifié :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16,2);
// LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 

void setup() 

{
  Serial.begin(9600);
  pinMode(9, OUTPUT);
  lcd.begin(16,2);
  lcd.setBacklight(HIGH);
  
  lcd.setCursor(0,0);
   
  lcd.print("*** LCD I2C ****");
  
  lcd.setCursor(0,1);  
  lcd.print("-Andrologiciels-");
  
  delay(5000); 
  
  }

  
void loop() 

{
  // effacer l affichage et configurer les valeurs initiales

  

  // le prochain souffle est-il une inspiration ou une expiration? 
  if (breath !=0) {breath = 0;}
    else breath = 1;
    Serial.println(breath);

  // appliquer le code d'inspiration ou d'expiration
  switch (breath) {
    case 0: // Inspirer
    i = 0;
    Serial.println(i); Serial.println(inT_v);
      while (i <= inT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        inP = analogRead(A0);
        inT = analogRead(A3);
        inP_v = ceil(inP/100)*25.5;
        inT_v = round(inT/100);

        Serial.println("Breath in");

        // utiliser pour afficher les valeurs sur l'ecran OLED
        display.clearDisplay();
        display.setCursor(0,0); display.setTextSize(1); display.setTextColor(WHITE);
        display.print(F("DIY Ventilator v1.0")); 
        display.setCursor(0,16); display.setTextSize(2);
        display.print("BREATH IN");
        display.setCursor(0,40); display.setTextSize(1);
        display.print("Pressure: "); display.print(ceil(inP_v/2.55)); display.println("%");
        display.setCursor(0,50);
        display.print("Time: "); display.print(inT_v*400); display.println("ms.");
        display.display();

        // nous allons produire la tension PWM et retarder seulement 400 ms ici et boucler sur un maximum de 10 periodes 
        // cela nous permet de relire la pression et le temps toutes les 400 ms à la fin de chaque cycle de respiration
        analogWrite(9, inP_v); 
        delay(400); 
        i++;        
      }
      break;

    case 1: // expirer
    i = 0;
      while (i <= outT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        outP = analogRead(A1);
        outT = analogRead(A2);
        outP_v = ceil(outP/100)*25.5;
        outT_v = round(outT/100);

        Serial.println("Breath out");
        
        // utiliser pour afficher les valeurs sur l'ecran OLED
        display.clearDisplay();
        display.setCursor(0,0); display.setTextSize(1); display.setTextColor(WHITE);
        display.print(F("DIY Ventilator v1.0")); 
        display.setCursor(0,16); display.setTextSize(2);
        display.setCursor(0,16); display.setTextSize(2);
        display.print("BREATH OUT");
        display.setCursor(0,40); display.setTextSize(1);
        display.print("Pressure: "); display.print(ceil(outP_v/2.55)); display.println("%");
        display.setCursor(0,50);
        display.print("Time: "); display.print(outT_v*400); display.println("ms.");
        display.display();
        
        // nous allons produire la tension PWM et retarder seulement 400 ms ici et boucler sur un maximum de 10 périodes 
        // cela nous permet de relire la pression et le temps toutes les 400 ms a la fin de chaque cycle de respiration
        analogWrite(9, outP_v);
        delay(400);
        i++;
      }
      break;
  }
  
}// boucle de fin

:-* (je sais je suis nul)

Toute aide, orientation, guidage serais le bienvenu, merci et Karma d’avance. J’en profite pour remercier l’auteur “Adamcullen” respect à lui.

Merci.

Salut les amis

Après travaux et modification j’obtiens bien un affichage avec le nom de l’auteur et la note “Respirator V1” mais rien d’autre, je pense que la partie “void setup()” et (ou) “void loop()” n’est pas bon,

Du coup de continue mes recherches pas évident, voici la dernière mise à jour :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16,2); 

int breath = 1;
int i = 0;
int inP=1028; int inT=1028; int inP_v=1028; int inT_v=1028;
int outP=1028; int outT=1028; int outP_v=1028; int outT_v=1028;

void setup() 

{ 
  lcd.init();
  
  lcd.backlight(); 
    
  Serial.begin(9600);
  
  pinMode(9, OUTPUT);
   
  lcd.print("Adamcullen");
  
  lcd.setCursor(0,1);  
  
  lcd.print("-Respirator-V1");
  
  delay(5000); 
  
  }

void loop() {
  // effacer l affichage et configurer les valeurs initiales

 // le prochain souffle est-il une inspiration ou une expiration? 
  if (breath !=0) {breath = 0;}
    else breath = 1;
    Serial.println(breath);

  // appliquer le code d'inspiration ou d'expiration
  switch (breath) {
    case 0: // Inspirer
    i = 0;
    Serial.println(i); Serial.println(inT_v);
      while (i <= inT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        inP = analogRead(A0);
        inT = analogRead(A3);
        inP_v = ceil(inP/100)*25.5;
        inT_v = round(inT/100);

        Serial.println("Breath in");

        // utiliser pour afficher les valeurs sur l'ecran OLED
   

        // nous allons produire la tension PWM et retarder seulement 400 ms ici et boucler sur un maximum de 10 periodes 
        // cela nous permet de relire la pression et le temps toutes les 400 ms à la fin de chaque cycle de respiration
        analogWrite(9, inP_v); 
        delay(400); 
        i++;        
      }
      break;

    case 1: // expirer
    i = 0;
      while (i <= outT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        outP = analogRead(A1);
        outT = analogRead(A2);
        outP_v = ceil(outP/100)*25.5;
        outT_v = round(outT/100);

        Serial.println("Breath out");
        analogWrite(9, outP_v);
        delay(400);
        i++;
      }
      break;
  }
  
}// boucle de fin

merci

Pour afficher un texte sur ton écran lcd, tu n'as besoin que de deux commandes.

lcd.setCursor(0,1);  
lcd.print("-Respirator-V1");

La première positionne le curseur à l'endroit que tu veux (ligne, colonne), la seconde affiche ton texte à cet endroit.

Tout ce que tu as à faire, c'est mettre ces lignes là où tu veux afficher du texte, en choisissant les bonnes valeurs pour ligne et colonne. N'oublie pas qu'en C tout commence à 0...

Salut Lesept

Merci infiniment pour ton guidage, c'est l'aide / info qui me fallait, j'attaque le code pour modifier avec les deux lignes :

lcd.setCursor(0,1) ou (2);  
lcd.print("xxxxxxx");

d'accord, je comprends mieux, te souhaitant que du bonheur.

Re

Vraiment pas de bol pour moi, je suis trop amateur

J'ai ajouté après la ligne "void loop ()" sous la ligne :

Serial.println(breath); le morceau lcd.setCursor(0,1) ou (2); ce qui me donnais ;

lcd.setCursor(0,1);
Serial.println(breath);

ensuite...

lcd.setCursor(0,1);
Serial.println("Breath in");

puis sur

lcd.setCursor(0,1); 
Serial.println("Breath out");

Mais j'avais des erreurs de compilation dù à ces ajouts, la route est encore longue, je sens que ca vas galérer :cold_sweat:

Bon je ne baisse pas les bras je continue les recherches, merci en tout cas pour ton soutien,

Respect à Lesept.

Bonjour,

Belle initiative et je te félicite pour ton altruisme. Cela dit, il faut garder en tête que nos MCU sont pour la plupart des dispositifs de développement donc souvent encore plus ou moins fiables. Idem pour ta pompe "pas chère" qui est censée fonctionner de manière continue.

Comme les respirateurs sont destinés à des personnes en situation critique, la moindre anomalie pourrait avoir des conséquences dramatiques.

Penses-y dans ta réalisation

Cordialement

Il y a aussi

  • lcd.clear() pour effacer l’écran, et mettre le curseur en haut à gauche
  • lcd.home() pour positionner le curseur en haut à gauche

Les arguments de lcd.setCursor sont d’abord la colonne, puis la ligne, contrairement à ce que je t’ai dit plus haut.

La liste des commandes est ici.

Essaye ceci :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

int breath = 1;
int i = 0;
int inP = 1028; int inT = 1028; int inP_v = 1028; int inT_v = 1028;
int outP = 1028; int outT = 1028; int outP_v = 1028; int outT_v = 1028;

void setup()

{
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);
  pinMode(9, OUTPUT);
  lcd.print("Adamcullen");
  lcd.setCursor(0, 1);
  lcd.print("-Respirator-V1");
  delay(5000);
}

void loop() {
  // effacer l affichage et configurer les valeurs initiales

  // le prochain souffle est-il une inspiration ou une expiration?
  if (breath != 0) {
    breath = 0;
  }
  else breath = 1;
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print(breath);
  Serial.println(breath);

  // appliquer le code d'inspiration ou d'expiration
  switch (breath) {
    case 0: // Inspirer
      i = 0;
      Serial.println(i); Serial.println(inT_v);
      while (i <= inT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        inP = analogRead(A0);
        inT = analogRead(A3);
        inP_v = ceil(inP / 100) * 25.5;
        inT_v = round(inT / 100);

        Serial.println("Breath in");
        lcd.clear();
        lcd.print(""Breath in");
        // utiliser pour afficher les valeurs sur l'ecran OLED


        // nous allons produire la tension PWM et retarder seulement 400 ms ici et boucler sur un maximum de 10 periodes
        // cela nous permet de relire la pression et le temps toutes les 400 ms à la fin de chaque cycle de respiration
        analogWrite(9, inP_v);
        delay(400);
        i++;
      }
      break;

    case 1: // expirer
      i = 0;
      while (i <= outT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        outP = analogRead(A1);
        outT = analogRead(A2);
        outP_v = ceil(outP / 100) * 25.5;
        outT_v = round(outT / 100);

        Serial.println("Breath out");
        lcd.clear();
        lcd.print(""Breath out");
        analogWrite(9, outP_v);
        delay(400);
        i++;
      }
      break;
  }

}// boucle de fin

Ceci

 if (breath != 0) {
   breath = 0;
 }
 else breath = 1;

peut s'écrire

breath = 1 - breath;

Lacuzon:
Bonjour,

Belle initiative et je te félicite pour ton altruisme. Cela dit, il faut garder en tête que nos MCU sont pour la plupart des dispositifs de développement donc souvent encore plus ou moins fiables. Idem pour ta pompe "pas chère" qui est censée fonctionner de manière continue.

Comme les respirateurs sont destinés à des personnes en situation critique, la moindre anomalie pourrait avoir des conséquences dramatiques.

Penses-y dans ta réalisation

Cordialement

Salut Lacuzon

Merci pour ton message motivant, en effet j'ai pensais aux conséquence que cela pourrais avoir si utilisé continuellement, perso c'est juste pour une expérience personnel et avoir quelque chose sous la main.

La machine à été testé pendant 36 heures en continu sans problème, le moteur tourne pas à pas au rythme de la respiration avec des courtes arrets. Je compte aussi ajouté un mini humidificateur pour humidifier l'air (genre nébuliseur) mais c'est clair que cela ne remplace en aucun cas le respirateur pro de l'hopital etc...

Merci pour la mise en garde.

Salut cher Lesept

Merci infiniment, toujours Lesept et toujours des info / conseils très utile, Respect pour LESEPT merci pour le lien et pour ton soutien

J'ai essayé de compilé le code mais j'avais une erreur

Arduino : 1.8.12 (Linux), Carte : "Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

sketch_apr07b:51:30: error: missing terminating " character
         lcd.print(""Breath in");
                              ^~~
sketch_apr07b:74:31: error: missing terminating " character
         lcd.print(""Breath out");
                               ^~~
/tmp/arduino_modified_sketch_982058/sketch_apr07b.ino: In function 'void loop()':
sketch_apr07b:51:19: error: unable to find string literal operator 'operator""Breath' with 'const char [1]', 'unsigned int' arguments
         lcd.print(""Breath in");
                   ^~~~~~~~
sketch_apr07b:74:19: error: unable to find string literal operator 'operator""Breath' with 'const char [1]', 'unsigned int' arguments
         lcd.print(""Breath out");
                   ^~~~~~~~
exit status 1
missing terminating " character

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

J'ai suivi le conseil pour remplacé les morceaux des erreurs par :

breath = 1 - breath;

La compilation à été prise en compte, à l'allumage on lit le premier scetch
Ligne 1 (Adamcullen), Ligne 2 (Respirator V1) puis quelques secondes aprés l'écran est "clear" sans mot, les valeurs et indications n'apparaissent pas, je replonge dans le lien et le code, je dois surement loupé quelquechose.

Merci encore Lesept, pour ta patience de grand frère, je graverer ton pseudo sur le boitier du projet car sans ton aide j'aurais jamais réussi à avancé autant. Merci mille fois et Karma matin midi et soir.

à bientot...

Col68:
Salut cher Lesept

Merci infiniment, toujours Lesept et toujours des info / conseils très utile, Respect pour LESEPT merci pour le lien et pour ton soutien

J'ai essayé de compilé le code mais j'avais une erreur

Arduino : 1.8.12 (Linux), Carte : "Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

sketch_apr07b:51:30: error: missing terminating " character
        lcd.print(""Breath in");
                              ^~~
sketch_apr07b:74:31: error: missing terminating " character
        lcd.print(""Breath out");
                              ^~~
/tmp/arduino_modified_sketch_982058/sketch_apr07b.ino: In function 'void loop()':
sketch_apr07b:51:19: error: unable to find string literal operator 'operator""Breath' with 'const char [1]', 'unsigned int' arguments
        lcd.print(""Breath in");
                  ^~~~~~~~
sketch_apr07b:74:19: error: unable to find string literal operator 'operator""Breath' with 'const char [1]', 'unsigned int' arguments
        lcd.print(""Breath out");
                  ^~~~~~~~
exit status 1
missing terminating " character

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.




J'ai suivi le conseil pour remplacé les morceaux des erreurs par : 



breath = 1 - breath;




La compilation à été prise en compte, à l'allumage on lit le premier scetch 
Ligne 1 (Adamcullen), Ligne 2 (Respirator V1) puis quelques secondes aprés l'écran est "clear" sans mot, les valeurs et indications n'apparaissent pas, je replonge dans le lien et le code, je dois surement loupé quelquechose.

Merci encore Lesept, pour ta patience de grand frère, je graverais ton pseudo sur le boitier du projet car sans ton aide j'aurais jamais réussi à avancé autant. Merci mille fois et Karma matin midi et soir.

à bientot...

Les erreurs sont dues à mon inattention : j’ai mis deux " alors qu’il n’en faut qu’une. Voici une version corrigée.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

int breath = 1;
int i = 0;
int inP = 1028; int inT = 1028; int inP_v = 1028; int inT_v = 1028;
int outP = 1028; int outT = 1028; int outP_v = 1028; int outT_v = 1028;

void setup()

{
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);
  pinMode(9, OUTPUT);
  lcd.print("Adamcullen");
  lcd.setCursor(0, 1);
  lcd.print("-Respirator-V1");
  delay(5000);
}

void loop() {
  // effacer l affichage et configurer les valeurs initiales

  // le prochain souffle est-il une inspiration ou une expiration?
  breath = 1 - breath;

  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print(breath);
  Serial.println(breath);

  // appliquer le code d'inspiration ou d'expiration
  switch (breath) {
    case 0: // Inspirer
      i = 0;
      Serial.println(i); Serial.println(inT_v);
      while (i <= inT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        inP = analogRead(A0);
        inT = analogRead(A3);
        inP_v = ceil(inP / 100) * 25.5;
        inT_v = round(inT / 100);

        Serial.println("Breath in");
        lcd.clear();
        lcd.setCursor (0,1);
        lcd.print("Breath in");

        // nous allons produire la tension PWM et retarder seulement 400 ms ici et boucler sur un maximum de 10 periodes
        // cela nous permet de relire la pression et le temps toutes les 400 ms à la fin de chaque cycle de respiration
        analogWrite(9, inP_v);
        delay(400);
        i++;
      }
      break;

    case 1: // expirer
      i = 0;
      while (i <= outT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        outP = analogRead(A1);
        outT = analogRead(A2);
        outP_v = ceil(outP / 100) * 25.5;
        outT_v = round(outT / 100);

        Serial.println("Breath out");
        lcd.clear();
        lcd.setCursor (0,1);
        lcd.print("Breath out");
        analogWrite(9, outP_v);
        delay(400);
        i++;
      }
      break;
  }

}// boucle de fin

C’est étonnant que rien ne s’affiche sur le LCD… Est-ce mieux comme ça ?

Puréeee je t'aime 8) LESEPT 8)

Merci infiniment, tu est trop fort, j'ai remplis le dossier "scetch" du soft arduino tellement que j'ai essayé des solutions en modifiant... sans jamais réussir, je suis vraiment trop nul.

C'est ok donc juste aprés le scetch de présentation (Adamcullen) et (Respirator V1) j'ai "Breat In" ou "Breat out" sur la ligne 2 (en bas) selon la valeur respiratoire réglé par les potentiomètres, magnifique, tu est un génie.

Que tout tes souhaits se réalisent, que la santé, la réussite et le bonheur soit avec toi, merci infiniment.

Me reste à affiché les valeurs comme sur l'exemple de l'auteur "Pression en pourcentage et la durée de pression" sur la ligne 1 qui reste vide et la mission est accompli pour un montage en boitier.

Karma pour LESEPT matin midi soir.

Merci.

Essaye ça:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

int breath = 1;
int i = 0;
int inP = 1028; int inT = 1028; int inP_v = 1028; int inT_v = 1028;
int outP = 1028; int outT = 1028; int outP_v = 1028; int outT_v = 1028;

void setup()

{
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);
  pinMode(9, OUTPUT);
  lcd.print("Adamcullen");
  lcd.setCursor(0, 1);
  lcd.print("-Respirator-V1");
  delay(5000);
}

void loop() {
  char texte[21];
  // effacer l affichage et configurer les valeurs initiales

  // le prochain souffle est-il une inspiration ou une expiration?
  breath = 1 - breath;

  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print(breath);
  Serial.println(breath);

  // appliquer le code d'inspiration ou d'expiration
  switch (breath) {
    case 0: // Inspirer
      i = 0;
      Serial.println(i); Serial.println(inT_v);
      while (i <= inT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        inP = analogRead(A0);
        inT = analogRead(A3);
        inP_v = ceil(inP / 100) * 25.5;
        inT_v = round(inT / 100);

        Serial.println("Breath in");
        lcd.clear();
        lcd.setCursor (0, 1);
        lcd.print("Breath in");
        sprintf(texte, "P=%d%%, T=%ds", inP_v, inT_v);
        lcd.home ();
        lcd.print(texte);


        // nous allons produire la tension PWM et retarder seulement 400 ms ici et boucler sur un maximum de 10 periodes
        // cela nous permet de relire la pression et le temps toutes les 400 ms à la fin de chaque cycle de respiration
        analogWrite(9, inP_v);
        delay(400);
        i++;
      }
      break;

    case 1: // expirer
      i = 0;
      while (i <= outT_v) {
        // lire les potentiometres et determiner la pression respiratoire et le temps
        outP = analogRead(A1);
        outT = analogRead(A2);
        outP_v = ceil(outP / 100) * 25.5;
        outT_v = round(outT / 100);

        Serial.println("Breath out");
        lcd.clear();
        lcd.setCursor (0, 1);
        lcd.print("Breath out");
        sprintf(texte, "P=%d%%, T=%ds", inP_v, inT_v);
        lcd.home ();
        lcd.print(texte);
        analogWrite(9, outP_v);
        delay(400);
        i++;
      }
      break;
  }

}// boucle de fin
  1. LESEEEEEEEEPPPPPPTTTTT : 8)

Excuse mon enthousiasme !!! Trop trop trop fort

Big Respect pour Lesept

Tout fonctionne à merveille, franchement tu est trop fort, trop sympa, je n'oublierais pas, merci infiniment, limite ca force le respect, merci du fond du coeur grand frère.

Voici le résultat :

Pression de l'air à : 51 %
Temps (durée) : 7 secondes

Pression maximum en %

Autres réglages :

Pression 76%
Temps (durée) : 10 secondes

Pour finir, selon l'état du réglage on peu lire Breath In et Breath Out, inspirer et
expirer.

Merci, franchement tu m'as gater, grand merci grand frère, je partagerais l'image final dans le boitier.

Big big big Respect pour LESEP*T

Non, c'était assez simple. C'est ton projet qui est vrai et beau. Continue !

Bonjour cher ami Lesept

Merci infiniment, je n'oublierais pas ton aide qui m'à bien rendu service, tu est un génie, à chaque fois que je rentre sur Arduino Home, c'est directe Karma pour Lesept par respect :slight_smile: à ton service pour toute demande.

Santé, paix, réussite et bonheur à Lesept.

Bonjour les amis

J'espère que tout le monde va bien et vous souhaite, santé, courage et patience à tous.

Par Respect à mon cher ami ***** Lesept ***** qui m'à vraiment aidé ou encore mieux, m'à offert le code, je voulais partagé les images final du projet, on peut voir 4 potentiomètres au total

2 potentiomètres (à droite) pour réglé la durée de l'inspiration et expiration (représenté par la lettre "T")
et
2 potentiomètre (à gauche) pour réglé la pression de l'inspiration et expiration (représenté par la lettre "P")

Il me reste un filtre à charbon à installé sur l'embout d'arrivé d'air et un masque avec son tuyau pour pouvoir l'utilisé en autonome.

On peut ajouté un humidificateur pour humidifier l'air etc...finalement je suis assez satisfait.

PS: la langue est en turc (pour mes parents au cas ou) voila en gros le projet qui fini bien grace à Lesept, Karma matin/midi/soir pour ton aide, respect aussi à Adamcullen (un Australien) qui à partagé la base de ce projet.

Il y à un mini interrupteur On/Off sur le coté gauche (pas trop visible), l'alimentation principal est une prise Jack 2.1 mm pour 12 V, j'ai gardais la prise USB de l'Arduino vers l'exterieur afin de le programmé pour l'amélioré si nécessaire.

Merci et Respect à ***** Lesept *****

Bravo, c'est très beau, et très pro.
Il n'était pas nécessaire de mettre mon pseudo sur la boite, tu devrais mettre un texte du genre 'respirateur Arduino' par exemple...

Tu dis que les textes sont en Turc "pour tes parents" : tu as fait ce projet pour eux ?
Bravo encore. Mais comme disait Lacuzon, garde bien en tête que Arduino n'est pas forcément fait pour des projets liés à la santé.

Il y a parmi les membres du forum des professionnels qui pourraient te guider vers un autre microcontrôleur, peut-être plus adapté pour ce genre de besoin.