Utilisation de boutons poussoirs pour lancer procédure d'étalonnage d'une sonde

Bonjour,

je dispose d’une sonde de conductivité DFrobot DFR0300 : Gravity__Analog_Electrical_Conductivity_Sensor___Meter_V2__K=1__SKU_DFR0300-DFRobot

Dans la documentation, il est indiqué que pour étalonner la sonde, il faut saisir “enterec” pour rentrer dans le mode de calibration puis “calec” et enfin “exitec” : j’ai testé avec le code exemple, ça fonctionne.
Le problème est que cette méthode nécessite une connexion à l’ordinateur rendant l’appareil moins mobile. J’ai donc pensé utiliser des boutons poussoirs pour envoyer les commandes des 3 étapes de l’étalonnage.
Avec mon code, l’appui sur le bouton Enter lance bien la procédure d’étalonnage (ligne 103) :

ec.calibration(voltage, temperature, Enter);

mais j’obtiens systématiquement un message d’erreur lorsque je veux calibrer ma sonde (ligne 116 : ec.calibration(voltage, temperature, Cal); ) : j’imagine que le problème vient du fait qu’avec cette ligne de code je relance la procédure d’étalonnage qui ne se fait donc pas du coup.

Pourriez-vous m’aider à régler mon problème ?

//IMPORT DES BIBLIOTHEQUES UTILISEES
#include "DFRobot_EC_conductivite2.h"         //module conductimétrique
#include <EEPROM.h>             //module de la mémoire pour stocker les mesures du pH à court terme
#include <Wire.h>               //module wire pour la communication avec le protocole I2C 
#include<LiquidCrystal_I2C.h>   //bibliothèque pour l'écran lcd connecté en I2C

//Définition des connexions utilisées sur la carte Arduino
#define EC_PIN A2           //sonde conductimétrique
#define pinBoutonEnter  2   //bouton ENTER
#define pinBoutonCal  4     //bouton CAL
#define pinBoutonExit  7    //bouton EXIT


//DEFINITION DES VARIABLES UTILISEES PAR LE CAPTEUR DE CONDUCTIVITE (voir bibliothèque associée)
float voltage, ecValue, temperature = 25;

//SIMPLIFICATION DES APPELS AU MODULE DE CONDUCTIVITE ET A L'ECRAN LCD
DFRobot_EC ec;
LiquidCrystal_I2C lcd(0x27, 20, 4);

//DEFINITION DES CONSTANTES DU PROGRAMME
const unsigned long flux = 250000; //flux de la liaison série
const unsigned int cycles = 1000; //nombre de cycle pour la moyenne

//DEFINITION DES VARIABLES DE TEST POUR LA CALIBRATION DU CAPTEUR (transformation de l'appui d'un bouton en l'envoi d'une commande, voir la bibliotheque)
boolean lastBoutonEnter = HIGH;  //variable pour connaître l'état du bouton Enter lors du dernier appui
boolean lastBoutonCal = HIGH;    //variable pour connaître l'état du bouton Cal lors du dernier appui
boolean lastBoutonExit = HIGH;   //variable pour connaître l'état du bouton Exit lors du dernier appu

boolean etatBoutonEnter;        //variable pour connaître l'état courant du bouton Enter lors du dernier appui
boolean etatBoutonCal;          //variable pour connaître l'état courant du bouton Cal lors du dernier appui
boolean etatBoutonExit;         //variable pour connaître l'état courant du bouton Exit lors du dernier appui

boolean testBoutonEnter = 0; //variable pour savoir si on rentre dans la boucle de calibration
boolean testBoutonCal = 0; //variable pour savoir si on valide l'étalonnage
boolean testEtalonnage = 0; //variable pour savoir si l'etalonnage est fini

byte choixMode; //variable pour connaitre le mode de mesure (mesure simple, dosage, suivi cinétique)

//DEFINITION DES COMMANDES A ENVOYER POUR LA CALIBRATION (voir blibliotèque de la sonde)
char Enter[] = "ENTEREC" ;
char Cal[] = "CALEC" ;
char Exit[] = "EXITEC" ;


int topDepart = 0; //variable pour déclencher l'acquisition
String envoi;

unsigned long tempsZero;
unsigned long tempsCourant;
unsigned long tempsPrec;

float resultatec;

void setup()
{
  //initialisation de la liaison série, du module pH et du lcd et du capteur de température
  Serial.begin(flux);
  ec.begin();
  lcd.init(); // initialisation de l'afficheur

  //Défintion des pins des boutons poussoirs en entrée
  pinMode(pinBoutonEnter, INPUT_PULLUP);
  pinMode(pinBoutonCal, INPUT_PULLUP);
  pinMode(pinBoutonExit, INPUT_PULLUP);


  //activation du rétro éclairage
  lcd.backlight();


  testBoutonEnter = 0;

  lcd.clear();
  while (testEtalonnage == 0)
  {
    etalonnage();
  }
}

void loop()
{
}


void etalonnage() //fonction qui lance la procédure d'étalonnage du capteur
{
  //Affichage sur LCD par fonction
  affiche_texte_lcd(5, 0, "ETALONNAGE");
  delay(1000);
  affiche_texte_lcd(0, 1, "Plonger sonde dans");
  affiche_texte_lcd(0, 2, "solution etalon");
  affiche_texte_lcd(0, 3, "Appuyer ENTER si OK");


  //temperature = readTemperature();  // mesure de la température via la fonction readTemperature dédiée

  // on teste si le bouton ENTER est pressé
  etatBoutonEnter = digitalRead(pinBoutonEnter);  //si enter est presse etatBoutonEnter=LOW=0 car pin en mode pull up interne
  if (etatBoutonEnter < lastBoutonEnter)  //si le bouton était précédemment non appuyé alors lastBoutonEnter=1=HIGH
  {
    testBoutonEnter = 1;
    ec.calibration(voltage, temperature, Enter); // on envoie la commande ENTEREC au module pour commencer la calibration
    lcd.backlight();
    lcd.clear();


    if (lastBoutonCal == HIGH)   // on  teste si Cal n'est pas appuyé après que le bouton Enter ait été appuyé
      while (testBoutonEnter == 1)
      { // on teste si le bouton CAL est pressé --> si oui, on valide l'étalonnage
        etatBoutonCal = digitalRead(pinBoutonCal);  //on lit l'état du bouton Cal
        if (etatBoutonCal == 0) //si le bouton Cal est pressé alors etatBoutonCal=LOW=0 car pin en mode pull up interne
        {
          lcd.backlight();
          lcd.clear();
          ec.calibration(voltage, temperature, Cal); // on envoie la commande ENTEREC au module pour commencer la calibration
          lcd.backlight();
          affiche_texte_lcd(0, 0, "->Etalonnage reussi ");
          affiche_texte_lcd(0, 1, "EXIT pour sauvegarde");
          affiche_texte_lcd(0, 2, "et pour quitter     ");
          testBoutonCal = 1;
        }
        if (lastBoutonExit == HIGH)   // Appui sur E après appui maintenu sur Enter
          while (testBoutonCal == 1)
          {
            etatBoutonExit = digitalRead(pinBoutonExit);
            if (etatBoutonExit == 0)
            {
              lcd.backlight();
              lcd.clear();
              Serial.println("exitec");
              lcd.backlight();
              affiche_texte_lcd(0, 0, "->Etalonnage termine");
              delay(1000);
              lcd.clear();
              testBoutonEnter = 0;
              testBoutonCal = 0;
              testEtalonnage = 1;
              break;
            }
          }
      }
  }
  else
  {
    etatBoutonCal = digitalRead(pinBoutonCal);
    etatBoutonExit = digitalRead(pinBoutonExit);
    if (etatBoutonExit > lastBoutonExit && etatBoutonCal == 0)
    {
      ec.calibration(voltage, temperature, Exit); // on envoie la commande ENTEREC au module pour commencer la calibration
      lcd.backlight();
      lcd.clear();
      affiche_texte_lcd(0, 0, "->Etalonnage arrete");
      delay(2000);
      lcd.clear();
    }
  }
  lastBoutonEnter = etatBoutonEnter;
  lastBoutonCal  = etatBoutonCal;
  lastBoutonExit = etatBoutonExit;
}

void affiche_texte_lcd(byte caractere, byte ligne, String texte)
{
  lcd.setCursor(caractere, ligne);
  lcd.print(texte);
}

Merci d’avance.

le fichier cpp : DFRobot-EC-conductivite2.cpp
le fichier h correspondant : DFRobot-EC-conductivite2.h

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.