Envoyer des commandes (texte) à Arduino

Bonjour

J'utilise un capteur pH avec Arduino : pour calibrer ma sonde, j'ai besoin de saisir du texte (dans le cas présent ENTERPH) (le capteur est celui-ci et sa documentation ).
J'ai fait l'essai, ça marche sans souci.
J'aimerai désormais pouvoir rendre plus autonome mon capteur sans avoir à utiliser un pc pour l'étalonner.

Mon idée était d'utiliser un bouton poussoir : en l'actionnant, cela transmettrai la commande (ENTERPH dans mon cas) et c'est là où je suis bloqué. J'ai essayé naïvement

boolean etatBouton=digitalRead(pinBouton);
    if (etatBouton !=lastBouton)
    {
      delay(20);
      if (etatBouton = HIGH)
      {
        Serial.print("ENTERPH");
      }
    }

mais cela ne fait qu'afficher le texte, ça ne le prend pas en compte : je vois bien le texte ENTERPH s'affiché lorsque je presse le bouton poussoir.

Est-ce que mon idée est bonne et si oui, comment puis-je procéder pour envoyer ma commande ?

Merci pour votre aide

Oui, l'idée est bonne, mais je ne vois pas comment tu envoies la commande à la sonde. Comment mets-tu la sonde en configuration de calibration ?

IL faudrait voir le reste du code, notamment l'endroit où tu reconnais la commande ENTERPH. A cet endroit tu dois lancer la phase de calibration. C'est ça que tu dois exécuter lorsque tu détectes un appui sur le bouton. Le Serial.print ne sert en effet qu'à afficher des données sur la console.

Dans un premier temps, j'ai utilisé le code tout fait donné en exemple avec le capteur

/*
 * file DFRobot_PH.ino
 * @ https://github.com/DFRobot/DFRobot_PH
 *
 * This is the sample code for Gravity: Analog pH Sensor / Meter Kit V2, SKU:SEN0161-V2
 * In order to guarantee precision, a temperature sensor such as DS18B20 is needed, to execute automatic temperature compensation.
 * You can send commands in the serial monitor to execute the calibration.
 * Serial Commands:
 *   enter -> enter the calibration mode
 *   cal -> calibrate with the standard buffer solution, two buffer solutions(4.0 and 7.0) will be automaticlly recognized
 *   exit -> save the calibrated parameters and exit from calibration mode
 *
 * Copyright   [DFRobot](http://www.dfrobot.com), 2018
 * Copyright   GNU Lesser General Public License
 *
 * version  V1.0
 * date  2018-04
 */

#include "DFRobot_PH.h"
#include <EEPROM.h>

#define PH_PIN A1
float voltage,phValue,temperature = 25;
DFRobot_PH ph;

void setup()
{
  Serial.begin(115200);
  ph.begin();
}

void loop()
{
    static unsigned long timepoint = millis();
    if(millis()-timepoint>1000U)  //time interval: 1s
    {
      timepoint = millis();
      voltage = analogRead(PH_PIN)/1024.0*5000;  // read the voltage
      //temperature = readTemperature();  // read your temperature sensor to execute temperature compensation
      phValue = ph.readPH(voltage,temperature);  // convert voltage to pH with temperature compensation
      Serial.print("temperature:");
      Serial.print(temperature,1);
      Serial.print("^C  pH:");
      Serial.println(phValue,2);
    }
    ph.calibration(voltage,temperature);  // calibration process by Serail CMD
}

float readTemperature()
{
  //add your code here to get the temperature from your temperature sensor
}

En tapant ENTERPH, je rentre dans le mode de calibration or, à partir de ta réflexion, comme cette partie est codée dans la librairie du capteur, j'en déduis qu'il faudrait en fait que cette intéraction avec le bouton soit mise dans la librairie ou plus exactement dans le fichier DFRobot_PH.cpp de la librairie ?*La librairie est disponible ici.

C'est la librairie qui attends un message sur la ligne série. L'interface de la sonde avec le monde extérieur c'est uniquement une sortie analogique vers l'Arduino.

Lors de l'appui sur le bouton, il faut appeler une fonction de la librairie pour lancer la calibration:
calibration(float voltage, float temperature,char* cmd)
cmd doit être une chaîne de caractères contenant ENTERPH
Les autres arguments doivent, je suppose, être connus de ton programme.

Merci pour l'aide.
J'ai corrigé le code avec ceci :

void loop()
{
     etatBoutonEnter=digitalRead(pinBoutonEnter);
    if (etatBoutonEnter != lastBoutonEnter)
    {
      delay(20);
      etatBoutonEnter=digitalRead(pinBoutonEnter);
      if (etatBoutonEnter == HIGH)
      {
        ph.calibration(voltage,temperature,"ENTERPH");  // calibration process by Serail CMD
      }
    } 
    else 
    {
      float resultatph=0.0;
      static unsigned long timepoint = millis();
      if(millis()-timepoint>5000U)  //time interval: 5s
      { 
        timepoint = millis();

        for (int i =0;i<cycles;i++)
        {
          voltage = analogRead(PH_PIN)/1024.0*5000;  // read the voltage
          //temperature = readTemperature();  // read your temperature sensor to execute temperature compensation
          phValue = ph.readPH(voltage,temperature);  // convert voltage to pH with temperature compensation
          //Serial.print("temperature:");
          //Serial.print(temperature,1);
          //Serial.print("^C  pH:");
          resultatph += phValue;
        }

        resultatph /= cycles;
      
        Serial.println(resultatph,2);
      }
    }
    lastBoutonEnter = etatBoutonEnter ;
       
}

Il fonctionne "à peu près" : si je ne fais rien, le pH est bien mesuré, si j'appuie sur le bouton d'étalonnage, il m'indique bien que je rentre dans le mode d'étalonnage.
Par contre, je voulais faire en sorte que lorsque le bouton est appuyé (en mode étalonnage donc), les mesures de pH ne se fassent plus : or dans mon cas, même si je suis dans le mode étalonnage, les mesures continuent à s'afficher.
Quelle erreur ai-je commise dans mon code ?

Le problème c'est que tu n'attends pas que le bouton soit relâché. Donc tu fais la calibration et ensuite tu passes dans la mesure.
Je te propose la modification suivante:

    if (etatBoutonEnter != lastBoutonEnter)
    {
       delay(20);
       etatBoutonEnter=digitalRead(pinBoutonEnter);
       if (etatBoutonEnter == HIGH)
       {
          ph.calibration(voltage,temperature,"ENTERPH");  // calibration process
       }
       while(digitalRead(pinBoutonEnter)); // attend qu'on relâche le bouton
    }

J'aimerai désormais pouvoir rendre plus autonome mon capteur sans avoir à utiliser un pc pour l'étalonner.

Cela impliquerait ... de ne pas avoir un PC sous la main, et de ne pas compter sur la liason série.
Une ébauche de solution consisterait à sacrifier quelques pattes sur l'arduino

  • une voie analogique, pour rentrer la valeur du PH: avec une voie analogique pour le phmètre, une autre pour les boutons de certains afficheurs LCD(le LCD KEYPAD SHIELD FOR ARDUINO - DFR0009 est populaire, a des logiciels sur un github de DFrobot -que vous connaissez) et 2 autres pour le SPI, il vous en reste 2:
    ce n'est pas un problème de rajouter un diviseur résistif (potentiomètre)

  • 3 voies logiques pour signaler que vous étalonnez sur un PH neutre, acide et pour valider...
    Le PC étant aussi un organe de sortie, il faut rajouter un écran à l'arduino (je pense que mon début d'idée ne squatte pas toutes les pattes)
    Naturellement, le dialogue sur la jonction série -qui me semble simple à comprendre- devrait être remplacé par un mode d'emploi "papier"....