/* Outil de mesure de la dépression, de la pression absolue et de la différence entre 2 pressions absolues pour réglage des rampes de carburateur de vieilles moto et des alumeurs de vieilles voitures Auteur : Denis TAUVEL Version : Béta Date : 01/12/2019 Contact : denis.tauvel@free.fr */ // inclure la librairie: #include // librairie de l'afficheur LCD //#include // initialisation de l'afficheur ; LiquidCrystal lcd(2, 3, 4, 9, 10, 11, 12); // bornes de l'arduino pour RS, RW, E, D4, D5, D6 et D7 // Constantes de l'Arduino const int CONTRASTE = 5 ; // contraste sur borne 5 de l'arduino en PWM const int BACKLIGHT = 6 ; // rétroéclairage en borne 6 de l'arduino const int POTENTIOMETRE = A0 ; // potentiomètre câblé sur l'entrée A0 const int BP = A1 ; // bouton poussoir câblé sur l'entrée A1 const int CAPTEURGAUCHE = A3 ; // Capteur de pression gauche câblé sur l'entrée A3 const int CAPTEURDROIT = A4 ; // Capteur de pression droit câblé sur l'entrée A4 // Variables utilisées int valeurPotentiometre ; // variable globale pour la valeur du potentiomètre int pressionGauche ; // variable pour la valeur de la pression absolue gauche int pressionDroite ; // variable pour la valeur de la pression absolue droite int delta ; // variable pour la correction (equilibrage des capteurs) int pressionAtmo ; // variable pour la valeur de la pression atmosphérique int bargraph ; // variable pour la valeur du bargraph long totalGauche ; // variable pour la somme des mesures de pression côté gauche long totalDroite ; // variable pour la somme des mesures de pression côté droit byte debutVide[8] = { 0b00111, 0b11000, 0b10000, 0b10000, 0b10000, 0b10000, 0b11000, 0b00111 }; byte debutPlein[8] = { 0b00111, 0b11000, 0b10011, 0b10111, 0b10111, 0b10011, 0b11000, 0b00111 }; byte caseVide[8] = { 0b11111, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b11111 }; byte caseUn[8] = { 0b11111, 0b00000, 0b10000, 0b10000, 0b10000, 0b10000, 0b00000, 0b11111 }; byte caseDeux[8] = { 0b11111, 0b00000, 0b11000, 0b11000, 0b11000, 0b11000, 0b00000, 0b11111 }; byte caseTrois[8] = { 0b11111, 0b00000, 0b11100, 0b11100, 0b11100, 0b11100, 0b00000, 0b11111 }; byte caseQuatre[8] = { 0b11111, 0b00000, 0b11110, 0b11110, 0b11110, 0b11110, 0b00000, 0b11111 }; byte caseCinq[8] = { 0b11111, 0b00000, 0b11111, 0b11111, 0b11111, 0b11111, 0b00000, 0b11111 }; byte finVide[8] = { 0b11110, 0b00011, 0b00001, 0b00001, 0b00001, 0b00001, 0b00011, 0b11110 }; byte finPlein[8] = { 0b11110, 0b00011, 0b11001, 0b11101, 0b11101, 0b11001, 0b00011, 0b11110 }; void setup() { lcd.begin(16, 2); // afficheur 2 lignes de 16 caractères pinMode (BACKLIGHT, OUTPUT); // place en mode sortie logique la borne correspondant au rétroéclairage pinMode (CONTRASTE, OUTPUT); // place en mode sortie logique la borne correspondant au contraste pinMode (BP, INPUT_PULLUP); // place en mode entrée avec pul-up interne la borne correspondant au bouton poussoir digitalWrite(BACKLIGHT, HIGH); // allumer le rétroéclairage analogWrite(CONTRASTE, 0); // contraste au maxi lcd.print(" * Bonjour *"); // message d'accueil delay(1000); // attendre 1 seconde lcd.clear(); // effacer l'écran lcd.print(" reglage du "); // affichage ligne supérieure lcd.setCursor(0, 1) ; // passer à la deuxième ligne lcd.print("< contraste >"); // affichage ligne inférieure do { valeurPotentiometre = analogRead(POTENTIOMETRE); // variable pour retour de la valeur du potentiomètre valeurPotentiometre = map(valeurPotentiometre, 0, 1023, 0, 110); // transformer la valeur du potentiomètre en 0 à 110 analogWrite(CONTRASTE, valeurPotentiometre); // ajuste le contraste du LCD } while (digitalRead(BP) == HIGH); // boucler jusqu'à ce que le bouton poussoir soit enfoncé delay(500); // attendre 0,5 seconde pressionAtmo = analogRead(CAPTEURGAUCHE) ; pressionAtmo = map(pressionAtmo, 41, 962, 150, 1150); // transformer la valeur du capteur en 0 à 1230 mbar pressionDroite = analogRead(CAPTEURDROIT) ; pressionDroite = map(pressionDroite, 41, 962, 150, 1150); delta = pressionAtmo - pressionDroite ; // calcule la correction à appliquer au capteur droit } void loop() { // Choix de la fonction à utiliser lcd.clear(); // effacer l'écran lcd.print(" Choix fonction"); // affichage ligne supérieure delay(200); // attendre 200 millisecondes (filtrage anti-rebonds) do { valeurPotentiometre = analogRead(POTENTIOMETRE); // variable pour retour de la valeur du potentiomètre valeurPotentiometre = valeurPotentiometre + 333 ; // ajouter 333 pour centrer le choix potentiomètre valeurPotentiometre = map(valeurPotentiometre, 0, 1023, 1, 3); // transformer la valeur du potentiomètre en 1 à 2 switch (valeurPotentiometre) { case 1: lcd.setCursor(0, 1) ; // passer à la deuxième ligne lcd.print("< Synchro >"); // affichage ligne inférieure break; case 2: lcd.setCursor(0, 1) ; // passer à la deuxième ligne lcd.print("< Depression >"); // affichage ligne inférieure break; case 3: lcd.setCursor(0, 1) ; // passer à la deuxième ligne lcd.print("< P.absolue >"); // affichage ligne inférieure break; } } while (digitalRead(BP) == HIGH); // boucler jusqu'à ce que le bouton poussoir soit enfoncé delay(100); // temporisation antirebonds 100 ms while (digitalRead(BP) == LOW); // attendre que le bouton poussoir soit relâché switch (valeurPotentiometre) { case 1: synchronisation(); // aller au sous-programme synchronisation break; case 2: depressiometre(); // aller au sous programme dépressiomètre break; case 3: pressionabsolue(); // aller au sous programme pression absolue break; } } void synchronisation() { // Fonction synchronisation lcd.clear(); // effacer l'écran while (digitalRead(BP) == HIGH) { ; // boucler jusqu'à ce que le bouton poussoir soit enfoncé { totalGauche = 0 ; // initialisation des variables pour le calcul totalDroite = 0 ; for (int i = 0; i < 5000; ++i) { // éxécuter les mesures 5000 fois pressionGauche = analogRead(CAPTEURGAUCHE) ; // variable pour la valeur sur l'entrée A3 totalGauche = totalGauche + pressionGauche ; pressionDroite = analogRead(CAPTEURDROIT); // variable pour la valeur sur l'entrée A4 totalDroite = totalDroite + pressionDroite ; if (digitalRead(BP) == LOW) { // Sortir de la fonction si le bouton poussoir est enfoncé break; } } pressionGauche = totalGauche / 5000 ; // faire la moyenne des 5000 mesures pressionDroite = totalDroite / 5000 ; // faire la moyenne des 5000 mesures pressionGauche = map(pressionGauche, 41, 962, 150, 1150); // transformer la valeur du capteur en 0 à 1230 mbar pressionDroite = map(pressionDroite, 41, 962, 150, 1150); // transformer la valeur du capteur en 0 à 1230 mbar pressionDroite = pressionDroite + delta ; // valeurs corrigée lcd.clear(); // effacement de l'écran lcd.print(pressionGauche); // affichage ligne supérieure lcd.setCursor(7, 0) ; lcd.print("mb"); lcd.setCursor(12, 0) ; lcd.print(pressionDroite); bargraph = (pressionDroite - pressionGauche +70) / 2; // affichage de la ligne inférieure bargraph = constrain(bargraph, 0, 70); if (bargraph == 0) { lcd.createChar(0, debutVide); // crée l'extrémité gauche du bargraph vide } else { lcd.createChar(0, debutPlein); // crée l'extrémité gauche du bargraph plein } lcd.setCursor(0, 1) ; // passer à la deuxième ligne lcd.write((byte)0); lcd.createChar(1, caseVide); // crée le caractère bargarph vide lcd.createChar(2, caseUn); // crée le caractère bargarph 1 lcd.createChar(3, caseDeux); // crée le caractère bargarph 2 lcd.createChar(4, caseTrois); // crée le caractère bargarph 3 lcd.createChar(5, caseQuatre); // crée le caractère bargarph 4 lcd.createChar(6, caseCinq); // crée le caractère bargarph 5 if (bargraph == 70) { lcd.createChar(7, finPlein); // crée l'extrémité gauche du bargraph vide } else { lcd.createChar(7, finVide); // crée l'extrémité gauche du bargraph plein } lcd.setCursor(1, 1) ; // passer à la deuxième ligne deuxième caractère for (byte i = 1; i < 15; ++i) { if (bargraph >= 5) { lcd.write ((byte)6); } else { switch (bargraph) { case 0 : lcd.write ((byte)1); break; case 1 : lcd.write ((byte)2); break; case 2 : lcd.write ((byte)3); break; case 3 : lcd.write ((byte)4); break; case 4 : lcd.write ((byte)5); break; case 5 : lcd.write ((byte)6); break; } } bargraph = bargraph - 5; bargraph = constrain (bargraph, 0, 70); } lcd.setCursor(15, 1) ; // passer à la deuxième ligne dernier caractère lcd.write((byte)7); } delay(100); // temporisation antirebonds 100 ms while (digitalRead(BP) == LOW); // attendre que le bouton poussoir soit relâché// attendre 1 seconde// attendre 1 seconde } void depressiometre() { // Fonction dépressiomètre lcd.clear(); // effacer l'écran while (digitalRead(BP) == HIGH) { // boucler jusqu'à ce que le bouton poussoir soit enfoncé totalGauche = 0 ; // initialisation des variables pour le calcul for (int i = 0; i < 10000; ++i) { // éxécuter les mesures 10000 fois pressionGauche = analogRead(CAPTEURGAUCHE); // variable pour la valeur sur l'entrée A3 totalGauche = totalGauche + pressionGauche ; if (digitalRead(BP) == LOW) { // Sortir de la fonction si le bouton poussoir est enfoncé break; } } pressionGauche = totalGauche / 10000 ; // faire la moyenne des 10000 mesures pressionGauche = map(pressionGauche, 41, 962, 150, 1150); // transformer la valeur du capteur en 0 à 1230 mbar pressionGauche = pressionGauche - pressionAtmo ; // calcule la valeur de la dépression lcd.clear(); // effacer l'écran lcd.print("Press. "); // affichage ligne supérieure lcd.print(pressionGauche); lcd.print(" mb"); bargraph = map(pressionGauche,-850, 0, 70, 0); // définit le bargrah de 0 à 70 bargraph = constrain(bargraph, 0, 70); if (bargraph == 0) { lcd.createChar(0, debutVide); // crée l'extrémité gauche du bargraph vide } else { lcd.createChar(0, debutPlein); // crée l'extrémité gauche du bargraph plein } lcd.setCursor(0, 1) ; // passer à la deuxième ligne lcd.write((byte)0); lcd.createChar(1, caseVide); // crée le caractère bargarph vide lcd.createChar(2, caseUn); // crée le caractère bargarph 1 lcd.createChar(3, caseDeux); // crée le caractère bargarph 2 lcd.createChar(4, caseTrois); // crée le caractère bargarph 3 lcd.createChar(5, caseQuatre); // crée le caractère bargarph 4 lcd.createChar(6, caseCinq); // crée le caractère bargarph 5 if (bargraph == 70) { lcd.createChar(7, finPlein); // crée l'extrémité gauche du bargraph vide } else { lcd.createChar(7, finVide); // crée l'extrémité gauche du bargraph plein } lcd.setCursor(1, 1) ; // passer à la deuxième ligne deuxième caractère for (byte i = 1; i < 15; ++i) { if (bargraph > 5) { lcd.write ((byte)6); } else { switch (bargraph) { case 0 : lcd.write ((byte)1); break; case 1 : lcd.write ((byte)2); break; case 2 : lcd.write ((byte)3); break; case 3 : lcd.write ((byte)4); break; case 4 : lcd.write ((byte)5); break; case 5 : lcd.write ((byte)6); break; } } bargraph = bargraph - 5; bargraph = constrain (bargraph, 0, 70); } lcd.setCursor(15, 1) ; // passer à la deuxième ligne dernier caractère lcd.write((byte)7); } delay(100); // temporisation antirebonds 100 ms while (digitalRead(BP) == LOW); // attendre que le bouton poussoir soit relâché// attendre 1 seconde// attendre 1 seconde } void pressionabsolue() { // fonction pression absolue lcd.clear(); // effacer l'écran while (digitalRead(BP) == HIGH) { // boucler jusqu'à ce que le bouton poussoir soit enfoncé totalGauche = 0 ; // initialisation des variables pour le calcul for (int i = 0; i < 10000; ++i) { // éxécuter les mesures 10000 fois pressionGauche = analogRead(CAPTEURGAUCHE); // variable pour la valeur sur l'entrée A3 totalGauche = totalGauche + pressionGauche ; if (digitalRead(BP) == LOW) { // Sortir de la fonction si le bouton poussoir est enfoncé break; } } pressionGauche = totalGauche / 10000 ; // faire la moyenne des 10000 mesures pressionGauche = map(pressionGauche, 41, 962, 150, 1150); // transformer la valeur du capteur en 0 à 1230 mbar lcd.clear(); // effacer l'écran lcd.print("P.abs. : "); // affichage ligne inérieure lcd.print(pressionGauche); lcd.print("mb"); lcd.setCursor(0, 1) ; // passer à la deuxième ligne lcd.print(" "); pressionGauche = pressionGauche/1.33322; pressionGauche = floor(pressionGauche); lcd.print(pressionGauche); lcd.print("mmHg"); } }