Messages d'erreur (non bloquant) dans mon programme

Bonjour

J'ai un programme pour piloter et afficher des mesures sur un afficheur lcd.
Lorsque je le compile, j'ai des erreurs mais qui sont non bloquantes (le programme s'éxécute quand même et remplit ses fonctions) et j'aimerais les comprendre

Mon programme :

/
//Import des bibiliothèques nécessaires 
#include "DFRobot_PH.h"       
#include <EEPROM.h>          
#include <Wire.h>             //module one wire pour la mesure de température avec sonde DS18B0 
#include<LiquidCrystal_I2C.h> //bibliothèque pour l'écran lcd connecté en I2C

//Définition des connexions utilisées sur la carte Arduino
#define PH_PIN A1           //sonde pH
#define pinBoutonEnter  2   //bouton ENTER
#define pinBoutonCal  4     //bouton CAL
#define pinBoutonExit  7    //bouton EXIT

//Définitions des variables
float voltage,phValue,temperature = 25;

//Simplification des appels au module pH et à l'écran lcd
DFRobot_PH ph;
LiquidCrystal_I2C lcd(0x27, 20, 4);


//Définitions des constantes du programme
const unsigned long BAUD=115200; //flux de la liaison série
const unsigned int delai=5000; //delai entre deux mesures en millisecondes 
const byte cycles=1000;   //nombre de cycle pour la moyenne

//Définition des variables test pour les boutons de calibration
boolean lastBoutonEnter = LOW;  //variable pour connaître l'état du bouton Enter lors du dernier appui
boolean lastBoutonCal = LOW;    
boolean lastBoutonExit = LOW;   

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

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


void setup()
{
  //initialisation de la liaison série, du module pH et du lcd
  Serial.begin(BAUD);
  ph.begin();
  lcd.init(); // initialisation de l'afficheur
  
  //activation du rétro éclairage
  lcd.backlight();

  //Affichage du texte d'aide pour l'utilisateur
  lcd.setCursor(0, 0);
  lcd.print("Appuyer ETALON   ");
  lcd.setCursor(0, 1);
  lcd.print("pour etalonnage  ");
  
  //boucle pour le décompte du temps avant la prochaine action à réaliser
  int i=3;
  while (i>=0)
  {
    lcd.setCursor(0,2);
    lcd.print("Attendre ");
    lcd.setCursor(9,2);
    lcd.print(i);
    lcd.setCursor(10,2);
    lcd.print(" sec");
    delay(1000);
    i=i-1;
  }
  lcd.setCursor(0,2);
  lcd.print("                    ");    //ligne vide pour effacer le texte "Attendre X sec" après le décompte
  
}

void loop()
{
  // on teste si le bouton ENTER est pressé --> si oui, on rentre dans le mode de calibration
  etatBoutonEnter = digitalRead(pinBoutonEnter);
  if (etatBoutonEnter > lastBoutonEnter)
  {
    testBoutonEnter=1;
    ph.calibration(voltage,temperature,"ENTERPH");  // on envoie la commande ENTERPH au module pour commencer la calibration
    lcd.backlight();
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("->etalonnage pHmetre");
    lcd.setCursor(0, 1);
    lcd.print("CAL pour valider");
    lcd.setCursor(0, 2);
    lcd.print("EXIT pour quitter   ");
    int i=6;
    while (i>=0)
    {
      lcd.setCursor(0,3);
      lcd.print("Attendre ");
      lcd.setCursor(9,2);
      lcd.print(i);
      lcd.setCursor(10,2);
      lcd.print(" sec");
      delay(1000);
      i=i-1;
    }
  lcd.setCursor(0,2);
  lcd.print("                    ");
    if(lastBoutonCal == LOW)    // on  teste l'appui sur Cal après avoir  appuyé au préalable sur Enter
      while (testBoutonEnter == 1)  
      {  // on teste si le bouton CAL est pressé --> si oui, on valide l'étalonnage
        etatBoutonCal = digitalRead(pinBoutonCal);
        if (etatBoutonCal)
        {
          lcd.backlight();
          lcd.clear();
          ph.calibration(voltage,temperature,"CALPH");  // calibration process by Serail CMD
          lcd.backlight();
          lcd.setCursor(0, 0);
          lcd.print("->etalonnage reussi ");
          lcd.setCursor(0, 1);
          lcd.print("EXIT pour sauvegarde");
          lcd.setCursor(0, 2);
          lcd.print("et pour quitter     ");
          testBoutonCal=1;
        }
        if(lastBoutonExit == LOW)   
          while (testBoutonCal == 1)  
          { 
            etatBoutonExit = digitalRead(pinBoutonExit);
            if (etatBoutonExit)
            {
              lcd.backlight();
              lcd.clear();
              ph.calibration(voltage,temperature,"EXITPH");  // calibration process by Serail CMD
              lcd.backlight();
              lcd.setCursor(0, 0);
              lcd.print("->Etalonnage reussi ");
              delay(1000);
              lcd.clear();
              testBoutonEnter=0;
              testBoutonCal=0;
              break;
            }
         }
       }

   }
   else  // "else" salvateur
   {  
      etatBoutonCal = digitalRead(pinBoutonCal);
      etatBoutonExit = digitalRead(pinBoutonExit);
      if (etatBoutonExit > lastBoutonExit)
      {
         ph.calibration(voltage,temperature,"EXITPH");  // calibration process by Serail CMD
         lcd.backlight();
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.print("->Etalonnage arrete");
         delay(2000);
         lcd.clear();
         
      }
   }
   lastBoutonEnter= etatBoutonEnter;
   lastBoutonCal  = etatBoutonCal;
   lastBoutonExit = etatBoutonExit;
   
   
   float resultatph=0.0;
   static unsigned long timepoint = millis();
   if(millis()-timepoint>2000U)  //time interval: 2s
    {
      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);
      
      lcd.setCursor(0, 3);
      lcd.print("pH = ");
      lcd.setCursor(5, 3);
      lcd.print(resultatph,2);
    }
   ph.calibration(voltage,temperature);  // calibration process by Serail CMD
   delay(50);
}

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

Les erreurs non bloquantes :

U:\Documents\Arduino\test_3boutons_v3\test_3boutons_v3.ino:35:19: warning: large integer implicitly truncated to unsigned type [-Woverflow]

 const byte cycles=1000;   //nombre de cycle pour la moyenne

                   ^~~~

U:\Documents\Arduino\test_3boutons_v3\test_3boutons_v3.ino: In function 'void loop()':

U:\Documents\Arduino\test_3boutons_v3\test_3boutons_v3.ino:91:49: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

     ph.calibration(voltage,temperature,"ENTERPH");  // on envoie la commande ENTERPH au module pour commencer la calibration

                                                 ^

U:\Documents\Arduino\test_3boutons_v3\test_3boutons_v3.ino:122:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

           ph.calibration(voltage,temperature,"CALPH");  // calibration process by Serail CMD

                                                     ^

U:\Documents\Arduino\test_3boutons_v3\test_3boutons_v3.ino:140:58: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

               ph.calibration(voltage,temperature,"EXITPH");  // calibration process by Serail CMD

                                                          ^

U:\Documents\Arduino\test_3boutons_v3\test_3boutons_v3.ino:160:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

          ph.calibration(voltage,temperature,"EXITPH");  // calibration process by Serail CMD

                                                     ^

Le croquis utilise 9714 octets (30%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 871 octets (42%) de mémoire dynamique, ce qui laisse 1177 octets pour les variables locales. Le maximum est de 2048 octets.

Pouvez-vous m'aider à comprendre les erreurs trouvées et à y remédier (histoire de rendre mon programme plus propre).
Merci

Bonjour,

Tu essaies de mettre une valeur (1000) dans une constante byte qui est limitée à 255
Utilises un unsigned int

const unsigned cycles=1000;   //nombre de cycle pour la moyenne

Bonsoir

Effectivement, en changeant le type de donnée, ça fonctionne pour la première erreur.
Il me reste les erreurs liées aux caractères

Pour les autres, il faut fournir des char
Essaye de définir dans l'en-tête trois tableaux de caractères comme ceci

char Enter[] ="ENTERPH" ;
char Cal[] ="CALPH" ;
char Exit[] ="EXITPH" ;

Ensuite tu remplaces les textes par les variables qui les contiennent

ph.calibration(voltage,temperature,Exit);

Les autres erreurs sont dues a une mauvaise définition de la fonction calibration() dans la librairie. Le dernier paramètre devrait être déclaré comme 'const char *'.

Pour s'affranchir de ça tu peux caster le paramètre en char *

   ph.calibration(voltage,temperature,(char *)"ENTERPH");  // on envoie la commande ENTERPH au module pour commencer la calibration

Bonjour

Merci pour ces deux solutions qui marchent toutes les deux : j'ai l'embarras du choix !
Une petite demande de précision que signifie char * ou dis autrement, quel est l'intérêt de rajouter * après char ? et pourquoi doit-on mettre des parenthèses pour spécifier char * ?

  • c'est pour indiquer que c'est un pointeur (c'est a dire une adresse) et les parenthèses c'est une notation pour un opérateur de cast qui sert à convertir le type d'une expression.