Modification du fichier cpp d'une bibliothèque (capteur de conductivité)

Bonjour,

Je dispose d'une sonde conductimétrique à calibre automatique : le problème est que pour certaines manipulations, je dépasse la frontière entre les deux calibres ce qui décale un peu les courbes. J'ai donc regardé dans la bibliothèque du capteur (GitHub - DFRobot/DFRobot_EC: Arduino library for Gravity: Analog Electrical Conductivity Sensor / Meter Kit V2 (K=1.0), SKU: DFR0300) et je pense avoir trouvé les lignes correspondantes, de 62 à 79
Si j'ai bien compris, il suffirait de ne pas utiliser la partie if/else if des lignes 69 à 73.
J'aimerais toutefois quand même conserver cette partie parce que pour une bonne partie des manipulations ce n'est pas dérangeant (on se débrouille pour rester dans une seule gamme). Je me suis donc dit que je pourrais ajouter un paramètre et selon la valeur du paramètre, on prend un des deux calibres ou on conserve le calibre automatique.
Le problème est que je n'ai jamais programmé dans le fichier cpp.
Si je rajoute un paramètre "extérieur", je dois donc rajouter dans la ligne 62 un 3ème paramètre dans la fonction de lecture readEC ? Et donc par ricochet, dans mon programme Arduino, quand j'appelle la fonction commande readEC, je dois ajouter ce paramètre avec la valeur qui m’intéresse ?

Merci à vous de votre aide pour me dire si ma solution est envisageable et surtout adaptée.

Si tu ajoutes un paramètre dans une fonction d'une librairie (.cpp), il faut aussi modifier la déclaration de la fonction dans le .h de la librairie pour que la déclaration indique le bon nombre et le bon type des arguments de la fonction.
Ensuite tu pourras l'utiliser dans ton code avec l'arguments supplémentaire.
Il faudra faire attention lors d'une mise à jour de la librairie la modification sera perdue.

Ah oui, je n'aurai pas pensé à modifier le .h
Merci, ça fonctionne nickel

Salut, tu aurais le courage de poster le code (cpp et h) de la bibliothèque pour montrer les modifs?
je suis curieux de voir ton code (comme tu as dit qu'il était fonctionnel) et ça pourrait aider d'autres forumers, même si ils sont sur d'autres types de capteurs.

j'envisage par exemple de programmer un accéléromètre (33 IOT et 33 BLE) , et l'équivalent d'une chute ou d'un coup va générer des valeurs "exagérées" par rapport à un signal normal. Ca peut me faire un seuil de coupure ajustable, mais le code devra y être sensible.

Oui attention aux mises à jour surtout les automatiques.
Il y a une solution qui permet d'éviter ce risque.

Important : il n'y a aucune obligation à placer les fichiers bibliothèques dans le répertoire bibliothèque de l'IDE.
C'est juste une facilité, qui à ses avantages et ses inconvéniens.
Les fichiers cpp et h peuvent très bien être placés dans le répertoire du fichier ino et ne seront pas modifiés par une mise à jour.

Pour plus d'information consulte un tuto de programmation en C/Cpp en fichiers séparés et notament voir pourquoi il faut remplacer include<xxxxx.h> par include"xxxxx.h" pour que le compilateur aille chercher les fichiers au bon endroit.

Autre solution changer d'IDE pour platformIO qui propose par défaut de placer les bibliothèques dans le répertoire de travail et déconseille de les installer "communes" à tous les projets.

68tjs:
Important : il n'y a aucune obligation à placer les fichiers bibliothèques dans le répertoire bibliothèque de l'IDE.
C'est juste une facilité, qui à ses avantages et ses inconvéniens.
Les fichiers cpp et h peuvent très bien être placés dans le répertoire du fichier ino et ne seront pas modifiés par une mise à jour.

Merci pour l'info! j'ai eu des déboires en utilisant les onglets dans l'Arduino IDE: c'est super pratique quand tu crées la bibliothèque (elle passe par le debug du compileur, ce qui m'a bcp aidé pour corriger des petites erreurs de frappe) mais je me demandais bien pourquoi les modifs impactaient pas mes autres codes. Jusqu'à une petit visite dans le dossier, qui contenait son .ino, et les .h et .cpp que le programme avait copié depuis le dossier "libraries", et qu'il utilisait comme version de travail.

68tjs:
Pour plus d'information consulte un tuto de programmation en C/Cpp en fichiers séparés et notament voir pourquoi il faut remplacer include<xxxxx.h> par include"xxxxx.h" pour que le compilateur aille chercher les fichiers au bon endroit.

bah je me coucherai moins bête ce soir!

Bonjour,

Le fichier cpp (je n'ai rajouté que la partie readEC modifiée)

float DFRobot_EC::readEC(float voltage, float temperature, byte calibre)
{
    float value = 0,valueTemp = 0;
    this->_rawEC = 1000*voltage/RES2/ECREF;
    valueTemp = this->_rawEC * this->_kvalue;
    //automatic shift process
    //First Range:(0,2); Second Range:(2,20)
    switch(calibre){
		case 0: //calibre 0-2
		this->_kvalue = this->_kvalueLow;
		break;
		case 1: //calibre 2-20
		this->_kvalue = this->_kvalueHigh;
		break;
		case 2:
		if(valueTemp > 2.5){
			this->_kvalue = this->_kvalueHigh;
		}else if(valueTemp < 2.0){
			this->_kvalue = this->_kvalueLow;
		}
		break;
	}
    value = this->_rawEC * this->_kvalue;             //calculate the EC value after automatic shift
    value = value / (1.0+0.0185*(temperature-25.0));  //temperature compensation
    this->_ecvalue = value;                           //store the EC value for Serial CMD calibration
    return value;
}

Le fichier h

/*
 * file DFRobot_EC.h * @ https://github.com/DFRobot/DFRobot_EC
 *
 * Arduino library for Gravity: Analog Electrical Conductivity Sensor / Meter Kit V2 (K=1), SKU: DFR0300
 *
 * Copyright   [DFRobot](http://www.dfrobot.com), 2018
 * Copyright   GNU Lesser General Public License
 *
 * version  V1.01
 * date  2018-06
 */

#ifndef _DFROBOT_EC_H_
#define _DFROBOT_EC_H_

#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

#define ReceivedBufferLength 10  //length of the Serial CMD buffer

class DFRobot_EC
{
public:
    DFRobot_EC();
    ~DFRobot_EC();
    void    calibration(float voltage, float temperature,char* cmd);        //calibration by Serial CMD
    void    calibration(float voltage, float temperature);                  //calibration by Serial CMD
    float   readEC(float voltage, float temperature, byte calibre);         // voltage to EC value, with temperature compensation
    void    begin();                                                        //initialization

private:
    float  _ecvalue;
    float  _kvalue;
    float  _kvalueLow;
    float  _kvalueHigh;
    float  _voltage;
    float  _temperature;
    float  _rawEC;

    char   _cmdReceivedBuffer[ReceivedBufferLength];  //store the Serial CMD
    byte   _cmdReceivedBufferIndex;

private:
    boolean cmdSerialDataAvailable();
    void    ecCalibration(byte mode); // calibration process, wirte key parameters to EEPROM
    byte    cmdParse(const char* cmd);
    byte    cmdParse();
};

#endif

J'ai modifié le nom de la bibliothèque : je ne sais pas si cela suffit à contrer les mises à jour ? (j'ai également conservé la bibliothèque de base)

Les détails du code des autres ce n'est pas mon truc, j'ai déjà assez de mal avec le mien :grin: .

Ce que je peux néanmoins ajouter c'est que le fichier ino n'est pas le fichier qui est transmis au compilateur.
Ce qui est transmis au compilateur c'est un vrai fichier aux normes C ou Cpp avec notamment une fonction main().
Règle du C/Cpp : le compilateur doit être prévenu de l’existence d'une fonction avant que le code y fasse appel.

L'IDE arduino fait automatiquement les déclarations des fonctions pour celles qui sont dans le fichier ino.

Pour celles qui sont dans un fichier cpp il faut le faire soit même.
Et c'est fait dans le fichier *.h ( h= header = en-tête) qui est inséré au début du code.

Il faut donc que ce qui est écrit dans le fichier h reflete exactement ce qui est dans le fichier cpp.